Language/JAVA

[JAVA] 문자(Text) 스트림, 버퍼(Buffer) 스트림, File 클래스 | Yoon's Dev

Yooniron 2021. 4. 26. 21:26

문자(Text) 스트림, 버퍼(Buffer) 스트림, File 클래스

 



1. 문자 스트림

 

■ 문자 스트림

✓ 문자 스트림 연관 클래스

 

문자 스트림 연관 클래스

 

✓ Writer 클래스와 Reader 클래스

  . 문자 스트림의 입출력에 필요로 되는 다양한 메서드를 제공하는 추상 클래스

 

- Writer 클래스의 주요 메서드

메서드 설명
void close() 출력 스트림을 닫기
void flush() 출력 버퍼에 저장된 모든 데이터를 출력장치로 전송
void write(int c) c의 하위 16비트를 스트림으로 출력
void write(char buffer[]) buffer 배열에 있는 문자들을 스트림으로 출력
void write(char buffer[], int index, int size) buffer 배열의 index부터 size만큼의 문자들을 스트림으로 출력
void write(String s) 문자열 s를 스트림으로 출력
void write(String s, int index, int size) 문자열 s의 index부터 size 만큼의 문자들을 스트림으로 출력

- Reader클래스의 주요 메서드

void close() 입력 스트림을 닫기
int read() 다음 문자를 읽어 반환, 입력 스트림에 읽을 문자가 없을 때는 대기, 읽은 문자가 파일의 끝이면 -1을 반환
int read(char buffer[]) buffer 크기만큼 문자를 읽어 buffer에 저장
int read(char buffer[], int offset, int numChars) numChars에 지정한 만큼의 문자를 읽어 buffer의 offset 위치에 저장하고 읽은 문자의 개수를 반환
void mark(int numChars) 입력 스트림의 현재 위치에 마크
boolean markSupported() 현재의 입력 스트림이 mark()와 reset()를 지원하는지의 여부 반환
boolean ready() 다음 read()문을 수행할 수 있는지의 여부 반환
void reset() 입력 스트림의 입력 시작 부분을 현재의 위치에서 가장 가까운 이전 mark 위치로 설정
int skip(long numChars) numChar로 지정된 문자수 만큼 건너뛰고 건너 뛴 문자수를 반환
String readLine() BufferedReader 클래스의 메서드로 문자열을 한 줄 읽기

 

 


2. 파일 문자 스트림

 

■ 문자 스트림

✓ 파일 문자 스트림

 

- FileReader의 생성자

생성자 설명
FileReader(File file) file에 지정된 파일로부터 읽는 FileReader 생성
FileReader(String name) name 이름의 파일로부터 읽는 FileReader 생성

- FileReader의 주요 메서드

메서드 설명
int read() 한 개의 문자를 읽어 정수형으로 리턴
int read(char[] cbuf) 최대 cbuf 배열의 크기만큼 문자들을 읽어 cbuf 배열에 저장, 만일 읽는 도중 EOF를 만나면 실제 읽은 문자 개수 리턴
int read(char[] cbuf, int off, int len) 최대 len 크기만큼 읽어 cbuf 배열의 off부터 저장, 읽는 도중 EOF를 만나면 실제 읽은 문자 개수 리턴
String getEncoding() 스트림이 사용하는 문자 집합의 이름 리턴
void close() 입력 스트림을 닫고 관련된 시스템 자원 해제

 

 

- FileWriter의 생성자

생성자 설명
FileWriter(File file) file에 데이터를 저장할 FileWriter 생성
FileWriter(String name) name 파일에 데이터를 저장할 FileWriter 생성
FileWriter(File file, boolean append) FileWriter를 생성하며, append가 true이면 파일의 마지막 부터 데이터 저장
FileWriter(String name, boolean append) FileWriter를 생성하며, append가 true이면 파일의 마지막부터 데이터 저장

 

- FileWriter의 주요 메서드

메서드 설명
void write(int c) c를 char로 변환하여 한 개의 문자 출력
void write(String str, int off, int len) 인덱스 off부터 len개의 문자를 str 문자열에서 출력
void write(char[] buf, int off, int len) 인덱스 off부터 len개의 문자를 배열 cbuf에서 출력
void flush() 스트림에 남아 있는 데이터 모두 출력
String getEncoding() 스트림이 사용하는 문자 집합의 이름 리턴
void close() 출력 스트림을 닫고 관련된 시스템 자원 해제

 

 

■ 문자 스트림으로 텍스트 파일 읽기

✓ 텍스트 파일을 읽기 위해 문자 스트림 FileReader 클래스 이용

 1. 파일 입력 스트림 생성(파일 열기) // 스트림을 생성하고 파일을 열어 스트림과 연결

1
FileReader fin = new FileReader("파일경로");
cs

 2. 파일 읽기  // read()로 문자 하나씩 파일에서 읽기

1
FileReader fin = new FileReader("파일경로");
cs

 

 3. 스트림 닫기 // 스트림이 더 이상 필요 없으면 닫아야 함, 닫힌 스트림에서는 읽을 수 없음 close()

1
fin.close();
cs

 

■ 문자 스트림으로 텍스트 파일 쓰기

✓ 텍스트 파일을 쓰기 위해 문자 스트림 FileWriter 클래스 이용

 1. 파일 출력 스트림 생성(파일 열기) // 스트림을 생성하고 파일을 열어 스트림과 연결

1
FileWriter fout = new FileWriter("파일경로");
cs

 2. 파일 쓰기 // write()로 문자 하나 씩 파일에 기록

1
fout.write('A');
cs

// 블록 단위로 쓰기 가능

