Java 处理'的结束;文件';使用BufferedReader.read()

Java 处理'的结束;文件';使用BufferedReader.read(),java,sockets,Java,Sockets,我有一个客户机-服务器程序,它必须以字符串形式发送文件内容,并且在决定如何结束包含BufferedReader.read方法的while循环时遇到困难。我的代码如下: while((c = in.read()) != -1){ fw.write((char)c); System.out.print((char)c); } 但是当它使用套接字时,在套接字关闭之前,它永远不会达到-1。我想不出while循环要达到的结束子句。

我有一个客户机-服务器程序,它必须以字符串形式发送文件内容,并且在决定如何结束包含BufferedReader.read方法的while循环时遇到困难。我的代码如下:

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是添加到流末尾的字符串。这不是一种很好的方法,但当数据必须是字符串时,必须采用这种方法(我相信)。

如果您使用的是BufferedReader,您可以尝试一次性读取整行数据

String line;
while((line = in.readLine()) != null) {
  // your code here
}
我有一个客户端-服务器程序,它必须以字符串形式发送文件内容

为什么??坏主意。它应该以字节的形式发送。否则,您将面临数据损坏的风险

我很难决定如何结束包含
BufferedReader.read()方法的while循环

  • 您根本不应该使用
    BufferedReader
    ,应该使用
    BufferedInputStream
    ,以避免假设文件包含文本
  • 您应该在发送文件之前先发送文件大小,然后读取文件大小,然后循环直到完全读取了那么多字节,或者在发送文件后关闭套接字

  • 我没有这样做,所以我不确定,为什么不在写入套接字时到达文件结尾时写入-1?您是否尝试了.readLine(),如果它可以工作,那么您只需要检查null?@Thihara不工作afraid@Thihara不能写入-1,只能写入一个字节,即使可以,也不会导致read()返回-1。发生这种情况的原因是带外EOS指示:对于TCP套接字,段中有一个FIN标志。@提图斯:这一点不好。@EJP字节值
    0xFF
    为-1。只是说,我需要添加换行符吗?如何保持它们的系统独立性?writer.newLine();//如果您正在使用BufferedWriter进行写入。哪一行?读线如何解决EOS的问题@Sudhanshu是的,您必须附加一个换行符,但是如果文件已经包含换行符怎么办?这是行不通的-1.我们不能使用BufferedReader从套接字读取数据吗?我不明白为什么上面的代码不能工作?我已经告诉过你了。使用
    readLine()
    假定文件中没有内部换行符。如果有的话,你只会得到这个文件。是的,但不幸的是,这是一个愚蠢的任务与该规范。这很糟糕,但我实际上使用了readline方法,因为它更容易在末尾添加一些文本,但仍然是非常糟糕的设计,但不是出于选择?你能把这些变化贴出来吗?我让它工作起来了,但没有达到标准。也就是说,我本可以对read()执行相同的操作,但一个指定的EOF字符比字符串更可能出现,因此它将“不得不这样做”。@Titus如果数据包含换行符怎么办
    readLine()
    根本不是一个解决方案。我已经给了你一个。发送文件后,只需关闭套接字。然后你有了你的EOS条件,你的原始代码就可以工作了。