
File class
Files class
Stream
Data Representation Formats
Operating system에서 file은 저장 장치에 저장된 연속적인 데이터의 집합
이름과 경로를 통해 식별
유닉스 계열 파일 시스템에서 파일의 메타데이터(파일 크기, 소유자, 접근 권한, 데이터 블록 주소 등)를 저장하는 자료 구조
파일 이름이 아닌 i-node 번호로 파일을 식별하며 실제 데이터 블록의 위치를 간접적으로 관리
파일이나 디렉토리에 대한 경로 정보를 추상화한 클래스로 파일 존재 여부, 생성, 삭제, 그리고 속성 조회 등의 작업을 지원
실제 파일의 내용을 읽거나 쓰는 기능은 없고 파일 시스템의 경로와 속성을 제어하는 용도
boolean createNewFile() 새로운 파일 생성
boolean mkdir() 새로운 디렉토리 생성
boolean mkdirs() 경로 상에 없는 모든 디렉토리 생성
boolean delete() 파일 또는 디렉토리 삭제
boolean canExcute() 실행할 수 있는 파일인지 여부 반환
boolean canRead() 읽을 수 있는 파일인지 여부 반환
boolean canWrite() 수정 및 저장할 수 있는 파일인지 여부 반환
String getName() 파일 이름 반환
String getParent() 부모 디렉토리 이름 반환
File getParentFile() 부모 디렉토리를 File 객체로 생성 후 반환
String getPath() 전체 경로 반환
boolean isDirectory() 디렉토리인지 여부 반환
boolean isFile() 파일인지 여부 반환
boolean isHidden() 숨김 파일인지 여부 반환
long lastModified() 마지막 수정 날짜 및 시간 반환
long length() 파일 크기 반환
String[] list() 디렉토리 포함 파일 목록을 String 배열로 반환
String[] list(FilenameFilter filter) 디렉토리에 포함된 파일 및 서브 디렉토리 목록 중 FilenameFilter에 맞는 것만 String 배열로 반환
File[] listFiles() 디렉토리에 포함된 파일 및 서브 디렉토리 목록 전부 File 배열로 반환
File[] listFile(FilenameFilter filter) 디렉토리에 포함된 파일 및 서브 디렉토리 목록 중 FilenameFilter에 맞는 것만 File 배열로 반환
Java NIO 패키지(java.nio.file.Files)에 포함된 정적 유틸리티 클래스
읽기, 쓰기 등의 고수준 파일 입출력 작업을 수행
Path 객체와 함께 사용되며 스트림 기반 파일 처리 및 속성 접근 기능도 제공
Path createFile(Path) 새 파일 생성
Path createDirectory(Path) 새 디렉토리 생성
Path createTempFile(...) 임시 파일 생성
byte[] readAllBytes(Path) 모든 바이트 읽기
List<String> readAllLines(Path) 라인 단위 텍스트 읽기
Path write(Path, byte[]/List<String>) 데이터 쓰기
Path copy(Path, Path, CopyOption...) 파일 복사
Path move(Path, Path, CopyOption...) 파일 이동 또는 이름 변경
파일 삭제
void delete(Path) 파일 또는 디렉토리 삭제
boolean deleteIfExists(Path) 존재 시 삭제
boolean exists(Path) 경로 존재 여부 확인
boolean isDirectory(Path) 디렉토리 여부 확인
boolean isRegularFile(Path) 일반 파일 여부 확인
long size(Path) 파일 크기 확인 (byte 단위)
boolean isSameFile(Path, Path) 동일 파일인지 비교
FileTime getLastModifiedTime(Path) 마지막 수정 시간 확인
UserPrincipal getOwner(Path) 파일 소유자 확인
컴퓨터 내부 또는 외부 장치와 프로그램 간의 데이터를 주고 받는 것
일반적으로 장치와 입출력을 위해서는 하드웨어 장치에 직접 접근이 필요하며 다양한 매체에 존재하는 데이터들을 사용하기 위해 Java에서는 입출력 데이터를 처리할 공통적인 방법으로 Stream 활용
데이터의 흐름을 추상화한 개념으로 입력과 출력 작업을 효율적으로 처리하는 I/O 모델
모든 스트림은 단방향이며 각각의 장치마다 연결할 수 있는 스트림 존재
하나의 스트림으로 입출력을 동시에 수행할 수 없으므로 동시에 수행하려면 항상 2개의 스트림 필요
자바에서 바이트 기반 입력을 처리하기 위한 추상 클래스
파일, 네트워크, 메모리 등에서 바이트 단위로 데이터를 읽는 데 사용
FileInputStream, BufferedInputStream, DataInputStream
int read() 입력 스트림으로부터 1바이트를 읽고 읽은 바이트 반환
int read(byte[] b) 입력 스트림으로부터 읽은 바이트들을 매개 값으로 주어진 바이트 배열 b에 저장 후 실제로 읽은 바이트 수 반환
int read(byte[] b, int off, int len) 입력 스트림으로부터 len개의 바이트만큼 읽고 매개 값으로 주어진 바이트 배열 b[off]부터 len개까지를 저장, 그리고 실제로 읽은 바이트 수인 len개 반환, 만약 len개를 모두 읽지 못 하면 실제로 읽은 바이트 수 반환
void close() 사용한 시스템 자원 반납 후 입력 스트림을 닫음
자바에서 바이트 기반 출력을 위한 추상 클래스
파일, 네트워크, 메모리 등으로 데이터를 바이트 단위로 출력할 때 사용
FileOutputStream, BufferedOutputStream, DataOutputStream, PrintStream
void write(int b) 출력 스트림으로 1바이트를 보냄
void write(byte[] b) 출력 스트림에 매개 값으로 주어진 바이트 배열 b의 모든 바이트를 보냄
void write(byte[] b, int off, int len) 출력 스트림에 매개 값으로 주어진 바이트 배열 b[off]부터 len개까지의 바이트를 보냄
void flush() 버퍼에 잔류하는 모든 바이트 출력
void close() 사용한 시스템 자원 반납 후 출력 스트림을 닫음
문자 기반 입력 스트림의 최상위 추상 클래스
파일, 네트워크, 메모리 등에서 문자 단위로 데이터를 읽을 때 사용
Reader 계열의 하위 클래스는 생성자에 문자열 인코딩 관련 생성자를 가짐
FileReader, InputStreamReader, BufferedReader
int read() 입력 스트림으로부터 한 개의 문자를 읽고 반환
int read(char[] c) 입력 스트림으로부터 읽은 문자들을 매개 값으로 주어진 문자 배열 c에 저장하고 실제로 읽은 문자 수 반환
int read(char[] c, int off, int len) 입력 스트림으로부터 len개의 문자만큼 읽고 매개 값으로 주어진 문자 배열 c[off]부터 len개까지 저장, 실제로 읽은 문자 수인 len개 반환
void close() 사용한 시스템 자원 반납 후 입력 스트림을 닫음
문자 기반 출력 스트림의 최상위 추상 클래스로
파일, 네트워크, 메모리 등에 문자 단위로 데이터를 출력할 때 사용
Writer 계열의 하위 클래스는 생성자에 문자열 인코딩 관련 생성자를 가짐
FileWriter, OutputStreamWriter, BufferedWriter, PrintWriter
void write(int c) 출력 스트림으로 매개 값이 주어진 한 문자를 보냄
void write(char[] c) 출력 스트림에 매개 값으로 주어진 문자 배열 c의 모든 문자를 보냄
void write(char[] c, int off, int len) 출력 스트림에 매개 값으로 주어진 문자 배열 c[off]부터 len개까지의 문자 보냄
void write(String str) 출력 스트림에 매개 값으로 주어진 문자열을 보냄
void write(String str , int off, int len) 츨력 스트림에 매개 값으로 주어진 문자열 off순번부터 len개의 문자열을 보냄
void flush() 버퍼에 잔류하는 모든 문자열 출력
void close() 사용한 시스템 자원 반납 후 출력 스트림을 닫음
파일로 부터 바이트 단위로 읽을 때 사용하는 클래스
이미지, 오디오, 비디오, 텍스트 파일 등 모든 종류의 파일 읽기 가능
→ InputStream의 하위 클래스로 InputStream과 사용 방법 동일
FileInputStream fis = new FileInputStream("C:/data/test.txt");
파일이 존재하지 않으면 FileNotFoundException이 발생하므로 예외 처리 필수
파일에 바이트 단위로 저장할 때 사용하는 클래스
이미지, 오디오, 비디오, 텍스트 파일 등 모든 종류의 데이터를 파일로 저장 할 때 활용
→ OutputStream의 하위 클래스로 OutputStream과 사용 방법 동일하다.
FileOutputStream fos = new FileOutputStream("C:/data/test.txt");
파일이 존재하지 않으면 자동으로 생성하지만, 이미 파일이 존재하는 경우 파일을 덮어쓰는 현상 발생
만일 기존 파일에 이어서 계속 작성하고 싶다면 아래 코드처럼 가능
FileOutputStream fos = new FileOutputStream("C:/data/test.txt", true);
텍스트 파일로부터 문자 단위로 읽을 때 사용하는 클래스
텍스트가 아닌 파일은 읽기 불가능
→ Reader의 하위 클래스로 Reader와 사용 방법 동일
FileReader fr = new FileReader("C:/data/test.txt");
FileReader fr = new FileReader(new File("C:/data/test.txt"));
파일이 존재하지 않으면 FileNotFoundException이 발생하므로 예외 처리 필수
텍스트 파일로부터 문자 단위로 저장할 때 사용하는 클래스
텍스트가 아닌 파일은 저장 불가능
→ Writer의 하위 클래스로 Writer와 사용 방법 동일
FileWriter fw = new FileWriter("C:/data/test.txt");
만약 파일이 존재하지 않으면 자동으로 생성하지만 이미 파일이 존재하는 경우 파일을 덮어쓰는 현상 발생
만일 기존 파일에 이어서 계속 작성하고 싶다면 아래 코드처럼 가능
FileWriter fw = new FileWriter("C:/data/test.txt", true);
FileInputStream 바이트 입력 스트림 (파일에서 읽기)new FileInputStream(String name)new FileInputStream(File file)FileOutputStream 바이트 출력 스트림 (파일에 쓰기), append는 기존 파일에 추가 할 때 활용new FileOutputStream(String name)new FileOutputStream(String name, boolean append)new FileOutputStream(File file)new FileOutputStream(File file, boolean append)FileReader 문자 입력 스트림 (텍스트 파일 읽기), Charset은 StandardCharsets.UTF_8 또는 Charset.forName("UTF-8")로 설정new FileReader(String name)new FileReader(String name, Charset charset)new FileReader(File file)new FileReader(File file, Charset charset)FileWriter 문자 출력 스트림 (텍스트 파일 쓰기), Charset은 StandardCharsets.UTF_8 또는 Charset.forName("UTF-8")로 설정, append는 기존 파일에 추가 할 때 활용new FileWriter(String name)new FileWriter(String name, boolean append)new FileWriter(String name, Charset charset)new FileWriter(String name, Charset charset, boolean append)new FileWriter(File file)new FileWriter(File file, Charset charset)new FileWriter(File file, Charset charset, boolean append)기본 스트림에 기능을 덧붙여 확장하는 스트림
단독으로 사용하지 않고 기본 스트림을 감싸서 사용하며 버퍼링, 변환 그리고 필터링 등의 기능을 제공
성능 향상이나 추가 기능 구현을 위해 자주 활용
BufferedInputStream / BufferedOutputStream 버퍼를 사용해 I/O 효율 향상 (바이트 기반), 성능 향상 이점이 존재하여 무조건 활용
BufferedReader / BufferedWriter 버퍼 사용 + 라인 단위 처리 지원 (문자 기반), 성능 향상 이점이 존재하여 무조건 활용
InputStreamReader / OutputStreamWriter 바이트 ↔ 문자 변환 (인코딩 처리 가능), 네트워크 소켓은 바이트지만 문자로 변환 할 때 활용
DataInputStream / DataOutputStream 기본 자료형 단위 (int, double 등) 읽기/쓰기 지원
ObjectInputStream / ObjectOutputStream 객체 직렬화 입출력 지원 (Serializable 필요) → 자바에서 밀었지만, 현업에선 사용 안됨
FilterInputStream / FilterOutputStream 다른 보조 스트림의 상위 클래스 (직접 확장 가능)
LineNumberReader 읽은 줄 수(line number) 추적 가능
PushbackReader / PushbackInputStream 한 글자 밀어넣기 기능 (되돌려 읽기)
PrintWriter 편리한 텍스트 출력 지원 (println() 등 제공), System.out이 해당 객체
바이트 스트림(InputStream)을 문자 스트림(Reader)으로 변환하는 스트림
문자열 인코딩을 지정하여 바이트 데이터를 문자열로 변환이 가능하도록 도움
new InputStreamReader(InputStream in)
new InputStreamReader(InputStream in, Charset charset)
new InputStreamReader(InputStream in, String charsetName)
문자 스트림을 바이트 스트림으로 변환해주는 브릿지 스트림
문자 인코딩을 지정하여 문자열을 원하는 문자셋으로 파일이나 네트워크에 출력할 수 있음
new OutputStreamWriter(OutputStream out) 플랫폼 기본 인코딩 사용
new OutputStreamWriter(OutputStream out, Charset charset) Charset 객체로 인코딩 직접 지정
new OutputStreamWriter(OutputStream out, String charsetName) 문자열로 인코딩 지정 (예외 발생 가능)
내부에일정 크기의 버퍼를 사용해 입출력 횟수를 줄여 성능을 향상시키는 스트림
성능 향상이 비약적으로 향상됨
new BufferedInputStream(InputStream in) 기본 버퍼 크기 사용 (8192 bytes)
new BufferedInputStream(InputStream in, int size) 사용자 정의 버퍼 크기 설정 가능
new BufferedReader(Reader in) 기본 버퍼 크기 사용 (8192 chars)
new BufferedReader(Reader in, int size) 사용자 정의 버퍼 크기 설정 가능
new BufferedOutputStream(OutputStream out) 기본 버퍼 크기 사용
new BufferedOutputStream(OutputStream out, int size) 사용자 정의 버퍼 크기 설정 가능
new BufferedWriter(Writer out) 기본 버퍼 크기 사용
new BufferedWriter(Writer out, int size) 사용자 정의 버퍼 크기 설정 가능
// BufferedInputStream 기본 사용
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("file.dat"));
// BufferedReader 기본 사용
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
// 사용자 지정 버퍼 크기
BufferedReader br2 = new BufferedReader(new FileReader("file.txt"), 16384);
// 기본 버퍼 사용
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("file.dat"));
BufferedWriter bw = new BufferedWriter(new FileWriter("file.txt"));
// 사용자 지정 버퍼 크기 사용
BufferedOutputStream bos2 = new BufferedOutputStream(new FileOutputStream("file.dat"),
16384);
BufferedWriter bw2 = new BufferedWriter(new FileWriter("file.txt"), 16384);
기본 자료형 별로 데이터를 읽고 쓰는 기능을 제공하는 스트림
입력된 자료형의 순서와 출력될 자료형의 순서가 일치해야함
boolean readBoolean(), writeBoolean(boolean v) 등
객체를 파일 또는 네트워크로 입출력 할 수 있는 기능을 제공하는 스트림
객체는 문자가 아니므로 바이트 기반 스트림으로 데이터를 변경해주는 직렬화 필수
→ 한때 java에선 유행했지만 지금은 json 범용성에 밀려 자주 사용되지 않는 스트림
writeObject(Object obj) 객체를 직렬화하여 출력 스트림에 기록
writeInt(int v), writeDouble(double v) 등 기본형 자료도 출력 가능
readObject() 직렬화된 객체를 역직렬화 하여 읽음
readInt(), readDouble() 등 기본형 자료 읽기 가능
Serializable 인터페이스를 구현한 객체를 직렬화할 때, private 필드를 포함한 모든 필드를 바이트로 변환하여 이를 파일이나 네트워크로 전송 가능하게 함
직렬화된 바이트 데이터를 원래의 객체로 복원하는 것이 역직렬화
데이터를 키-밸류 쌍으로 표현하는 가벼운 텍스트 기반의 데이터 포맷
자바에서는 Jackson(스프링 내장), Gson, org.json과 같은 라이브러리를 통해 파싱과 포맷팅
데이터를 태그 기반 구조로 표현하는 마크업 언어
HTML과 유사하지만 태그 기반의 확장성이 높은 언어
잘 안쓴다
데이터를 쉼표로 구분하여 표현하는 가장 단순한 텍스트 기반 데이터 포맷
주로 엑셀, 데이터베이스, 통계 툴 등에서 데이터를 테이블 형태로 저장하거나 교환할 때 사용
→ DB 백업, 로그 저장, 빅데이터 분석 시 가장 많이 활용되는 포맷으로 생각보다 많이 쓰임