如果我漏掉了一些显而易见的东西...请看一下这段代码片段:
String readString;
String writeString = "O hai world.";
BufferedReader br = new BufferedReader(
new InputStreamReader(
new ByteArrayInputStream(writeString.getBytes()),
"UTF-8"),
1024);
readString = br.readLine();
System.out.println("readString: " + readString);
我期望这将打印"readString: null",因为我认为 BufferedReader 将在检测到有效的 EOL 之前遇到 EOF,但实际上它打印出 "readString: O hai world"。这似乎与 BufferedReader 的 Javadocs 所说的 readLine() 做什么相反:
“读取文本行。行被认为是以换行符 ('\n')、回车符 ('\r') 或回车符后面紧跟着换行符中的任何一个字符终止的。
返回:包含行内容(不包括任何行终止符)的字符串;如果已经到达流的末尾,则为null。”
我看不出来为什么我的字符串会被重新解释为以 '\n' 和/或 '\r' 结束...有人能给我点提示吗?谢谢!
编辑: 为了提供一些背景,我正在尝试编写 JUnit 测试来验证我编写的 Reader 类,该类旨在在 System.in 上进行读取。使用 ByteArrayInputStreams 似乎是模拟 System.in 的合理方法(请参见 this relevant SO post)。
当我的Reader捕获一行时,它目前依赖于BufferedReader.readLine()。对于我的目的,我的Reader的所有行都必须以'\n'或'\r'结尾;在没有EOL的情况下遇到EOF不应该解析为有效行。所以我现在的问题是这样的(当我有时间时,我会试着更详细地测试这些问题,但希望你们聪明的人能帮助我):
- BufferedReader.readLine()是否存在问题/文档错误?或者ByteArrayInputStream在其字节数组耗尽时返回了错误内容?
- 这种测试Reader的方法是否存在问题?当使用System.in进行readLine()时,我应该期望它能正常工作吗?我倾向于认为答案是肯定的。
- 有更好的方法模拟System.in进行单元测试吗?
- 如果我需要严格区分InputStream中的'\n'和'\r',那么自己编写readLine()方法是否更好?我会非常惊讶如果是这种情况。