【问题标题】:Carriage return and new line with Java and readLine()Java 和 readLine() 的回车和换行
【发布时间】:2011-01-21 11:58:47
【问题描述】:

我正在使用以下代码建立HTTP连接并读取数据:

con = (HttpURLConnection) new URL("http://stream.twitter.com/1/statuses/sample.json").openConnection();
...
con.connect();
while (line = rd.readLine()) {
    if (line.contains("\r\n")) {
      System.out.println("Carriage return + new line");
    }
} 

然而,“\r\n”似乎不是字符串的一部分 (line),尽管服务器确实返回了它们。如何读取数据并检测“\r\n”?

谢谢,

乔尔

【问题讨论】:

  • while (line = rd.readLine()) 甚至不会编译。另外,rd 是什么类型的,你是怎么得到它的?
  • 我假设您正在使用BufferedReaderrd,当您使用readLine()\n\r 阅读时,字符将从结果中删除,如果您看不到它们你用这个方法。您应该考虑使用read()

标签: java


【解决方案1】:

如果rdBufferedReader 类型,则无法确定readLine() 是否返回以\n\r\r\n 结尾的内容...行尾字符被丢弃而不是返回字符串的一部分。

如果你真的很在意这些角色,你不能通过readLine()。例如,您必须通过 read() 一个一个地读取字符。

【讨论】:

  • 我不喜欢以“他不应该关心那个”开头的问题/ cmets...例如,他可能坐在一个测试规范中,上面写着“寻找 \r\n 使用”。这不太可能,但重点是:你不知道
  • 使用BufferedReader没有错。只需使用基于字符的方法而不是 readLine()。
  • 我想您的意思是 readLine 而不是 getLine(仅在 javax.sound.* 中适用于 Java SE)
【解决方案2】:

来自javadocs

public String readLine() throws IOException

读取一行文本。行被视为由换行符 ('\n')、回车符 ('\r') 或回车符后紧跟换行符中的任何一个终止。
退货:
包含行内容的字符串,不包括任何行终止字符,如果已到达流的末尾,则为 null
抛出:
IOException - 如果发生 I/O 错误

【讨论】:

  • 但这并不能解决问题,如何获取字符串中的行终止字符?
  • @JaredBeekman JDK 文档很好,但不包括所有内容。例如,从这个描述中不清楚最后一个空行(在文本编辑器中经常看到)是作为空字符串返回还是根本不被视为一行。
【解决方案3】:

在 Java 中,readLine() 使用 \n\r 作为换行符和回车符来确定下一行。因此,当您使用readLine() 时,您将不会在控制台中显示\n\r 字符,因为这些字符将被readLine() 掩盖。更多关于readLine()的信息,请参考官方Oracle doc

为了避免这种行为,我们应该使用BufferedReader包中的read()方法。以下示例 sn-p 将有助于了解这些 \n\r 如何使用 read() 得到识别。

假设您有一个名为 test_lineFeed.txt 的文件,其中包含换行符,如果您想用某些已定义的格式替换它们,例如“CR-LF”(CR --> 回车, LF --> Line Feed),然后使用下面的 sn -p。

BufferedReader reader1 = new BufferedReader(
                new InputStreamReader(
                        new FileInputStream("/home/test_lineFeed.txt")
            ));

    int s1 = 0;
    String formattedString = "";
    while ((s1 = reader1.read()) != -1) {

        char character = (char) s1;

        System.out.println("Each Character: "+character+" its hexacode(Ascii): "+Integer.toHexString(character));
        //output : "0a" --> \n 
        //output : "0d" --> \r

        if (character == '\n'){
            formattedString+=" <LF> ";
        }else if (character =='\r'){
            formattedString+=" <CR> ";
        }else
            formattedString+=character;

    }
    System.out.println(formattedString);

【讨论】:

  • 如果您将character 变量(即char)与'\n''\r' 进行比较,您不会得到incomparable types: char and String 错误吗?
  • char 字符 = (char) s1;这是类型转换发生的地方。因此,我没有看到无与伦比的类型错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
  • 2011-02-19
  • 1970-01-01
相关资源
最近更新 更多