2017-10-22 18 views
1

私はJavaのI/Oクラスで作業しています。私は、2つの重要なタイプのストリームがあることを理解しています:バイトストリームと文字ストリーム。しかし...私はバイトストリームでテキストファイルを読み書きしようとしました。バイトストリームとJavaの文字ストリーム

File klasor = new File("C:\\Java"); 
    if(!klasor.exists()) klasor.mkdirs(); 

    File kaynakDosya = new File("C:\\Java\\kaynak.txt"); 
    if(!kaynakDosya.exists()) kaynakDosya.createNewFile(); 

    File hedefDosya = new File("C:\\Java\\hedef.txt"); 
    if(!hedefDosya.exists()) hedefDosya.createNewFile(); 

    FileInputStream kaynak = new FileInputStream(kaynakDosya); 
    FileOutputStream hedef = new FileOutputStream(hedefDosya); 

    int c; 
    while((c = kaynak.read()) != -1) { 
     hedef.write(c); 
    } 

    if(kaynak != null) { 
     kaynak.close(); 
    } 

    if(hedef != null) { 
     hedef.close(); 
    } 

そして私は、文字ストリームと同じことをやった:ここでは、コードです

File klasor = new File("C:\\Java"); 
    if(!klasor.exists()) klasor.mkdirs(); 

    File kaynakDosya = new File("C:\\Java\\kaynak.txt"); 
    if(!kaynakDosya.exists()) kaynakDosya.createNewFile(); 

    File hedefDosya = new File("C:\\Java\\hedef.txt"); 
    if(!hedefDosya.exists()) hedefDosya.createNewFile(); 

    FileReader kaynak = new FileReader(kaynakDosya); 
    FileWriter hedef = new FileWriter(hedefDosya); 

    int c; 
    while((c = kaynak.read()) != -1) { 
     hedef.write(c); 
    } 

    if(kaynak != null) { 
     kaynak.close(); 
    } 

    if(hedef != null) { 
     hedef.close(); 
    } 

これらの2つが同じ結果を生成しました。だから、私は知りたいのですが、なぜここではバイトストリームを使うべきではないのですか? (私はいくつかの記事だけでなく、stackoverflow上の関連する質問を読んで、彼らはそう言う)私は文字ストリームは文字で文字を読むことを知っているが、これは私にどのような利点を与えるのですか?バイトストリームを使用して文字を読み込むと、どのような問題が発生する可能性がありますか?私の質問がはっきりしていることを願っています私は実際の事例を感謝します。

答えて

1

java.io.FileInputStream Javadocの状態:

のFileInputStreamは、生のバイトなど 画像データのストリームを読み込むためのものです。文字ストリームを読むには、 FileReaderの使用を検討してください。十分に類似し

java.io.FileOutputStream javadocの状態の何か:

たFileOutputStreamは、生のバイトなど 画像データの書き込み・ストリームのためのものです。文字のストリームを書き込むには、 FileWriterの使用を検討してください。 FileInputStream/FileOutputStreamFileReader/FileWriterの主な違いの

一つの第一は、後者は文字を操作する方法を提供しながら、バイトを操作するための方法を提供することです。

例では、ファイルコンテンツを別のファイルにコピーすると、charまたはbyteを操作しても大きな違いはありません。
あなたのケースでは、FileInputStreamまたはBufferedInputStreamがさらに適切と思われます。

しかし、あなたはStringインスタンスへの/から/書き込み文字を読み取るためのストリームを使用する場合、 FileReader/FileWriterを使用すると、実際に物事が容易になり、物事をより明確に。
さらに、BufferedReader/BufferedWriterFileReader/FileWriterを入れて、文字、配列、行の読み書きを効率的に行うことができます。 (バイト指向の入力ストリームから又は読み出し文字)バイト指向の出力ストリームに文字を書き込む

BufferedWriter writer = new BufferedWriter(new FileWriter("myfile")); 
writer.append(oneString); 
writer.append(oneStringBuffer); 
writer.newLine(); 

BufferedReader reader = new BufferedReader(new FileReader("myfile")); 
String currentLine = reader.readLine(); 
0

ストリーム内のすべての文字ができる場合にのみ、文字指向のストリームを使用した場合と同じ結果を生成しますプラットフォーム(通常はUTF-8)のデフォルトのエンコーディングでは1バイトで表されますが、それは別のものかもしれません。これをテストするには、複数のバイトが必要なもの(ギリシャ文字、キリル文字、アラビア文字など)を含むファイルを試してみてください。バイト指向ストリームでは、これらは動作しません。文字ベースのストリームでは、両方のストリームがそれらの文字をサポートするエンコーディング(UTF-8など)を使用し、入力ファイルが入力ストリームに使用されているエンコーディングに格納されている限り、文字は保存されます。

バイト指向のコードは実際にはこれをテストしていないことに注意してください。これはバイト単位でファイルをコピーするだけなので注意してください。すべてが動作しているように見えますが、実際の文字を読み込もうとすると、実際のテキストと比較すると失敗します。これをテストするには、(UTF-8エンコーディングで)キリル文字「Привет!」するとコードで、それは実際にあなたが

System.out.println("Success: " + "Привет!".equals(input)); 
+0

を使用して期待するものが含まれている場合Stringとテストにバイト指向の入力ストリームを使用してそのテキストを読んでみてください、私は混乱しています:。すべてではありません2バイトで表現された文字?ファイル内のすべての文字を1バイトで表すことができますか?キリル文字 "Привет!"で試してみました。ソースファイル "UTF-8"のエンコーディングを維持し、ターゲットファイルのエンコーディングを "ANSI"に変更したとにかく動作しました。 –

+0

@AdemTepe - In UTF-8、0x7Fまでのコードポイントは1バイトで表されます。 (たとえば、[this thread](https://stackoverflow.com/questions/7136421/why-does-utf-8-use-more-than-one-byte-to-represent-some-characters)を参照してください)。あなたのバイト指向のコードはバイト単位でファイルをコピーするだけでうまく動作しますが、これらのバイトを文字(入力時)として解釈しようとした場合やバイトに文字を書き込もうとした場合方向付けられた流れ。私はこの点を明確にするために私の答えを更新します。 –

関連する問題