2013-03-21 277 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