1

我在 UNIX 环境中有一个 java 程序,它需要将行缓冲数据传递到 System.in。

从终端传入键盘输入很好,但是如果我尝试以如下方式重定向来自文件的输入:

java the_program < input.txt

该程序将无法正常执行。

我可以通过哪些方式将行缓冲而不是块缓冲数据通过标准输入传递到程序中?

我试过了:

stdbuf -oL cat input.txt | java the_program

stdbuf -i0 java the_program < input.txt

grep --line-buffered . input.txt | java the_program

但没有任何运气。

有什么想法或建议吗?

4

1 回答 1

0

大多数问题出在Java程序中-为什么/如何需要对输入进行行缓冲?它应该设计为使用 C 的类似物,fgets()以便一次只读取一行。如果没有这样的类比,那么也许您需要编写一个提供该服务的函数/类,在提供的任何单元中获取您可以读取的任何内容,并在行边界处拆分或连接。

否则,您可能不得不沉迷于不可移植的操作,例如fstat()在管道文件描述符上使用系统调用,仅在管道中没有数据时才写入管道(查看st_size成员)。但是,不能保证它会工作 - 不可移植意味着它可能不会。显然,如果使用标准 I/O,您将​​确保您的程序一次写入一行并刷新输出。

于 2010-11-20T01:01:57.263 回答