2012-10-29 29 views
0

我试图创建一个类似于System.in InputStream的InputStream类,但可以通过编程方式添加到(可以动态添加到的无尽InputStream)中如何创建一个类似于System.in的InputStream

如果你无法理解我的意思,这里就是我已经写了,并试图

public class QueuedInputStream extends InputStream { 

     private LinkedList<Character> list; 

     public QueuedInputStream() { 
      list = new LinkedList<Character>(); 
     } 

     @Override 
     public int read() throws IOException { 
      while (list.isEmpty()) { 
       try { 
        Thread.sleep(1); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
      int value = (byte)list.get(0).charValue(); 
      list.remove(); 
      return value; 
     } 

     public void queue(String s) { 
      char[] chars = s.toCharArray(); 
      for(int i = 0; i < chars.length; i++) { 
       list.add(chars[i]); 
      } 
     } 

    } 

我在正确的轨道上?或者我完全错误地试图做到这一点? 如果你要我解释更多,随意问

+0

看看PipedInputStream和ByteArrayInputStream。 – ignis

回答

2

PipedInputStream

管道输入流应该连接到管道输出流;所述 管道输入流然后提供所有数据字节被写入到 传送输出流。

ByteArrayInputStream

甲ByteArrayInputStream包含字节 可以从流中读取的内部缓冲区。 (您施工期间给予的阵列,并且流将读取它。)

+0

谢谢,使用的PipedInputStream缠绕绕的PipedOutputStream,并写入的PipedOutputStream做到了 –

+0

@ignis是不是这个不好的做法虽然对于单线程应用程序?请参阅[javadoc的(http://docs.oracle.com/javase/6/docs/api/java/io/PipedOutputStream.html)。我也很努力的事情Canain试图。 –

+0

@ Vance-Turner由于'java.io'输入流[阻止调用线程]而不鼓励(http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#read( )),而他们等待数据。 (请注意,这与Canain实现中的行为相同。)当您尝试从空管读取数据时,您希望程序执行什么操作?当然,阻塞管道流在单线程场景中是一个糟糕的选择。但是,非阻塞流很好。例如,它可能会抛出异常,或要求客户在构建时提供足够的数据。 – ignis

2

你的方法有一些优雅,而不是周围的时序逻辑。你应该支持你的流BlockingQueue,这样你就不必做糟糕的睡眠。如果在阻塞队列上拨打take(),呼叫将阻塞直到有输入。

但有可能你已经可以使用一些工具。一种选择是使用PipedInputStreamPipedOutputStream,然后写入PipedOutputStream像任何其他OutputStream。这里有一个完整的例子:

public static void main(String[] args) throws IOException, InterruptedException { 
    PipedOutputStream pipedOutputStream = new PipedOutputStream(); 
    final PipedInputStream in = new PipedInputStream(pipedOutputStream); 

    PrintWriter writer = new PrintWriter(pipedOutputStream, true); 

    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
      try { 
       for (String line; (line = reader.readLine()) != null;) { 
        System.out.println(line); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }).start(); 


    for (int i = 0; i < 1000; i++) { 
     writer.println(i); 
     Thread.sleep(1000); 
    } 
} 
+1

谢谢,你的回答是类似于使用的PipedInputStream和的PipedOutputStream –

+0

@Canain第一个:是的,伊格尼斯得到了他的第一次中的答案,因为我是编码的例子。无论如何,如果这个例子可以帮助别人,我也会发布答案。 –

相关问题