2012-05-12 6 views
0

자바에서 소켓을 통해 파일을 전송하려고합니다. 실제로 전송할 수 있습니다 ..하지만 한 가지 문제가 발생했습니다. 문제는 전송 된 파일 크기가 줄어드는 것입니다. 내가 300메가바이트 파일을 전송 예를 들어, 클라이언트는 .. 내가 문제가 무엇인지 궁금 해서요 ....Java에서 소켓을 통해 파일을 전송하는 중

서버 측

File myFile = new File (basePath+"\\"+input.readUTF()); 
byte [] mybytearray = new byte [1024]; 
FileInputStream fis = new FileInputStream(myFile); 
BufferedInputStream bis = new BufferedInputStream(fis); 
txtArea.append("Sending... \n"); 
while (true) 
{ 
    int i = bis.read(mybytearray, 0, mybytearray.length); 
      if (i == -1) { 
     break; 
    } 
    output.write(mybytearray, 0, i); 
    txtArea.append("Sending chunk " + i + "\n"); 

} 
output.flush(); 

클라이언트 측

output.writeUTF("get"); 
txtArea.append("Starting to recive file... \n"); 
       long start = System.currentTimeMillis(); 
       byte [] mybytearray = new byte [1024]; 
       txtArea.append("Connecting... \n"); 
       output.writeUTF(remoteSelection); 
       FileOutputStream fos = new FileOutputStream(basePath+"\\"+remoteSelection); 
       BufferedOutputStream bos = new BufferedOutputStream(fos); 
       int bytesRead = input.read(mybytearray, 0, mybytearray.length); 
       while(bytesRead != -1) 
       { 
        bos.write(mybytearray, 0, bytesRead); 
        txtArea.append("got chunk" + bytesRead +"\n"); 
        bytesRead = input.read(mybytearray, 0, mybytearray.length); 
       } 
bos.flush(); 
+5

쓰기 전에 -1을 확인해야합니다. 또한 Javadoc에 대해 특별히 경고되는 방식으로 available()를 오용하고 있습니다. 파일 크기가 int로 맞다고 가정하고 있습니다. etc. etc. – EJP

+0

EJP가 지적한 바에 따르면 BufferedInputStream에서도 사용할 수 있는지 확인하고 있습니다. 기본 입력 스트림의 버퍼 길이 만 반환하는 것 같습니다. – dragon66

+0

그래서 파일의 크기를 어떻게 확인합니까? 내가 사용하려고 바이트 [] mybytearray = 새로운 바이트 [(int) myFile.length()]; 전에 ..하지만 그것은 오류를 반환합니다. 내가 600 메가 바이트와 같은 큰 파일을 보내려고 할 때 힙이 있습니다 .. –

답변

2

만 299메가바이트를 받게됩니다 Java로 스트림을 카피하는 표준적인 방법은 다음과 같습니다 :

int count; 
byte[] buffer = new byte[8192]; // or whatever you like really, not too small 
while ((count = in.read(buffer)) > 0) 
{ 
    out.write(buffer, 0, count); 
} 

임의의 길이의 입력으로 동작합니다. 메모리에 전체 입력을로드하지 않습니다. 그렇게함으로써 대기 시간을 추가하지 않습니다.

두 개 이상의 파일을 보내려면 먼저 DataOutputStream.writeLong()을 통해 길이를 보내야합니다. 반대쪽 함수를 통해 그것을 읽으십시오; 읽기 끝에서 루프 조건을 조정하여 정확히 많은 바이트를 읽은 후에 종료합니다. 나타날 수있는만큼 간단하지 않습니다. 독자를위한 운동으로 남겨 두었다.

+0

파일의 길이를 어떻게 확인합니까? –

+0

@BobyHartanto Err, 'File.length()?' – EJP

+0

도움에 감사드립니다. –

관련 문제