2016-11-30 3 views
0

に複製データI持って、私はクライアントにファイルを送信するために使用しています次のコード:Javaのソケット - 最後の書き込み

private void sendFile(Socket client) throws Exception { 
     byte[] data = new byte[4096]; 
     DataOutputStream dos = new DataOutputStream(client.getOutputStream()); 
     FileInputStream fis = new FileInputStream("test.txt"); 

     while (fis.read(data, 0, data.length) != -1) { 
      dos.write(data); 
     } 

     fis.close(); 
     dos.close(); 
} 

ファイルサイズは後に異なっているということです私は発見だ問題転送。さらに調査すると、ファイルが最後のdos.write(data)に複製されていることがわかりました。

例:

オリジナルファイル:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Cras dictum diam neque, eu dictum sem efficitur ut. 
Ut eu hendrerit risus. 
In dapibus vel lectus at egestas. 

転送されたファイル:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Cras dictum diam neque, eu dictum sem efficitur ut. 
Ut eu hendrerit risus. 
In dapibus vel lectus at egestas. 
Ut eu hendrerit risus. 
In dapib 

私はここにウィットの終わりだと私はすでにしようと数百の例を見てきましたこれを修正する。私はdos.flush()を試して、読み取り値をdos.read(data)に変更し、whileループ状態を変更しました。非常に大きなファイルを転送することを期待していますので、ファイルを一度に読み込む必要はありません。

EDIT:

私はダウンロードをテストするために、コマンドラインからtelnetnetcatの両方を使用してきました。読み込まれたバイトの最大数 -

+0

あなたはrを確認する必要がありますリードとライトの両方からのeturn値。 readからの値は、どれくらい読み込まれ、安全に書き込めるかを示します。 writeからの値は、書き込まれた量を示し、再試行を促す可能性があります。 –

答えて

1

この方法

https://docs.oracle.com/javase/7/docs/api/java/io/DataOutputStream.html#write(byte[],%20int,%20int)

https://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html#read(byte[],%20int,%20int)

LENを参照します。

あなたは唯一以前

ので

読み取られたバイトの量を書きたいバッファ

に読み込まれたバイトの総数を返します。

int br = -1; 
    while ((br = fis.read(data, 0, data.length)) != -1) { 
     dos.write(data, 0, br); 
    } 
+0

あなたのリンクは 'InputStream'読み込みでなければなりません。根本的な原因は、ポスターが3番目の引数で渡されたバイト数を読み取るための呼び出しを保証していることです。もちろん、そうではありません。 – pvg

+0

私はOPがアレイがクリアされると思ったと思う。 –

+0

潜在的にクリアされないだろうか? –

関連する問題