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해서 사용해야 한다.