2010-11-20 63 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