2017-03-26 5 views
0

バイトのストリームとストリームを処理できるPrintWriterクラスをテストしています。私は文字のストリームで試してみるとすべてがスムーズになりました。今はバイトストリームでテストしていました。ここでは、コードがあります:バイトのストリームでの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

readObjectObjectInputStringに使用していますが、Javaオブジェクトをシリアル化していないため、nullになっているのはなぜですか。 ObjectOutputString.writeObjectObjectInputString.readObjectを使用してください。

それはプログラムがエンコードされていないバイトストリームを使用する必要がありますいる生のバイトを記述するための方法を、含まれていないことを明示的に

PrintWriterdocs状態。

テキストにはPrintWriterを使用してください。 System.outには印刷インターフェイスがあるので、おなじみの有益な方法が公開されています。

シリアル化されたJavaオブジェクトの書き込みと読み取りには、実際には​​を使用する必要があります。シリアライズフォーマットはバイナリです(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} 

をあなたは読んでいたし、Javaオブジェクトを書いた場合は、代わりにこれを行うでしょう:

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(); 
関連する問題