-
java.io.FileReader / java.io.FileWriter 메소드 - 문자 스트림카테고리 없음 2020. 10. 27. 15:08
[ 기본 스트림 클래스들 ]
- 기본 스트림 : 외부 데이터와 직접 연결되는 스트림(통로)를 생성함
- 바이트 스트림(Btye Stream) : 1byte 단위로 데이터 입출력 수행
- └ InputStream(입력 스트림) / OutputStream(출력 스트림)
- 문자 스트림(Character Stream) : 문자 단위(2byte)로 데이터 입출력 수행
- └ Reader(입력 스트림) / Writer(출력 스트림)
바이트 스트림은 byte 단위로, 문자 스트림은 문자 단위로 데이터 입출력을 진행합니다.
문자 단위의 변환 처리를 해야하니 속도는 바이트 스트림이 빠르지만 한글과 같이 2byte 이상으로 이루어진 문자는 바이트 스트림으로
다루기 어렵기 때문에 문자 스트림을 사용하면 편리합니다.
[ 생성자 ]
- new FileIReader(File file)
- new FileReader(FileDescriptor jdObj)
- new FileReader(String name)
생성자는 FileInputStream과 동일합니다. 파일의 주소와 이름 정보를 가진 객체를 받아 해당 파일과의 입력 스트림을 생성합니다.
[ int read() ]
- int read() : 한 문자씩 읽어 정수로 반환
- int read(char[] cbuf) : 파일의 모든 내용을 문자 단위로 읽어 char 타입 배열에 입력
- int read(char[] cbuf, int off, int len) : 'len' 길이만큼 읽어서 배열의 'off'번째 위치부터 저장
역시 FileInputStream과 동일합니다. 다른점은 문자 단위로 읽어오기 때문에 byte 타입이 아닌 char 타입의 배열에 입력해 준다는 점입니다. 바이트 단위로 읽을 때 한글은 제대로 읽어오기가 힘들지만 문자 단위로 읽을 때는 2byte로 이루어진 한글도 무리 없이 읽어올 수 있습니다.
그리고 마찬가지로 기본 스트림 클래스이기 때문에 파일 포인터는 시작→끝의 한 방향으로만 흘러가게 됩니다.
public class Test { public static void main(String[] args) { char[] arr = new char[20]; // try-with-resources구문으로 리소스 자동 해제 수행 // input.txt : "헬로 월드..!!" try (FileReader fi = new FileReader("input.txt")) { // 한글자 읽기 System.out.println((char)fi.read()); // "헬" // char 타입 배열에 넣어서 출력 fi.read(arr); for(char c : arr) System.out.print(c); } catch (Exception e) { System.out.println("예외처리"); } } }
[ int close() ]
- 파일을 닫아줌
- try-with-resources 문에서는 불필요
- try-catch-finally 문에서 사용 (finally문 내에서도 예외 처리를 해줘야 함)
[ String getEncoding() ]
- 파일의 현재 문자 인코딩이 사용하고 있는 표준 정보 반환
public class Test { public static void main(String[] args) { // try-with-resources구문으로 리소스 자동 해제 수행 // input.txt : "헬로 월드..!!" try (FileReader fi = new FileReader("input.txt")) { System.out.println(fi.getEncoding()); // UTF8 } catch (Exception e) { System.out.println("예외처리"); } } }
[ Boolean ready() ]
- 현재 파일 포인터 위치에서 더 읽을 문자가 남았는지 여부를 반환
[ long skip(long n) ]
- 현재 파일 포인터에서 'n'개의 문자만큼 뒤로 이동시킴
public class Test { public static void main(String[] args) { // try-with-resources구문으로 리소스 자동 해제 수행 // input.txt : "헬로 월드..!!" try (FileReader fi = new FileReader("input.txt")) { fi.skip(3); // 3글자 뒤로 이동 System.out.println((char)fi.read()); // "월" } catch (Exception e) { System.out.println("예외처리"); } } }
[ FileReader ]
- FileOutputStream과 유사한 기능
- 문자 스트림으로서 문자 단위의 바이트 변환 기능을 가짐
FileOutputStream 클래스가 바이트 스트림이라면 FileWriter 클래스는 문자 스트림입니다. 즉, 바이트 단위가 아닌 문자 단위로 입출력을 수행합니다.
[ 생성자 ]
- new FileWriter(File file)
- new FileWriter(FileDescriptor jdObj)
- new FileWriter(String name)
- new FileWriter(File file, boolean append) - 추가모드
- new FileWriter(String name, boolean append) - 추가모드
FileOutputStream 클래스의 생성자와 동일합니다. 파일의 주소와 이름 정보를 가진 객체를 받아 해당 파일과의 출력 스트림을 생성합니다. 또한 추가모드로 열지 않으면 기존 파일 내용은 모두 삭제되고 새로 덮어쓰기 모드로 열립니다. 잘 못 열면 기존 파일 내용이 모두 날아갈 수 있으니 주의해야 합니다.
경로가 없으면 예외가 발생하고 파일이 없으면 새로 만들어줍니다.
[ void write() ]
- void write(char[] cbuf) : 한 문자 또는 배열에 있는 내용을 모두 파일에 출력
- void write(char[], int off, int len) : 배열의 'off'번째부터 'len'개의 문자를 출력
- void write(int c) : 유니코드를 제공하면 문자로 변환하여 출력
- void write(String str) : 문자열을 파일에 출력
- void write(String str, int off, int len) : 문자열의 'off'번째부터 'len'개의 문자를 출력
public class Test { public static void main(String[] args) { String arr = "Hello World..!"; // try-with-resources구문으로 리소스 자동 해제 수행 try (FileWriter fo = new FileWriter("output.txt")) { fo.write(arr.charAt(0)); // output.txt에 "H" 출력 fo.write(arr); // output.txt에 "Hello World..!" 출력 fo.write(arr, 0, 5); // output.txt에 "Hello" 출력 fo.write(97); // output.txt에 "a" 출력 fo.write("안뇽"); // output.txt에 "안뇽" 출력 fo.write("안녕하세요", 0, 2); // "안녕" 출력 } catch (Exception e) { System.out.println("예외처리"); } } }
[ void close() ]
- 현재 열려 있는 파일을 닫음
- try-with-resource문 사용 시 자동으로 자원 해제가 되므로 불필요
- try-catch-finally문 사용 시 사용해줘야 메모리 누수를 방지하고 다른 곳에서 리소스 사용이 가능함
- finally문 내에서도 역시 예외처리를 해줘야 함
[ void flush() ]
- BufferedWriter 클래스를 통해 버퍼에 출력했따면, 버퍼에 있는 데이터를 모두 파일로 옮김
- BufferedWriter 클래스에서 오버라이딩해서 사용
- 버퍼 인스턴스.flush() 로 사용
public class Main { public static void main(String[] args) { File path = new File("C:\\JAVA\\Test\\test.txt"); try (FileWriter file = new FileWriter(path)) { BufferedWriter buf = new BufferedWriter(file); String[] str = { "버퍼로\n문자를 입력해보자" }; // 버퍼에 str의 문자를 출력 for (String a : str) { buf.write(a + '\n'); } // 버퍼에 쌓인 문자를 모두 파일로 옮김 buf.flush(); } catch (Exception e) { System.out.println("실패"); } } }