2012-02-14 58 views
3

これは非常に簡単で、私はGoogleを検索しましたが、私が気付いた問題について言及した人はいませんでした。私が見たものはすべて同じ基本的なことをしています。私はEOFに達したときに-1を返しますが、どのようなファイルがバッファあるいは同じサイズよりも小さい場合)(読み知ってInputStreamからの読み込みとOutputStreamへの書き込み

byte [] buffer = new byte[256]; 
int bytesRead = 0; 
while((bytesRead = input.read(buffer)) != -1) 
{ 
    output.write(buffer, 0, bytesRead); 
} 

:このような? Foxの例では、200バイトのファイルが読み込まれています。私はそれが200バイトを読み込むと仮定しますが、-1を返します。これはjavadocsと一致しますが、write()が呼び出されないことも意味します。私は実際にそれが200バイトを読み、次の反復で-1を返すと私に伝えると思っていたでしょう。

この「問題」を回避するにはどうすればよいですか?

+0

'input'がどのように生成され、' read() 'を呼び出す前にどうなるかを示します。 – erickson

+0

この質問は「不完全」です。 – erickson

+0

[OutputStreamにJava InputStreamの内容を簡単に書き込む方法]の複製が可能です(http://stackoverflow.com/questions/43157/easy-way-to-write-contents-of-a-java-inputstream-to - 流出ストリーム) – rds

答えて

12

FYI GuavaにはByteStreams.copy(InputStream, OutputStream)があります。直接使用することも、この問題の解決方法を見ることもできます。

+0

グァバ、私はこれについて聞いていない。私は多くのGoogleのJavaライブラリが非常に便利であることがわかった。私はcopy()のコードを見て、本質的に私のことをやっているが、write()は私の場合は決して呼び出されない。私は再び自分のコードを見てみましょう。これは私がそれが働くことを期待した方法です。コメントされた皆が言っているように。 – Amac

1

空でないストリームの終了を検出するには、少なくともread()を2回呼び出す必要があります。 1つはコンテンツを読み込み、もう1つはEOFを返します。

例として、バッファが256バイトで、ファイルが200バイトしかない場合、read(byte[])への呼び出しは200を返します(または呼び出し結果のシーケンスは合計200になります)。信号EOF。

それはあなたがInputStreamのためのJavadocを解釈してきたかは全く明らかではないが、それはそれはバイト数を読み戻すことを明確に述べている、と-1を返し読み取り専用すべき多くのデータがありませんでした

bの長さがゼロの場合、バイトは読み取られず、0が返されます。 それ以外の場合は、少なくとも1バイトを読み取ろうとしています。ストリームがファイルの最後にあるため、バイト が使用できない場合は、値 -1が返されます。それ以外の場合は、少なくとも1バイトが読み込まれ、bに格納されます。

さらに:

戻り値:そこバッファに読み込まれたバイトの総数、または-1 [もし] ストリームの終わりに達したため、これ以上のデータ[ありません]。

+0

2回の読み取り?これは私が期待したものですが、そうではありません。ファイルが私が使用しているバッファよりも小さい場合は、raad()の最初の呼び出しで-1を返します。それは技術的にEOFに達しているので、javadocが言っていることをしています。しかし、読んだ200バイトについては何も言わない。私が投稿したようなwhileループを使うと、write()は決して呼び出されません。 – Amac

+0

@ user1209868あなたのコードのどこかにバグがあります。 (あなたの投稿には、ファイルを開いてからreadが-1を返す時点までのストリームの完全な履歴は表示されません)上記で引用したように、ドキュメントでは、読み込み可能なバイト数があるかどうか、 ; Javadocは**いくつかのバイトが読み込まれると-1が返されるとは言っていません。開始するにはストリームが空であるか、先行操作によって保持していたデータを消費したことがあります。 – erickson

0

read()は、完全なファイルが読み込まれるまでの読み込みバイト数を返します。それ以上のバイトが読み込めなくなると-1を返すだけです。ストリームがファイルの末尾にあるバイトがない場合はthe java documentation (1.4)

から

、値は-1が返されます。 それ以外の場合は、少なくとも1バイトが読み込まれ、bに格納されます。

実際にあなたがしたいことをします。 200バイト(またはファイルに残っていて、指定したバッファよりも小さいもの)を読み取り、次の反復で-1を返します。

+0

私はjavadocが何を言っているのか理解しています。 read()を呼び出すと、バッファはEOFに達するまでバッファを満たします(バッファはファイルよりも大きい)。そして、ドキュメントが言うように、-1を返します。これをやっているが、最初にそれが200バイトを読んだことを教えてはならない。そして、read()の後続の呼び出しで-1を返す。 – Amac

+0

@ user1209868 EOF以外は何も読み取っていないときは-1を返します。何かを読み込むと、読み込み回数が返されます。 – EJP

7

あなたのコードOK働く

byte [] buffer = new byte[256]; 
int bytesRead = 0; 
while((bytesRead = input.read(buffer)) != -1) { 
    output.write(buffer, 0, bytesRead); 
} 
。例えば

あなたは300文字(600バイト)でファイルを持っていると想像:

ステップ1.バッファは256のバイトを読み出して出力にそれらを書き換えます。 344 left to EOF

ステップ2.バッファは256バイトを読み込み、出力に書き換えます。 88 EOFに左

ステップ3.バッファは88バイト(byteRead == 88)を読み込み、出力に書き換えます。 EOFは、上記の手順を

を編集...

ステップ4 EOF(input.read(buffer)戻り-1

を残した理論ではありません。私は実際のファイルの内容を次のコードに書き換えることでこれを取得します:

static void rewrite() throws IOException { 
    InputStream input = new FileInputStream("file1.txt"); 
    OutputStream output = new FileOutputStream("file2.txt"); 
    byte[] buffer = new byte[256]; 
    int bytesRead = 0; 
    while ((bytesRead = input.read(buffer)) != -1) { 
     System.out.println(bytesRead); 
     output.write(buffer, 0, bytesRead); 
    } 
} 

多分あなたの設定に他の何かが間違っています。

+0

これは私が期待していることですが、ステップ3で-1に戻ることがわかりました。私のコードをもう一度実行しますが、同じ結果で既に数回行っています。 – Amac

+0

@ user1209868編集を参照してください – msi

0

は、私はそれが200のバイトを読むと仮定しますが、-1を返し

号は、それが200のバイトを読み込んで、これはJavadocのから完全に透明である200を返し、そしてあなたもそれを試みている可能性が容易に十分です。

関連する問題