1
2
char buf = new char[1024];
fout.write(buf, 0, buf.length); // buf[0]부터 버퍼 
cs

3. 스트림 닫기 // close()로 스트림 닫기

1
fin.close();
cs

 

3. 버퍼 스트림

 

디스크에서 한번 읽을 때 왕창 읽어 놓고 버퍼(buffer)라는 데이터를 저장하는 창고에 넣어 두었다가 필요할 때 하나씩 꺼내 쓰는 것, 다 떨어지면 디스크에서 다시 읽는다.

 

■ 버퍼 스트림

✓ BufferedWriter 클래스와 BufferedReader 클래스

 

□ 버퍼 스트림의 종류

✓ 바이트 스트림

   . 바이트 단위의 바이너리 데이터를 처리하는 버퍼 스트림

   . BufferedInputStream과 BufferedOutputStream

문자 스트림

   . 유니코드의 문자 데이터만을 처리하는 버퍼 스트림

   . BufferedReader와 BufferedWriter

 

□ BufferedWriter 클래스

✓ Writer 클래스의 하위 클래스

✓ 문자 스트림의 출력 시 버퍼를 사용

✓ 생성자

  BufferedWriter(Writer outputStream)

  BufferedWriter(Writer outputStream, int bufSize)

 

outputStream: Writer 타입의 객체, 출력 스트림을 의미

bufSize: 버퍼의 크기를 지정, 지정하지 않으면 묵시적인 크기의 버퍼 사용

 

✓ 메서드

   void newLine() throws IOException // 새로운 라인에 출력

 

□ BufferedReader 클래스

✓ Reader 클래스의 하위 클래스

문자 스트림의 입력 시 버퍼를 사용

 생성자

   BufferedReader(Reader inputStream)

   BufferedReader(Reader inputStream, int bufSize)

 

inputStream: Reader 타입의 객체로서 입력 스트림을 의미

bufSize: 버퍼의 크기 지정

 

✓ 메서드

   void readLine() throws IOException // 한 라인을 읽어 온다.

 


■ 버퍼 입출력(Buffered I/O)

✓ 버퍼 입출력은 입출력 장치와 프로그램 사이에 버퍼를 두어 효율적으로 입출력 처리

프로그램의 실행 속도와 입출력 장치의 데이터 처리 속도의 불일치에 대처하기 쉽다.

 

 


 

4. File 클래스

 

■ File 클래스

✓ 파일의 경로명 및 속성을 다루는 클래스

   . java.io.File

   . 파일과 디렉터리 경로명의 추상적 표현

파일 이름 변경, 삭제, 디렉터리 생성, 크기 등 파일 관리

File 객체에는 파일 읽기/쓰기 기능 없음

  . 파일 입출력은 파일 입출력 스트림 이용

File 객체와 스트림을 연결하여 파일 접근


 

○File 객체 생성

 

생성자에 파일 경로명을 주어 File 객체 생성

1
File f = new File("파일경로 + 파일명");
cs

✓ 디렉터리와 파일명을 나누어 생성자 호출

1
File f = new File("파일경로""파일 이름");
cs

 

- File 클래스의 생성자

메서드 설명
File(File parent, String child) parent 디렉터리에 child 이름의 디렉터리나 파일을 나타내는 File 객체 생성
File(String pathname) pathname의 완전 경로명이 나타내는 File 객체 생성
File(String parent, String child) parent 디렉터리에 child 이름의 디렉터리나 파일을 나타내는 FIle 객체 생성
File(URI uri) file:URI를 추상 경로명으로 변환하여 FIle 객체 생성

 

- File 클래스의 주요 메서드

메서드

설명

boolean() mkdir

새로운 디렉터리 생성

String[] list()

디렉터리 내의 파일과 서브 디렉터리 리스트를 문자열 배열로 리턴

File [] listFiles()

디렉터리 내의 파일과 서브 디렉터리 리스트를 File [] 배열로 리턴

boolean renameTo(Fiile dest)

dest가 지정하는 경로명으로 파일 이름 변경

boolean delete()

파일 또는 디렉터리 삭제

long length()

파일의 크기 리턴

String getPath()

경로명 전체를 문자열로 변환하여 리턴

String getParent()

파일이나 디렉터리의 부모 디렉터리 이름 리턴

String getName()

파일 또는 디렉터리 이름을 문자열로 리턴

boolean isFile()

일반 파일이면 true 리턴

boolean isDirectory()

디렉터리이면 true 리턴

long lastModified()

파일이 마지막으로 변경된 시간 리턴

boolean exists()

파일 또는 디렉터리가 존재하면 true 리턴

 

■ File 클래스 활용

파일 크기

1
long size = f.length();
cs

 

 파일 경로명

1
2
3
4
File f = new File("파일경로\\파일명");
String filename = f.getName(); //파일명
String path = f.getPath(); // 파일경로+파일명
String parent = f.getParent(); // 파일경로 부모폴더
cs

 파일 타입

1
2
3
4
5
if(f.isFile())
    System.out.println(f.getPath() + "는 파일입니다."); //파일
else if(f.isDirectory())
    System.out.println(f.getPath() + "는 디렉터리입니다."); // 디렉터리
 
cs

✓ 디렉터리 파일 리스트 얻기

1
2
3
4
5
6
7
File f = new File("파일디렉터리")
File[] subfiles = f.listFiles(); // 디렉터리의 파일 및 서브 디렉터리 리스트 얻기
 
for(int i=0; i<filenames.length; i++) {
    System.out.print(subfiles[i].getName(); // 서브 파일명 출력
    System.out.print("\t파일 크기: " + subfiles[i].length()); //서브 파일크기 
}
cs