2012-04-06 2 views
0

일부 클라이언트 서버 소켓 코드가 있고 Windows 7 컴퓨터와 SUSE Linux 상자간에 바이너리 파일을 전송하고 있습니다. Win7에서 Linux로 파일을 전송할 때, 동일한 MD5 Checksum으로 끝나기 때문에 동일하다는 것을 압니다. 그러나 Linux에서 Win7로 전송할 때 체크섬이 일치하지 않아 파일이 제대로 전송되지 않았다는 것을 나타냅니다.바이너리 파일 전송 Ok Win7을 Linux로 바꾸기 Ok39에서 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을 보장합니다. 리눅스에서는 전체 파일을 한 번에 가져올 수 없습니다.

또한 왜 바이트 배열을 채운 다음이를 객체로 보내고 있습니까? 스트림은 바이트 스트림으로 개념화되며 배열은 필요하지 않습니다.

예 :

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

관련 문제