【发布时间】:2013-09-02 07:35:15
【问题描述】:
*注意:为了澄清,也许这个问题对于 InputStream 是“活着的”不是很清楚。与 telnet 天气服务的连接(请参阅下面的链接)保持打开状态。目标是获取来自服务器的所有行。*
从示例 Apache WeatherTelnet code 构建,我使用 InputStream.read 来输出服务器结果(受 javamex tutorial 习惯用法的启发)一次一个字符,使用 chars 方法:
thufir@dur:~$
thufir@dur:~$ java -jar NetBeansProjects/Teln/dist/Teln.jar
------------------------------------------------------------------------------
* Welcome to THE WEATHER UNDERGROUND telnet service! *
------------------------------------------------------------------------------
* *
* National Weather Service information provided by Alden Electronics, Inc. *
* and updated each minute as reports come in over our data feed. *
* *
* **Note: If you cannot get past this opening screen, you must use a *
* different version of the "telnet" program--some of the ones for IBM *
* compatible PC's have a bug that prevents proper connection. *
* *
* comments: jmasters@wunderground.com *
------------------------------------------------------------------------------
Press Return to continue:
^Cthufir@dur:~$
这是所需的输出。但是,使用BufferedReader 读取InputStream 会导致删除最后一行。 (或者,至少,它没有打印到控制台。)错误的输出,使用lines 方法:
thufir@dur:~$
thufir@dur:~$ java -jar NetBeansProjects/Teln/dist/Teln.jar
------------------------------------------------------------------------------
* Welcome to THE WEATHER UNDERGROUND telnet service! *
------------------------------------------------------------------------------
* *
* National Weather Service information provided by Alden Electronics, Inc. *
* and updated each minute as reports come in over our data feed. *
* *
* **Note: If you cannot get past this opening screen, you must use a *
* different version of the "telnet" program--some of the ones for IBM *
* compatible PC's have a bug that prevents proper connection. *
* *
* comments: jmasters@wunderground.com *
------------------------------------------------------------------------------
^Cthufir@dur:~$
thufir@dur:~$
StreamReadercode:
package teln;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class StreamReader {
private StreamReader() {
}
StreamReader(InputStream inputStream) throws IOException {
lines(inputStream);
}
private void chars(InputStream inputStream) throws IOException {
do {
char ch = (char) inputStream.read();
System.out.print(ch);
} while (true);
}
private void lines(InputStream inputStream) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
String line = "";
do {
System.out.println(line);
} while ((line = br.readLine()) != null);
System.out.println(line);
}
}
大概最后一行是“null”吗?是否可以更改逻辑以便从lines 中打印最后一行,就像从chars 中一样?
【问题讨论】:
-
嗯,你指的是哪一行?除了第二个版本中的空白行之外,我没有看到您的输出有任何差异……除非您的意思是“按回车键继续”,它看起来很可能根本不在输入数据中。 (您的
chars方法将继续执行,直到抛出异常,例如...) -
逐行读取有这个缺点,该行必须以
\n字符结尾,如果没有,则不认为是完整的行。 -
@JohnKugelman:它仍然会被退回。我怀疑这里还有其他事情 - 不幸的是,我们没有足够的关于输入数据的信息来知道什么。一个简短但完整的程序来演示这个问题真的很有帮助。
-
不是它不会... telnet 是一个懒惰的协议,它不会在最后一行结束,所以它不被认为是完整的...这就是为什么大多数 telnet 实现使用
waitfor例程 -
最后看到的
null是最后一个System.out.println(line);的原因
标签: java newline inputstream bufferedreader eol