当前位置: 首页 > 知识库问答 >
问题:

如何使用BufferedReader读取CR LF行?

段干俊茂
2023-03-14

我试图创建一个简单的java服务器应用程序,但我很难用BufferedReader正确读取用户的输入。问题是行delimeter仅为CR LF(“\r\n”),因此我不能使用readLine()标准方法。因此,我尝试实现我自己的方法:

private String readCRLFLine(BufferedReader in) {

    StringBuilder result = new StringBuilder();
    char cr = 'a'; // initialize cr
    char lf;

    try {
        while (((lf = (char) in.read()) != '\n') && (cr != '\r')) {
            cr = lf;
            result.append(lf);
        }
        result.deleteCharAt(result.length() - 1); // delete \r from the result
    } catch (IOException ex) {
        // handle the exception here
    }

    return result.toString();
}

现在,当我尝试获取并打印结果时:

while ((userMessage = readCRLFLine(inputStream)) != null) {
        System.out.println(userMessage);
        break;
}

...它只将字符序列打印到第一个换行符(“\r”或“\n”),其余输入由第二次调用readCRLFLine(inputStream)方法读取,该方法应该已经读取了其他输入。

我希望能够处理输入,如:

“abc\rabc\n\r\abc\r\n”

在这种情况下,userMessage应该是:

“abc\rabc\n\r\abc”

我不能使用Scanner,它是“useDelimeter(“\r\n”)”方法,因为我需要用“clientSocket.SetSortimeout(TIMEOUT)”设置超时,据我所知,这在Scanner中是不可能的。

我的“readCRLFLine”方法有什么问题?这个问题还有别的解决办法吗?

任何帮助都将不胜感激。

共有1个答案

茅桐
2023-03-14

您的方法不正确,因为条件不是您实际需要的。

它表示"只要当前读取的字符不同于\n且前一个字符不同于\r,则继续读取"。

但这意味着,当您读取\n时,该条件为false,因为lf!='\n'为false。因此,它将在第一个\n时停止。它还会在\r后面的任何字符上停止,因为cr!='\r'将为false使组合条件为false。

当当前字符为\n而前一个字符为\r时,您希望停止循环。这意味着你的time条件应该是!lf==\n

现在请注意德摩根定律:“not(A和B)”相当于“not A或not B”。您错误地决定使用AND而不是OR。将您的条件更改为:

while (((lf = (char) in.read()) != '\n') || (cr != '\r')) {
   ...
}

顺便说一下,在将其转换为char并进行比较之前,您可能应该检查从中读取的值是否为负。负值表示客户端关闭了连接,如果发生这种情况,您将进入一个无休止的循环。

 类似资料:
  • 问题内容: 可以说我有一个文本文件:data.txt(包含2000行) 如何从500-1500,然后从1500-2000读取给定的特定行,并显示特定行的输出? 此代码将读取整个文件(2000行) 如何修改上述代码以读取特定行? 问题答案: 我建议使用java.io.LineNumberReader。它扩展了BufferedReader,您可以使用它来获取当前行号 您还可以使用Java 7 ,如果适

  • 问题内容: 我想使用BufferedReader在控制台中输入多行文本,然后单击“ Enter”以查找整个文本长度的总和。问题在于,似乎我进入了一个无限循环,当我按“ Enter”键时,程序并没有结束。我的代码如下: 你能告诉我我在做什么错吗? 问题答案: 阅读所有行的惯用方式是。另外,我建议发表声明。就像是 如果你想,当你收到一个空行来结束循环,在添加一个测试为循环 JLS-14.15。该声明说

  • 我写了一个简单的关于在客户端和服务器之间发送/接收消息的套接字教程。我使用DataOutputStream在流中写入字符串,但是如果我使用BufferedReader,服务器无法读取它 如果我使用PrintWriter来写(客户端),它可以工作。 这里怎么了?非常感谢。 1.客户: 2.服务器:

  • 问题内容: 我想优化此代码: 事情是,我不知道如何读取bufferedReader的内容并将其复制到String中,比我上面的速度更快。我需要花费尽可能少的时间。谢谢 问题答案: 在循环中使用字符串连接是 在 经典的性能杀手(因为字符串是不可变的,整个越来越大的字符串被复制为每个连接)。改为这样做:

  • 问题内容: 我在使用BufferedReader时遇到问题 我想打印一个文本文件的6行: 现在,从每次调用readLine()方法可以收集到的信息开始,它都会自动前进到下一行。 所以我不能使用条件br.readLine()!= null,因为它已经将其前进了一行,并且我得到了输出: 我使用什么条件来检查文本字段中是否还有新行。 提前致谢! 问题答案: 这就是问题: 您有两次调用-第一个 仅 检查是

  • 我想打印一个文本文件的6行: 现在,根据我每次调用readLine()方法时所收集到的信息,它会自动前进到下一行。 所以我不能使用条件br.readline()!=null,因为它已经提前了一行,我得到的输出是: 我使用什么条件来检查文本字段中是否还有新行。 提前道谢!