본문 바로가기

개념 정리/Java

[JAVA] 파일 읽기, 쓰기, File 클래스

1. 스트림

- 데이터를 전송하는 소프트웨어 모듈. 
- 스트림의 양 끝에는 입출력 장치, 자바 응용프로그램이 연결됨.
- 단방향
- 기본단위는 바이트 / 문자

2. 문자 스트림

- 2바이트 유니코드 문자 단위로 입출력하는 스트림

 

[FileReader 이용해 텍스트 파일 읽기]

1. 파일 입력스트림 생성

· FileReader

파일 입력 스트림 생성, 스트림과 파일 연결

FileReader fin = new FileReader("c:\\test.txt");	// 파일 입력스트림 생성, 스트림-파일 연결

 

2. 파일 읽기

· read()

: 파일로부터 문자 하나를 읽어 int타입으로 리턴. 파일의 끝을 만나면 -1 리턴

int c;
while((c = fin.read()) != -1) {		// 문자 하나를 c에 읽어옴. 파일 끝까지 반복
    System.out.println((char)c);
}
// 파일이 큰 경우, 속도가 느림

 

↓ 한 번에 한 블록(버퍼크기)만큼 읽는 방법

char [] buf = new char [1024];
while(true){
    int n = fin.read(buf);	// 한 번에 1024개 문자를 읽어 buf[]에 저장.
				// 파일에 남아있는 문자 수가 1024개보다 작을 때, 실제로 읽은 문자의 개수 리턴
	if(n < buf.length) break;	// n < 1024이면 파일의 끝까지 읽었다고 판단. 
}

 

3. 스트림 닫기

fin.close();

 

[파일 입출력 예외처리]

try {
    FileReader fin new FileReader("c:\\test.txt");
    int c = fin.read();
    fin.close();
} catch(IOException e) {
	System.out.println("입출력 오류");
}

 

[InputStreamReader을 이용해 텍스트파일 읽기]

- 바이트 데이터를 문자 집합을 통해 문자로 변환.

- 파일에서 바이트를 읽고, 읽어들인 바이트들이 문자집합에 정의된 문자인지 찾아 문자 리턴

 

1. 문자 입력스트림 생성

· InputStreamReader

바이트 파일 입력스트림 생성 후, InputStreamReader 객체 생성.

FileInputStream fin = new FileInputStream("c:\\test.txt");	// 바이트 파일 입력스트림 생성
InputStreamReader in = new InputStreamReader(fin, "MS949");	// MS949는 윈도우 디폴트 문자집합

 

2. 파일 읽기

FileReader로 읽을 때와 같음. (in.read())

 

[FileWriter 이용해 텍스트 파일 쓰기]

1. 파일 출력 스트림 생성

· FileWriter

- 파일을 열어 스트림과 연결.

- 파일 없을 경우 빈 파일 생성, 파일 있을 경우 파일 내용 지우고 파일 처음부터 쓰도록 함

FileWriter fout = new FileWriter("c:\\test.txt");	// 출력스트림 생성

 

2. 파일 쓰기

· write()

: 문자 단위로 파일에 저장

fout.write('a');	// 문자 'a'를 파일에 저장
fout.write("abc");	// 문자열 "abc"를 파일에 저장

 

↓ 한 번에 한 블록씩 쓰기

char [] buf = new char[1024];
fout.write(buf, 0, buf.length);	// buf[]배열 처음부터 배열크기만큼 쓰기. buf에 문자 입력하기

 

3. 스트림 닫기

fout.close();

3. 바이트 스트림

- 바이너리 데이터 다루는 스트림.
- 이미지/동영상 파일, 문자로 구성된 텍스트파일 입출력

 

[FileInputStream 이용한 바이너리 파일 읽기]

1. 파일 입력 스트림 생성

파일을 찾아 열고, 파일을 연결한 스트림 fin 생성

FileInputStream fin = new FileInputStream("c:\\test.out");

 

