2017-03-26 8 views
0

바이트의 스트림과 문자 스트림을 처리 할 수있는 PrintWriter 클래스를 테스트하고 있습니다. 내가 문자의 스트림을 시도 할 때 모든 것이 매끄럽게 진행되었습니다. 이제는 바이트 스트림으로 테스트하고 있었고 항상 읽는 내용을 출력 할 때마다 항상 null (예외)을 표시합니다. 여기에 코드입니다 :바이트의 스트림을 가진 PrintWriter 사용

package com.files.ex1; 

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectOutputStream; 
import java.io.PrintWriter; 

public class ex1 { 
    public static void main(String[] args) { 
     PrintWriter oPW; 
     try { 
      oPW = new PrintWriter(new ObjectOutputStream(new FileOutputStream("data.txt"))); 
      oPW.write("1\n"); 
      oPW.write("2\n"); 
      oPW.write("3\n"); 
      oPW.flush(); 
      oPW.close(); 
     } catch (IOException e) { 
      System.out.println(e.getMessage()); 
     } 
    } 
} 

이 읽으려고 클래스는 항상 널 (null) 인쇄 :

또한
package com.files.ex1; 

import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 

public class ex1_2 { 
    public static void main(String[] args) { 
     ObjectInputStream oOIS; 
     try { 
      oOIS = new ObjectInputStream(new FileInputStream("data.txt")); 
      String s = (String) oOIS.readObject(); 
      System.out.println(s); 
     } catch (IOException e) { 
      System.out.println(e.getMessage()); 
     } catch (ClassNotFoundException e) { 
      System.out.println(e.getMessage()); 
     } 
    }  
} 

어떤이 클래스를 사용할 때의 장점은? 문자의 스트림에 대해서는 각각 BuffedReadear 또는 BufferedWriter을 사용하여 각각 읽기 또는 쓰기를 최적화 할 수 있으며 flush() 메소드도 있습니다. 그리고 PrintWriter을 바이트 스트림과 함께 사용하면 어떤 이점이 있습니까? ObjectOutputStream만을 사용하면 위의 작업을 수행하려고 할 때 작동합니다.

답변

2

null이 표시되는 이유는 readObjectObjectInputString에 사용하고 있지만 Java 객체를 직렬화하지 않았기 때문입니다. ObjectInputString.readObjectObjectOutputString.writeObject과 함께 사용됩니다.

PrintWriterdocs 상태 명시

그것이 프로그램이 인코딩되지 않은 바이트 스트림을 사용해야하는 원시 바이트를 작성하기위한 방법을 포함하지 않는 것이다.

텍스트는 PrintWriter이어야합니다. System.out에는 인쇄 인터페이스가 있기 때문에 익숙한 유용한 방법을 제공합니다.

직렬화 된 Java 객체를 쓰고 읽을 때 실제로는 ObjectOutput/InputStream 만 사용해야합니다. 직렬화 형식은 바이너리 데이터입니다 (예 : JSON/XML과 달리). 이 개체는 Serializable 인터페이스를 구현해야합니다.

BufferedOutputStream 및 BufferedInputStream을 사용하면 인코딩되지 않은 바이트 스트림을 쓰고 읽는 성능을 향상시킬 수 있습니다.

일반적으로 접미사 "Reader"와 접미사 "Writer"가있는 클래스는 텍스트로 인코딩 된 스트림 용입니다. 여기에는 텍스트 스트림에서 문자열과 행을 파싱하는 데 유용한 메소드가 포함되어 있습니다. 바이너리 데이터를 전송할 때 절대로 사용해서는 안됩니다. 당신의 예에서

당신은 단지 파일에 텍스트 데이터를 작성하고 다시 텍스트 데이터를 읽고, 그렇게 사용하고 있습니다 : 읽기

oPW = new PrintWriter(new FileOutputStream("data.txt")); 
oPW.println("1"); 
쓰기

oOIS = new BufferedReader(new FileInputStream("data.txt")); 
String s = oOIS.readLine(); // "1" 

.

당신이 읽기와 바이너리 데이터를 작성, 당신은 대신에 이런 짓을 했을까 된 경우 :

os = new FileOutputStream("data.bin"); 
os.write(new byte[]{ 1, 2, 3 }); 

를 읽기 :

is = new FileInputStream("data.bin"); 
byte[] buf = new byte[3]; 
is.read(buf); // buf now equals {1, 2, 3} 

경우 했다 읽기 및 쓰기 자바 객체, 당신 대신 다음과 같이하십시오 :

oos = new ObjectOutputStream(new FileOutputStream("data.bin")); 
Foo foo = new Foo(...); 
oos.writeObject(foo); 

및 읽기 :

ois = new ObjectInputStream(new FileInputStream("data.bin")); 
Foo foo = (Foo) ois.readObject();