반응형
PrintWriter
파일 입출력에서, 파일에 데이터를 쓸 때, System의 print관련 메서드를 사용하는 것처럼 파일에 쓸 수 있도록 편리한 기능을 제공하는 클래스(extends Writer)이다.
PrintWriter 클래스는 Writer 클래스를 상속 받은 클래스로, 메소드로는 위에서 언급했던 System의 print 관련 메소드처럼 작동하는 메소드를 지원하고 있다.
import java.io.PrintWriter;
public class Main {
public static void main(String[] args){
//System.out -> console창에 출력
PrintWriter pw = new PrintWriter(System.out);
String str1 = "Hello";
pw.print(str1);
pw.print(str1);
pw.println(); // 개행
pw.print(str1); // 개행뒤 아랫줄에 출력
pw.println(); // 개행
pw.printf("%.2f", Math.PI);
// 소숫점 둘째 자리까지 원주율 출력
//printerWriter사용시 flush 필수!!
//buffer에 저장된 값을 지정해준 stream으로,(해당 예제에서는 console창)
//내보낸다.
pw.flush();
/*
출력 결과 :
HelloHello
Hello
3.14
*/
pw.close;
}
}
System.out 메소드로 사용하던 print, println, printf를 메소드로 가지고 있고 사용방식도 똑같기 때문에 익숙하고 편하게 사용할 수 있다.
PrintWriter를 사용한 파일 입력
PrintWriter를 사용하여 파일 입출력을 하기 위해서는 위의 예제에서 System.out으로 넘겨주었던 stream에 파일 스트림을 생성하여 넘겨주어 연결해주면 된다.
public class Main {
public static void main(String[] args){
PrintWriter out = null;
try {
out =
new PrintWriter(new BufferedWriter(new FileWriter("test.txt")));
/* 또는
out =
new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream("test.txt"))));
*/
out.println("Hello World!");
//append() : 해당 파일의 끝부분에 이어 붙임
out.append("Wow!!");
out.append(" PrintWriter");
//flush를 해주어야 스트림과 연결된 곳에 내보냄!!! <- 중요!!
out.flush();
/*test.txt
Hello World!
Wow!! PrintWriter
*/
} catch(FileNotFoundException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
}
}
}
인코딩 설정
FileReader, FileWriter는 파일의 인코딩을 무조건 file.encoding값으로 간주한다. 인코딩 값을 따로 설정을 안 해준다면, OS가 기본적으로 파일을 인코딩하는 방식대로 저장이된다.
예를 들어, LINUX는 UTF-8, MacOS는 한글상위의 경우 euc-kr, 윈도우즈는 Java 소스코드 인코딩에 따라 파일을 저장한다. 그렇기 때문에 원하는 인코딩 방식이 있다면 따로 설정해주어야 한다.
인코딩은 InputStreamReader, OutputStreamWriter를 사용하여 변경해줄 수 있다.
public class Main {
public static void main(String[] args){
PrintWriter out = null;
BufferedReader br = null;
try {
System.out.println("현재 인코딩 " + System.getProperty("file.encoding"));
//euc-kr 인코딩으로 저장
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream("test_encoding.txt"), "euc-kr")));
//다른 인코딩으로 읽어오면 깨짐
br = new BufferedReader(new InputStreamReader(new FileInputStream("test_encoding.txt")));
//같은 인코딩 euc-kr로 읽어와야 함 = euc-kr로 디코딩
br = new BufferedReader(new InputStreamReader(new FileInputStream("test_encoding.txt"), "euc-kr"));
} catch(FileNotFoundException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
} finally {
out.close();
try {
if(br != null) br.close();
catch(IOException e) {
e.printStackTrace();
}
}
}
}
반응형
'Programming > Java' 카테고리의 다른 글
[자바/Java] File 클래스 (1) | 2023.10.18 |
---|---|
[자바/Java] 시스템 속성(property) (0) | 2023.10.18 |
[자바/Java] 파일 I/O - Object입출력 (0) | 2023.10.18 |
[자바/Java] 파일 I/O - Data 입출력 (0) | 2023.10.18 |
[자바/Java] 파일 I/O - File 입출력 (0) | 2023.10.18 |