質問: stream.read(buffer,0,256) != -1) { sos.write(buffer); } sos.flush(); sos.close(); stream.close(); 以上のコードでローカル内にあるファイルを名前を変え転送していますが クライアントにより正常なファイルだったり異常なファイルだったりします。 異常なファイルはクライアントによりばらばらですが、ファイルサイズが正常のものより少し大きかったりします。 バッファーではなくバイト単位での転送も試みたのですが 結果は同じでした。 何かおかしい点ありましたらご指摘いただけますでしょうか。
回答: outputstreamの使い方の問題ですね。 で、outputstream#write(byte[] buffer)は、bufferのすべてを書き込む、と言うものです。 記載のコードの問題はinputstreamで読み込んでいない分のbufferまで書き込まれてしまうものです。 例えば、「abcdefgh」と言うファイルがあり、bufferが3文字読み込めるとして abc def gh のようにbufferには読み込まれますが、bufferは三文字分なので、「gh」を読み込んだ際に、前回読み込んでいたfが上書きされずに残ります。書き込んだときは abc def ghf となります。 正しいコードは sos.write(buffer);⇒sos.write(buffer,0,bytesread); と、読み込んだ分だけ、出力するようにします。