2013-08-20 1 views
2

소켓을 통해 서버에서 클라이언트로 보내는이 파일이 있습니다. 그러나 클라이언트에서 처음 159 바이트를 읽으려고하면 원래 파일에서 동일한 양을 읽도록 서버에 요청했을 때보 다 작은 결과를 얻을 수 있지만 양면에서 읽은 길이를 인쇄하면 결과는 작아집니다 그것은 동일하지만 하나는 다른 것의 거의 2/3입니다! 무엇이 문제 일 수 있습니까? 이미 replaceAll("(\\r|\\n|\\s)","")을 만들었으므로 공간이나 도표는 없지만 변경 사항은 없습니다. 제안 사항이 있으십니까? 내가 파일을 읽을 여기Java에서 소켓 통신 후 파일 읽기가 올바르지 않습니다.

FileOutputStream writer = new FileOutputStream("Splits.txt"); 
      String output= null; 
      StringBuilder sb2 = new StringBuilder(); 
      for (int i =0; i < MainClass.NUM_OF_SPLITS ; i++){ 
       StringBuilder sb1 = new StringBuilder(); 
        for (String s : MainClass.allSplits.get(i).blocks) 
        {sb2.append(s);} 
       sb1.append(sb2);} 
     output = sb2.toString().replaceAll("(\\r|\\n|\\s)", ""); 
     writer.write(output.getBytes(Charset.forName("ISO-8859-1"))); 
     writer.close(); 

그리고 : 은 여기에 파일을 작성하는 코드는 모든 데이터를 읽을 때까지

FileInputStream fis = new FileInputStream("Splits.txt"); 
    InputStreamReader reader = new  InputStreamReader(fis,Charset.forName("ISO-8859-1")); 

for(int i = 0; i < splitsNum; i++) { 
     char[] buf = new char[159]; //param 
     int count = reader.read(buf); 
     String h=String.valueOf(buf, 0, count).replaceAll("(\\r|\\n||\\s)",""); 

     System.out.println(h); 
     } 
+0

왜 데이터 전체가'read'에 대한 한 번의 호출로 읽힐 것이라고 가정하고 있습니까? 파일 자체가 올바르게 전송되었는지 어떤 검증을 수행 했습니까? –

+0

클라이언트 쪽에서 클라이언트의 파일을 "수동으로"열 수 있으며 내용에 초기 파일이 일치하는 것을 볼 수 있습니다. – rima101

+0

파일을 수동으로 열지 마십시오. 파일 크기를 확인하고 이상적으로 두 파일 모두에서 MD5 해시를 수행하십시오. –

답변

0

당신은 당신이 필요로하는 루프를 필요

char[] buf = new char[159]; 
int charsRead = 0; 
while (charsRead < buf.length) { 
    int count = reader.read(buf, charsRead, buf.length - charsRead); 
    if (count < 0) { 
     throw new EOFException(); 
    } 
    charsRead += count; 
} 
// Right, now you know you've actually read 159 characters... 
+0

그것은 작동합니다. 매번 내 파일을 159 자씩 읽으려면 어떻게해야합니까? – rima101

+0

@ rima101 : 159자를 읽을 때마다 해당 코드를 사용하십시오. –

+0

반드시 손으로 코딩하는 대신 DataInputStream.readFully()를 사용하도록 권장해야합니까? – EJP

관련 문제