Java IO <7 - Writer>

devhan·2023년 9월 3일
0

자바 I/O 입문

목록 보기
7/7

막연하게만 사용하던 I/O를 조금 더 이해해보고자 작성한 글입니다.
기본적으로 I/O는 O/S 레벨에서 이루어지고 byte를 다룬다는 것을 생각야해합니다.
자바 I/O 관련 마지막 글입니다


Writer

Reader 클래스와 비슷하게 OutputStream을 String기반으로 사용할 수 있도록 하는 클래스이다.

Writer = OutputStream + String 핸들링


1.FileWriter

FileWriter를 사용하면 기존에 String을 byte[]로 변경해서 write작업을 수행하던 것을 하지않고 곧 바로 String을 사용해서 write를 할 수 있다.

  • FileOutputStream
public static void main(String[] args) throws IOException {
   FileOutputStream fos = new FileOutputStream("파일경로");

    String msg = "파일 쓰기 기능";
    byte[] b = msg.getBytes();

    fos.write(b);
    fos.flush();
    fos.close();
}
  • FileWriter
public static void main(String[] args) throws IOException {
   FileWriter fw = new FileWriter("파일경로");

   String msg = "파일 쓰기 기능";
   fw.write(msg);
   fw.flush();
   fw.close();
}



2. OutputStreamWriter

InputStreamReader와 마찬가지로 브릿지 역할을 하는 클래스

  • OutputStream
public static void main(String[] args) throws IOException {

  Socket s = new Socket("localhost", 6000);
  OutputStream out = s.getOutputStream();

  String msg = "Hello from client";
  byte[] b = msg.getBytes();

  out.write(b);
  out.flush();
  out.close();
  
}
  • OutputStreamWriter + BufferedWriter
    BufferedWriter를 위해서 Writer 타입이 필요하고, OutputStreamWriter를 이용해서 OutputStream을 Writer타입으로 변경할 수 있다.
public static void main(String[] args) throws IOException {

      Socket s = new Socket("localhost", 6000);
      OutputStream out = s.getOutputStream();
      OutputStreamWriter osw = new OutputStreamWriter(out);
      BufferedWriter bufWriter = new BufferedWriter(osw);

      String msg = "Hello from client!!";


     bufWriter.write(msg);
     bufWriter.close();
     s.close();
     
  }



3. BufferedWriter

기본 매커니즘은 BufferedOutStream과 같지만, 추가적으로 newLine 메소드를 제공한다.
문장을 쓰는 중간에 줄바꿈을 편하게 할 수 있다.


 public static void main(String[] args) throws IOException {
 
    FileWriter fos = new FileWriter("파일경로");
    BufferedWriter bw = new BufferedWriter(fos);

    String msg = "첫번째 컨텐츠";
    bw.write(msg);
    bw.newLine();                // 줄바꿈

    String msg2 = "두번째 컨텐츠";
    bw.write(msg2);

    bw.flush();
    bw.close();

  }



4.PrintWriter

String 뿐만 아니라 int, char 등 다양한 타입들을 write할 수 있는 print와 println 함수를 제공한다. 객체 생성시에 autoFlush 기능도 추가가 가능하다.

  • 네트워크
    사용하기는 편하나, 성능을 생각한다면 BufferedWriter의 사용을 고려할 수 있다.
public static void main(String[] args) throws IOException {

  Socket s = new Socket(ip, port);
  
  OutputStream out = s.getOutputStream();
  PrintWriter pw = new PrintWriter(out, true); // autoFlush

  String msg = "Hello from client!!";
  pw.println(msg); // String
  
  pw.println(123); // int

}
  • 콘솔
    System.out 객체를 사용하면 콘솔 출력을 할 수 있다.
  public static void main(String[] args) throws IOException {
    OutputStream out = System.out;
    PrintWriter pw = new PrintWriter(out, true);

    String msg = "Hello from client@@";
    pw.println(msg);
    pw.println(123);
    pw.close();
  }



5. StringWriter

StringWriter 자체의 기능은 StringBuffer 혹은 StringBuilder를 통해서 구현이 가능하지만, Writer 타입으로 사용할 수 있는 이점이 있을 때 사용을 고려할 수 있겠다. (클래스 내부에서는 StringBuffer를 사용)

 public static void main(String[] args) throws IOException {
    StringWriter sw = new StringWriter();

    sw.write("hi ");
    sw.write("can u see ");
    sw.write("this sentence? ");

    String msg = sw.toString();
    System.out.println(msg);

}


Summary

Writer 클래스는 Stream에 String 핸들링 로직을 더해서, String 관련 작업을 편하게 해주는 클래스이다.
BufferedReader를 사용하면 newLine을 사용할 수 있다.
PrintWriter는 다양한 타입의 출력을 지원한다.

profile
한번에 한가지씩

0개의 댓글

관련 채용 정보