2016년 3월 27일 일요일

Java 파일 입출력


  • 자바에서 파일 입출력은 크게 두 종류로 나뉘는 듯 하다. 하나는 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해서 사용해야 한다. 

댓글 없음:

댓글 쓰기