2013-03-21 66 views
0

我有一個客戶端服務器程序,它必須發送一個文件的內容作爲一個字符串,並且無法決定如何結束包含BufferedReader.read方法的while循環。有代碼:使用BufferedReader.read()處理'文件'結尾

while((c = in.read()) != -1){        
    fw.write((char)c); 
    System.out.print((char)c); 
} 

但因爲它使用的插座,它從來沒有達到-1直到關閉套接字。我無法弄清楚while循環的結束語。有沒有特殊字符?

去與:

while((line = in.readLine()) != null && !line.equals(BasicProtocol.SENDING_FILE_DONE)) 

其中SENDING_FILE_DONE是被添加到該流的結尾的字符串。這不是一個好的方法,但必須以這種方式(我相信),當數據必須是一個字符串。

+0

我還沒有做到這一點,所以我不知道爲什麼在寫入到套接字時到達文件末尾時寫入-1? – Thihara 2013-03-21 02:44:53

+0

你嘗試in.readLine(),如果它工作,那麼你只需要檢查空? – 2013-03-21 02:45:20

+0

@Thihara沒有工作我害怕 – Titus 2013-03-21 02:49:21

回答

-1

如果您正在使用的BufferedReader,你可以嘗試閱讀整條生產線,一氣呵成..

String line; 
while((line = in.readLine()) != null) { 
    // your code here 
} 
+0

我需要追加換行符嗎?我如何保持它們獨立於系統? – Titus 2013-03-21 02:48:39

+0

writer.newLine(); //如果您使用BufferedWriter編寫。 – 2013-03-21 02:49:36

+0

什麼行?閱讀線如何解決EOS的問題? @Sudhanshu是的,你將不得不追加一個換行符,但如果該文件已經包含換行符,該怎麼辦?這不起作用。 -1。 – EJP 2013-03-21 02:57:42

1

我有必須發送一個文件的內容作爲字符串

客戶端服務器程序

爲什麼?餿主意。它應該以字節形式發送。否則,您將面臨數據損壞的風險。

和我無法決定如何結束含有BufferedReader.read()方法while循環

  1. 你不應該使用BufferedReader可言,你應該使用BufferedInputStream,避免假定該文件包含文本。
  2. 您應該在文件之前發送文件大小,並且您應該讀取文件大小,然後循環,直到您已經精確讀取了許多字節,或者您應該在發送文件後關閉套接字。
+0

是的,但不幸的是這個規範很愚蠢。這很爛,但我實際上已經使用了readline方法,因爲它更容易在最後附加一些文本,仍然 - 非常糟糕的設計,但不是選擇。 – Titus 2013-03-21 03:05:30

+0

所以你得到它使用readLine()?你可以請張貼更改嗎? – 2013-03-21 03:07:50

+0

我得到它的工作,但在一個次級方式。 I.e我可以用read()做同樣的事情,但是一個指定的EOF字符比字符串更可能發生,因此它只會'必須做'。 – Titus 2013-03-21 03:13:16