我正在尝试在两个 java 程序之间传输文本。为了简单起见,我展示这段代码:
import java.io.DataInputStream;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
DataInputStream stdin = new DataInputStream(System.in);
String completeText = "";
while (stdin.available() > 0) {
byte[] tempByte = { stdin.readByte() };
completeText += new String(tempByte);
}
System.out.println(completeText);
}
}
Run Code Online (Sandbox Code Playgroud)
在 Linux 或 Windows 上执行以下操作时,文本似乎被省略,就好像管道被阻塞或随机丢失一样。有时一切都会通过,有时则不然:
echo "omg wtf" | java Test | java Test
Run Code Online (Sandbox Code Playgroud)
对此有什么想法吗?CPU 速度越慢,文本通过的频率似乎越高。当输入从 java System.out.println() 传送时,“available”是否会因任何原因返回错误的结果?
干杯!
首先,该available()方法不是确定流是否耗尽的可靠方法。流结束的可靠指示是通过检查read()方法的返回值(< 0 表示流结束)。
简而言之,如果流暂时为空,则available()可以返回(这将终止循环)。false如果管道仍然处于活动状态,一旦管道另一端的进程向其中写入一些字节,这种情况就会改变。为了确保读取所有数据,您需要检查流结束。
其次,如果您想读取字符(并将它们连接成字符串),您应该从读取器读取字符(而不是从流中读取字节)。这将允许您的代码处理 unicode 字符。
第三,如果使用StringBuilder(而不是纯字符串),大块字符的串联速度会更快。
最后,如果您只需要读取字节,则可以直接使用输入流(不需要用 DataInputStream 包装它)。
我是这样写的:
Reader r = new InputStreamReader(System.in);
StringBuilder sb = new StringBuilder();
while(true) {
int ch = r.read();
if(ch < 0)
break;
sb.append((char) ch);
}
System.out.println(sb.toString());
Run Code Online (Sandbox Code Playgroud)