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