2013-08-20 61 views
2

我有這個文件,我通過套接字從服務器發送到客戶端。但是,當我嘗試重新啓動客戶端中的第159個第一個字節時,它會給出比當我要求服務器在原始文件中讀取相同數量時更小的結果,但是當我打印兩面讀取的長度時它是一樣的,但其中一個差不多是其他的三分之二!可能是什麼問題呢?我已經讓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