- 자바에서 파일 입출력은 크게 두 종류로 나뉘는 듯 하다. 하나는 FileReader/FileWriter이고 다른 하나는 FileInputStream/FileOutputStream이다.
FileReader/FileWriter
- FileReader/FileWriter는 character 단위로 읽기 쓰기를 하는데 효율을 향상시키기 위해서 BufferedReader/BufferedWrite와 결합하여 사용하기도 한다.
FileReader 코드 예제
- 예제에서는 한 글자씩 읽고 있지만 read() 메소드의 인자로 char 배열을 넣어주면 배열을 크기만큼 읽어올 수도 있다.
public static void readFile(String filePath) throws IOException { FileReader reader = new FileReader(filePath); int ch; while ((ch = reader.read()) != -1) { // 한 글자씩 받아온다 System.out.print((char)ch); } reader.close(); // 다 읽었으면 닫아주어야 한다. }
FileWriter 코드 예제
public static void writeFile(String filePath, String content) throws IOException { FileWriter writer = new FileWriter(filePath); writer.write(content); // 한꺼번에 쓴다. writer.append("---End of File---"); // 파일 끝에 추가한다. writer.close(); // 다 썼으면 닫아주어야 한다. }
BufferedReader + FileReader, BufferedWriter + FileWriter 조합
- 효율을 향상시키기 위해서 FileReader/FileWriter를 BufferedReader/BufferedWrite와 결합하여 사용하기도 한다.
BufferedReader 코드 예제
- 버퍼를 사용하여 효율적으로 읽는데, 현실적으로 한 라인씩 읽는 메서드가 있어서 편하다.
public static void readFile(String filePath) throws IOException { BufferedReader reader = new BufferedReader(new FileReader(filePath)); String line; while ((line = reader.readLine()) != null) { // 한 라인씩 받아온다 System.out.print(line); } reader.close(); // 다 읽었으면 닫아주어야 한다. }
BufferedWriter 코드 예제
- FileWriter만 사용하면 문자열을 전달할 때마다 파일에 쓰기 작업을 하는데 BufferedWrtier를 사용하면 버퍼가 꽉 찰 때까지 기다렸다가 파일에 쓴다. (버퍼가 차기 전에 파일에 쓰고 싶다면 flush()를 호출)
public static void writeFile(String filePath, String content) throws IOException { BufferedWriter writer = new BufferedWriter(new FileWriter(filePath)); writer.write(content); writer.newLine(); // 공백 라인 추가 writer.close(); }
FileInputStream/FileOutputStream
- 앞선 FileReader/FileWriter, BufferedReader/BufferedWrite가 문자열을 다룬다면 FileInputStream/FileOutputStream은 바이트를 다룬다.
FileInputStream 코드 예제
- 예제에서는 한 바이트씩 읽고 있지만 read() 메소드의 인자로 byte 배열을 넣어주면 배열의 크기만큼 읽어온다.
public static void readFile(String filePath) throws IOException { FileInputStream fis = new FileInputStream(filePath); int ch; while ((ch = fis.read()) != -1) { // 한 바이트씩 받아온다 System.out.print((char)ch); } fis.close(); // 다 읽었으면 닫아주어야 한다. }
FileOutputStream 코드 예제
public static void writeFile(String filePath, String content) throws IOException { // true면 이어쓰기, false면 새로쓰기 FileOutputStream fos = new FileOutputStream(filePath, false); for (char ch : content.toCharArray()) { fos.write(ch); } fos.close(); }
- FileInputStream/FileOutputStream도 사실 비효율적이다. 따라서 버퍼를 활용하려면 BufferedInputStream/BufferedOutputStream에 wrapping해서 사용해야 한다.
댓글 없음:
댓글 쓰기