2012-04-06 11 views
0

クライアントサーバーのソケットコードがあり、Windows 7マシンとSUSE Linuxボックス間でバイナリファイルを転送しています。私がWin7からLinuxにファイルを転送すると、それらは同じMD5チェックサムで終わるので、それらが同じであることは分かっています。しかし、LinuxからWin7に転送すると、チェックサムが一致せず、ファイルが正しく転送されなかったことを示します。バイナリファイル転送OK Win7からLinuxへWin7からLinuxへ

誰もがこれに遭遇しますか?私はObjectOutputStreamsとDataInputStreamsを使用しており、コードは両側で同じです。

// connect socket to server socket, etc 
//........ 

//======================= 
// read the file 
try { 
size = file.length(); 
byteArr = new byte[(int) size]; 
dis = new DataInputStream(new FileInputStream(file)); 
dis.read(byteArr, 0, byteArr.length); 
} catch (Exception e) { 
System.out.println(e.getMessage()); 
e.printStackTrace(); 
} 

//======================= 
// then send it 
try { 
oos.writeObject(byteArr); 
oos.flush(); 
} catch (Exception e) { 
System.out.println(e.getMessage()); 
e.printStackTrace(); 
} 

// then close oos, dis, etc 
+0

あなたは[のfileutils](http://commons.apache.org/io/apidocs/org/apache/commons/io/FileUtils.html#copyFile(java.ioを使用しようとしたくありません.File、java.io.OutputStream))? – corsair

+0

私はFileUtilsのlibについて何も知らない。バイナリファイルを転送するためのメソッドがありますか? – JCoop

答えて

0

InputStream.readは、入力配列を満たすことが保証されていません。少なくとも1バイトが読み取られ、配列に収まらないことを保証します。ファイルの終わりに達した場合は0バイト、またはIOExceptionを保証します。それは、Linuxの下で、あなたは1つのファイル全体を取得していない可能性があります。

また、バイト配列を埋めてオブジェクトとして送信するのはなぜですか?ストリームはバイトストリームとして概念化されており、配列は必要ありません。

例えば、

int bufferSize = 4096; 
byte[] buffer = new byte[bufferSize]; 

FileInputStream input = new FileInputStream(file); 

int read; 
while ((read = input.read(buffer)) != -1) { 
    output.write(buffer, 0, read); 
} 

// flush and close everything 
+0

私は、Win7ボックスに送信された後のファイルのバイト数がLinuxボックスと同じであることを忘れてしまったので、ファイル全体が送信されているように見えます。また、InputStream.readは入力配列を埋めることはできませんが、InputStream.read(byte []、0、byte []。length)は配列全体を埋めるべきであり、実際にはそうします。 – JCoop

関連する問題