2009-09-16 29 views
9

Đây là một đoạn mã đơn giản:Command Line Pipe Input trong Java

import java.io.*; 
public class Read { 
public static void main(String[] args) { 
    BufferedReader f = new BufferedReader(new InputStreamReader(System.in)); 
    while(true) 
    { 
    String x = null; 
    try{ 
    x = f.readLine(); 
    } 
    catch (IOException e) {e.printStackTrace();} 
    System.out.println(x); 
    } 
} 
} 

tôi thực hiện điều này như: java đọc < INPUT.TXT

Khi INPUT.TXT là hoàn toàn cấp nước tập trung vào chương trình , x tiếp tục nhận null vô hạn. Tại sao vậy? Có cách nào mà tôi có thể làm cho Standard In (Command Line) hoạt động sau khi tập tin được đưa vào mã được thực hiện? Tôi đã thử đóng luồng và mở lại, nó không hoạt động. Đặt lại vv.

+0

Đã chỉnh sửa mã gốc để đưa câu trả lời được chấp nhận vào tài khoản. Bởi vì câu trả lời đó dường như không áp dụng cho mã này ngay bây giờ: mã không đọc một tệp từ danh sách arg hoặc bất kỳ điều nào như câu trả lời ngụ ý. Nó sẽ tốt hơn, trong trường hợp đó, để lại các mã sai lầm tại chỗ để làm cho toàn bộ trang này có ý nghĩa hơn. – Rondo

+0

@Rondo - không. [Ở đây] (http://stackoverflow.com/posts/1431551/revisions) là các bản sửa đổi. –

Trả lời

16

Bằng cách thực hiện "java Read < input.txt" bạn đã nói với các hệ điều hành mà cho quá trình này, các tập tin bằng đường ống tiêu chuẩn trong. Bạn không thể sau đó chuyển trở lại dòng lệnh từ bên trong ứng dụng.

Nếu bạn muốn thực hiện điều đó, hãy chuyển input.txt dưới dạng tham số tên tệp cho ứng dụng, mở/đọc/đóng tệp từ bên trong ứng dụng, sau đó đọc từ đầu vào chuẩn để lấy nội dung từ dòng lệnh .

+0

Cảm ơn bạn đã trả lời, nó làm rõ –

9

Vâng, điều này là điển hình cho việc đọc trong một BufferedReader. readLine() trả lại null khi kết thúc luồng được nhấn. Có lẽ vòng lặp vô hạn của bạn là vấn đề ;-)

// try/catch ommitted 

String x = null; 

while((x = f.readLine()) != null) 
{ 
    System.out.println(x); 
} 
6

Bạn cần phải chấm dứt vòng lặp while của bạn khi dòng là null, như thế này:

BufferedReader in = null; 
    try { 
     in = new BufferedReader(new InputStreamReader(System.in)); 
     String line; 
     while ((line = in.readLine()) != null) { 
      System.out.println(line); 
     } 
    } 
    catch (IOException e) { 
     logger.error("IOException reading System.in", e); 
     throw e; 
    } 
    finally { 
     if (in != null) { 
      in.close(); 
     } 
    } 
0

Có cách nào mà tôi có thể làm cho Standard In (Dòng lệnh) hoạt động sau khi tệp được nạp vào mã được thực hiện?

Xin lỗi để bump một câu hỏi cũ, nhưng không ai trong số các câu trả lời cho đến nay chỉ ra rằng có một (vỏ-only) cách để vượt qua trở lại để an ủi đầu vào sau khi đường ống trong một tập tin.

Nếu bạn chạy lệnh

{ cat input.txt & cat; } | java Read 

thì văn bản từ input.txt sẽ được chuyển đến java Read và sau đó bạn sẽ bị bỏ lại để an ủi đầu vào.

Lưu ý rằng nếu bạn sau đó nhấn Ctrl + D, bạn sẽ nhận được vòng lặp vô hạn của null s, trừ khi bạn sửa đổi chương trình của bạn để kết thúc vòng lặp khi nó nhận được null.

Các vấn đề liên quan