2010-11-20 65 views
1

我在UNIX环境中有一个Java程序,它需要将行缓冲数据传递到System.in中。从终端的键盘输入如何将行缓冲数据从文件重定向到程序而不是块缓冲数据

传递是好的,但是如果我尝试从文件的输入重定向的方式,如:

java the_program < input.txt 

程序将无法正确执行。

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

我曾尝试:

stdbuf -oL cat input.txt | java the_program 

stdbuf -i0 java the_program < input.txt 

以及

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

,但还没有任何运气。

任何想法或建议吗?

回答

0

大部分问题出现在Java程序中 - 为什么/它如何需要输入进行行缓冲?它的设计应该使用C的fgets()的模拟器,以便它每次只读一行。如果没有这样的模拟,那么你可能需要编写一个提供该服务的函数/类,将所提供的任何单元读取的任何内容,以及在线边界处拆分或连接起来。

如果不成功,您可能不得不沉迷于不可移植的操作,例如在管道文件描述符上使用fstat()系统调用,只在没有数据的情况下写入管道(查看st_size成员)。然而,它不能保证它能够工作 - 不重要的意味着它可能不会。显然,如果使用标准I/O,您可以确保程序一次写入一行并刷新输出。

+0

是的,我应该澄清。 java程序被设计为对非线性缓冲输入失败,并且应该假定“the_program”可以是接受标准输入的任何程序。目标是通过键盘模拟用户输入,但是用文本文件中的预定义测试。 – Milo 2010-11-20 01:20:03