Java & Android
Java 파일 입출력
그레이트쪼
2016. 9. 10. 21:48
- 자바에서 파일 입출력은 크게 두 종류로 나뉘는 듯 하다. 하나는 FileReader/FileWriter이고 다른 하나는 FileInputStream/FileOutputStream이다.
FileReader/FileWriter
- FileReader/FileWriter는 character 단위로 읽기 쓰기를 하는데 효율을 향상시키기 위해서 BufferedReader/BufferedWrite와 결합하여 사용하기도 한다.
- FileReader 코드 예제
- 예제에서는 한 글자씩 읽고 있지만 read() 메소드의 인자로 char 배열을 넣어주면 배열을 크기만큼 읽어올 수도 있다.
1 2 3 4 5 6 7 8 9 | public static void readFile(String filePath) throws IOException { FileReader reader = new FileReader(filePath); int ch; while ((ch = reader.read()) != -1) { // read characters one by one System.out.print((char)ch); } reader.close(); // must be closed } |
- FileWriter 코드 예제
1 2 3 4 5 6 7 | public static void writeFile(String filePath, String content) throws IOException { FileWriter writer = new FileWriter(filePath); writer.write(content); // write all conent at once writer.append("---End of File---"); // append it at the end of the file writer.close(); // must be closed } |
BufferedReader + FileReader, BufferedWriter + FileWriter 조합
- 효율을 향상시키기 위해서 FileReader/FileWriter를 BufferedReader/BufferedWrite와 결합하여 사용하기도 한다.
- BufferedReader 코드 예제
- 버퍼를 사용하여 효율적으로 읽는데, 현실적으로 한 라인씩 읽는 메서드가 있어서 편하다.
1 2 3 4 5 6 7 8 9 | public static void readFile(String filePath) throws IOException { BufferedReader reader = new BufferedReader(new FileReader(filePath)); String line; while ((line = reader.readLine()) != null) { // read lines one by one System.out.print(line); } reader.close(); // must be closed } |
- BufferedWriter 코드 예제
- FileWriter만 사용하면 문자열을 전달할 때마다 파일에 쓰기 작업을 하는데 BufferedWrtier를 사용하면 버퍼가 꽉 찰 때까지 기다렸다가 파일에 쓴다. (버퍼가 차기 전에 파일에 쓰고 싶다면 flush()를 호출)
1 2 3 4 5 6 7 | public static void writeFile(String filePath, String content) throws IOException { BufferedWriter writer = new BufferedWriter(new FileWriter(filePath)); writer.write(content); writer.newLine(); // append a blank line writer.close(); } |
FileInputStream/FileOutputStream
- 앞선 FileReader/FileWriter, BufferedReader/BufferedWrite가 문자열을 다룬다면 FileInputStream/FileOutputStream은 바이트를 다룬다.
- FileInputStream 코드 예제
- 예제에서는 한 바이트씩 읽고 있지만 read() 메소드의 인자로 byte 배열을 넣어주면 배열의 크기만큼 읽어온다.
1 2 3 4 5 6 7 8 9 | public static void readFile(String filePath) throws IOException { FileInputStream fis = new FileInputStream(filePath); int ch; while ((ch = fis.read()) != -1) { // read bytes one by one System.out.print((char)ch); } fis.close(); // must be closed } |
- FileOutputStream 코드 예제
1 2 3 4 5 6 7 8 9 | public static void writeFile(String filePath, String content) throws IOException { // append if true, overwrite otherwise FileOutputStream fos = new FileOutputStream(filePath, false); for (char ch : content.toCharArray()) { fos.write(ch); } fos.close(); } |
- FileInputStream/FileOutputStream도 사실 비효율적이다. 따라서 버퍼를 활용하려면 BufferedInputStream/BufferedOutputStream에 wrapping해서 사용해야 한다.