2010-11-18 3 views
3

기본적으로 다른 클래스의 정수를 읽는 클래스를 만들고 있습니다.다른 클래스의 System.out.println (텍스트) 읽기

다른 클래스는 다음과 같은 순서로 정수를 System.out.printing된다

i i i i 
i i i i 
... etc. 

그래서 나는 기본적으로 문자열 파일을 만들고 싶어 또는 내가 처음에에서이 출력을 읽을 수있는 작품, 어떤 수업.

나는 스캐너 (System.in)를 만들어야하는지, 그리고 그렇다면 무엇을해야할지 잘 모르겠다.

나는 이것이 공개적으로 질문하는 것 같아서 사전에 사과드립니다.

+0

pastebin.com과 같은 사이트에 숙제 과제의 전체 텍스트를 게시하고 여기에 링크하여 볼 수 있습니까? 그것은 우리가해야 할 조언의 방향을 이해하는 데 도움이 될 수 있습니다. –

답변

0

System.setOut() 및 System.setErr()을 사용하여 표준 출력을 다른 스트림으로 리디렉션 한 다음 해당 스트림을 입력으로 파이프 할 수 있습니다.

1

System.out 하나 개의 솔루션으로 재 지정,하지만이 모든 클래스에 대한 System.out를 리디렉션 것입니다 - 당신은 할 수 없습니다 (쉽게) exclusivly이 하나 개의 클래스에 대한 리디렉션합니다.

이 "다른 클래스"는 사용자가 제어 할 수 있으며 코드를 재구성하려면 oppertunity로 가져올 수 있습니다.

public void print(int[] values) { 
    // ... 
    System.out.println(result); 
} 

은 다음

public String prepareResult(int[] values) { 
    // ... 
    return result; 
} 

public void print(int[] values) { 
    System.out.println(prepareResult(values)); 
} 

에 코드를 변경하고 문자열 출력을해야하는 경우 "prepareResult"방법을 호출 할 수 있습니다 그래서 어쩌면 당신은 같은 것을 가지고있다.

1

기본적으로 저는 실제로 디자인을 변경해야한다고 말하는 사람들과 동의합니다. "다른 클래스"는 결과를 준비하고 반환해야합니다.

하지만이 "다른 클래스"가 귀하의 통제하에 있지 않으면 다음을 제안합니다.

  1. stdout을 특수 스트림으로 보내려면 System.setOut()을 사용하십시오.
  2. 이 특수 스트림을 다음과 같이 구현하십시오. 스택 추적을 가져오고 호출 된 곳을 발견해야합니다. 형식이 이라면 "다른 클래스"가이를 알리기 위해 (특별한 대기열에 데이터를 쓰거나 등등) 아니면 그냥 stdout으로 출력하십시오.

API에 익숙하지 않은 경우 API를 구현하는 데 도움이되는 몇 가지 팁이 있습니다.

  • 새로운 Throwable(). getStackTrace() [0] .getClassName()이 코드를 호출 한 클래스를 반환합니다.
  • 자신 만의 outptut 스트림을 구현하는 것도 간단합니다.

public class FilterOutputStream extends OutputStream { 
    private OutputStream payload; 
    public FilterOutputStream(OutputStream payload) { 
     this.payload = payload; 
    } 

    public void write(int b) throws IOException { 
     if (isSpecialClass()) { 
      specialWrite(b); 
     } else { 
      payload.write(b); 
     } 
    } 
    public void flush() throws IOException { 
      payload.flush(); 
    } 
    public void close() throws IOException { 
     payload.close(); 
    } 
    public boolean isSpecialClass() { 
      return "MySpecialClass".equals(new Throwable().getStackTrace()[0].getClassName()); 
    } 

} 

이 코드를 시도하지 않았다, 그래서 아마 구문 오류가 있습니다,하지만 일반적인 생각을 보여줍니다. 이게 도움이 되길 바란다.

+0

+1, 멋진 아이디어. "isSpecialClass"의 테스트는 상당히 느리지 만 성능이 우수한 프로덕션 시스템은 콘솔에 인쇄해서는 안되므로 실제 문제는 아닙니다. –