💡쓰기 스트림
FileOutputStream class > FileWriter class > BufferedWriter class
우리가 사용하는 대부분의 스트림은 일방통행이며, 내뱉기만 하는 빨대가 따로 있고, 들이마시는 빨대가 따로 있다.
양방향인 스트림보다 단방향인 스트림이 더 안정적이고 효율적이기 때문에 구분하여 사용하는 편이다.
FileOutputStream Class
try {
File file = new File("C:\\Class\\code\\java\\file\\list.txt");
FileOutputStream stream = new FileOutputStream(file);
stream.write(65); // A
stream.write(66); // B
stream.write(67); // C
// 스트림 닫기
stream.close();
System.out.println("종료");
} catch (Exception e) {
System.out.println("Error");
e.printStackTrace();
}
스트림 열기
스트림 객체를 생성하는 행위를 스트림을 '연다(open)'고 표현한다.
stream을 가지고 쓰기 작업을 하면 file에 적용이 되며, 현재 경로에 list.txt 파일은 없지만, 쓰기 작업을 하면 자동으로 파일이 생성된다.
이 방식은 바이트 단위 쓰기(1byte)를 하므로 한글은 작성할 수 없으므로 주의한다.
스트림 닫기
스트림을 썼으면 반드시 닫아주는 작업이 필요하다. 스트림을 닫지 않으면 저장이 안 되고, 잠긴 파일이 되는 현상이 일어날 수 있다. write() 메소드가 실시간으로 작성하는 게 아니기 때문이다.
write() 메소드는 실제 파일이 아닌 메모리 임시 버퍼에 저장을 해 두었다가 close() 메소드가 실행되는 순간 텍스트 파일에 기록한다는 특징이 있다.
file 경로에 list.txt 파일이 생성되고, "ABC"가 저장된 것을 확인할 수 있다.
생성 모드, 추가 모드
FileOutputStream stream = new FileOutputStream(file, true); // 추가 모드
FileOutputStream stream = new FileOutputStream(file, false); // 생성 모드
file 뒤에 boolean 값이 있는데, true일 경우 추가 모드(Append mode), false 또는 아무것도 적지 않으면 생성 모드(Create mode)이다.
생성 모드는 덮어쓰기를 하며, 실행할 때마다 기존에 파일이 있든 말든 새로 만들고 새로운 내용을 추가한다.
그리고 추가 모드는 기존 내용을 내버려 두고 그 다음에 이어쓴다.
이클립스에서는 덮어쓰기 하는 생성 모드가 기본값으로 설정되어 있는데, 그 이유는 추가 모드보다 생성 모드를 훨씬 많이 쓰기 때문이다.
FileWriter Class
try {
FileWriter writer = new FileWriter("C:\\Class\\code\\java\\file\\member.txt");
// writer.write(65);
// writer.write("Isaac");
writer.write("아이작");
// 스트림 닫기
writer.close();
System.out.println("종료");
} catch (Exception e) {
System.out.println("Error");
e.printStackTrace();
}
FileWriter 클래스를 사용하면 문자열을 저장할 수 있다.
BufferedWriter Class
try {
BufferedWriter writer = new BufferedWriter(new FileWriter("C:\\Class\\code\\java\\file\\memo.txt"));
writer.write("하나");
writer.write('A');
writer.write("\r\n");
writer.write("둘");
writer.newLine(); // BufferedWriter에만 있는 기능
writer.write("셋");
// 스트림 닫기
writer.close();
System.out.println("종료");
} catch (Exception e) {
System.out.println("Error");
e.printStackTrace();
}
BufferedWriter 클래스는 FileWriter 클래스와 기능이 동일하지만, newLine() 메소드가 있다.
💡읽기 스트림
FileInputStream class > FileReader class > BufferedReader class
FileInputStream Class
try {
FileInputStream stream = new FileInputStream(Ex65_File.FILE);
int code = -1;
while ((code = stream.read()) != -1) {
System.out.print((char)code);
}
System.out.println();
// 스트림 닫기
stream.close();
System.out.println("종료");
} catch (Exception e) {
System.out.println("Error");
e.printStackTrace();
}
스트림으로 모든 데이터를 출력하고 나면 그 이후부터는 '-1'이 출력된다.
이러한 특징을 이용해 -1이 출력되기 전까지 텍스트를 출력하게 할 수 있다.
스트림 경로 관리
public static final String FILE = "C:\\Class\\code\\java\\file\\list.txt";
경로를 final 상수로 정의하면 편하게 사용할 수 있다.
FileReader Class
try {
FileReader reader = new FileReader("C:\\Class\\code\\java\\file\\member.txt");
int code = -1;
while ((code = reader.read()) != -1) {
System.out.print((char)code);
}
// 스트림 닫기
reader.close();
System.out.println("종료");
} catch (Exception e) {
System.out.println("Error");
e.printStackTrace();
}
BufferedReader Class
try {
BufferedReader reader1 = new BufferedReader(new InputStreamReader(System.in)); // 키보드 입력을 받는 스트림
BufferedReader reader2 = new BufferedReader(new FileReader("C:\\Class\\code\\java\\file\\memo.txt"));
// String line = reader2.readLine();
// System.out.println(line);
String line = null;
while ((line = reader2.readLine()) != null) {
System.out.println(line);
}
// 스트림 닫기
reader1.close();
reader2.close();
System.out.println("종료");
} catch (Exception e) {
System.out.println("Error");
}
BufferedReader 클래스는 라인 단위로 읽을 수 있어서 선호도가 높다.
💡메모장 만들기
메모장 쓰기
try {
Scanner scan = new Scanner(System.in);
System.out.print("저장할 파일명: ");
String filename = scan.nextLine();
BufferedWriter writer = new BufferedWriter(new FileWriter("C:\\Class\\code\\java\\file\\memo.txt" + filename + ".txt"));
boolean loop = true;
while (loop) {
System.out.print("입력: ");
String line = scan.nextLine();
if (line.equals("exit")) {
break;
}
writer.write(line); // 한 줄 입력(scan) > 한 줄 쓰기(writer)
writer.write("\r\n");
}
writer.close();
} catch (Exception e) {
System.out.println("Error");
e.printStackTrace();
}
메모장 읽기
try {
BufferedReader reader = new BufferedReader(new FileReader("C:\\Class\\code\\java\\JavaTest\\src\\com\\test\\java\\collection\\Ex61_Stack.java"));
String line = null;
int n = 1;
while ((line = reader.readLine()) != null) {
System.out.printf("%3d: %s\n", n, line);
n++;
}
reader.close();
} catch (Exception e) {
System.out.println("Error");
e.printStackTrace();
}