2. 파일 읽기

· read()

byte b[] = new byte[6];
fin.read(b);	// 배열 b의 크기만큼 바이트 읽기

// while문 이용:
int n=0, c;
while((c = fin.read()) != -1) {
    b[n] = (byte)c;		// 읽은 바이트를 배열에 저장
    n++;
}

 

3. 스트림 닫기

fin.close();

 

[FileOutputStream 이용한 바이너리 파일 쓰기]

1. 파일 출력 스트림 생성

파일 생성해 스트림 연결. 파일이 이미 있으면 내용 지우고 연결

FileOutputStream fout = new FileOutputStream("c:\\test.out");

 

2. 파일 쓰기

· write()

byte b[] = {1,4,-5};
fout.write(b);	// 배열 b[]의 바이트 모두 파일에 저장

// for문 이용해서 쓰기:
for(int i=0; i<b.length; i++)
    fout.write(b[i]);	// 배열 b[]의 바이트를 바이너리 그대로 파일에 저장. 한바이트씩

 

3. 스트림 닫기

fout.close();

4. 버퍼 입출력

- 버퍼 입력 스트림: 입력된 데이터를 버퍼에 모아서 한번에 프로그램으로 보냄
- 버퍼 출력 스트림: 프로그램에서 출력한 데이터를 버퍼에 모아서 한번에 출력장치에 출력

 

[버퍼 출력 스트림 생성]

* 바이트 버퍼 출력 스트림 : BufferedOutputStream()
* 문자 버퍼 출력 스트림 : BufferedWriter()

BufferedOutputStream bout = new BufferedOutputStream(System.out, 20);	// 20바이트 크기 버퍼

// BufferedOutputStream은 바이트 단위. 한글은 2바이트이므로 한글 출력하려면
BufferedWriter bout = new BufferedWriter(new OutputStreamWriter(System.out), 5);

 

[스트림 출력]

↓ 파일을 읽은 뒤, 버퍼 출력 스트림 통해 화면에 출력

FileReader fin = new FileReader("c:\\system.ini");
int c;
while((c=fin.read()) != -1){
    bout.write((char)c);	// 읽은 문자를 버퍼 출력 스트림에 씀.
}

 

[버퍼에 남아있는 데이터 출력]

버퍼스트림은 버퍼가 꽉 찼을 때만 출력됨. 

버퍼에 있는 데이터 강제 출력하려면 flush()

bout.flush();

 

[스트림 닫기]

bout.close();	// 버퍼 스트림 닫기
fin.close();	// 파일 입력 스트림 닫기

5. File 클래스

- 입출력 기능은 없음. 입출력은 위의 FileInputStream, FileReader 등을 사용해야 함.
- 파일 / 디렉토리 속성 정보 (경로명, 크기, 타입, 수정 날짜 등) 제공
- 파일 관리 작업 (파일 삭제, 이름 변경, 디렉토리 생성, 디렉토리 내 파일 리스트 제공)

 

[File 객체 생성]

File f = new File("c:\\temp\\test.txt");	// File 객체 생성
File f = new File("c:\\temp","test.txt");	// 디렉터리와 파일명 나누어 전달

 

[File 클래스 메소드]

· mkdir() : 새로운 디렉터리 생성

· length() : 파일/디렉터리 크기 리턴 (바이트단위)

· getName() : 파일명 리턴. ex) "system.ini"

· getPath() : 완전경로명 리턴. ex) "c:\\windows\\system.ini"

· getParent() : 부모디렉터리 리턴. ex) "c:\\windows"

· isFile() : 파일 타입인지 판별

· isDirectory() : 디렉터리 타입인지 판별

· list() : 파일과 서브디렉터리 리스트를 문자열 배열(String[])로 리턴

· listFiles() : 파일과 서브디렉터리 리스트를 File[] 배열로 리턴

 

 

명품 JAVA Programming 참고