2012-10-29 3 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 물어 주시기 바랍니다 :

A는 입력 스트림은, 파이프로 연결된 출력 스트림에 연결해야합니다 파이프; 파이프 된 입력 스트림은 파이프 된 출력 스트림에 에 기록 된 데이터 바이트를 제공합니다.

ByteArrayInputStream

:

이 InputStream 스트림으로부터 판독 될 수있다 바이트를 포함하는 내부 버퍼를 포함한다. 는 (당신은 건설 중에 배열을 제공하고, 스트림은 그것에서 읽습니다.)

+0

감사합니다. PipedOutputStream을 감싸는 PipedInputStream을 사용하고 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을 사용한 다음 다른 OutputStream처럼 PipedOutputStream에 쓰는 것입니다. 다음은 완전한 예입니다.

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 : 예, ignis는 내가 예제를 코딩 할 때 처음에 대답을 얻었습니다. 예제가 다른 사람들에게 도움이 될 경우를 대비하여 어쨌든 답변을 게시했습니다. –

관련 문제