2015-03-12 7 views
1

Жаль, что я много искал, но не смог найти ответ на него. Если есть, я извиняюсь и, пожалуйста, дайте мне знать.Как получить значение, которое я отправил через System.out.println?

Если я отправил значение через System.out.println или .print, есть ли способ его получить? Я имею в виду, после отправки получить все значения, отправленные через System.out и последнее отправленное значение?

System.out.println("Hi"); 
String val = System.\\something 
String last = System.\\something else 

Спасибо

+0

String message = "Hi"; System.out.println (сообщение); Строка last = message; – Ascalonian

+0

Это не то, что я хочу. Если значение отправлено другой функцией или чем-то еще, что я не могу редактировать, я не могу получить значение. Извините, я знал этот метод, но это не то, что я хочу. И поэтому я передал литерал, а не переменную. – frunkad

+0

Вы хотите динамически получать историю всех сообщений, отправленных для печати? – Skeptor

ответ

2

Я думаю, ниже код будет полезен для вас:

Создать класс и расширить PrintStream

class StorePrintStream extends PrintStream { 

    public static List<String> printList = new LinkedList<String>(); 

    public StorePrintStream(PrintStream org) { 
     super(org); 
    } 

    @Override 
    public void println(String line) { 
     printList.add(line); 
     super.println(line); 
    } 

    public void println(int line) { 
     this.println(String.valueOf(line)); 
    } 

    // And so on for double etc.. 
} 

Теперь используйте выше класс для отслеживания информации о печати:

public class Test { 
     public static void main(String[] args) throws Exception { 
     System.setOut(new StorePrintStream(System.out)); 
     System.out.println("print line"); 
     Test2 t2 = new Test2(); 
     t2.meth1(); 
     System.out.println(StorePrintStream.printList); 
     } 
    } 

class Test2 { 
    public void meth1() { 
     System.out.println("another print"); 
    } 
} 
+0

Должен ли я переопределить все параметры? Как для int double и другого объекта? Любой способ сделать это быстрее? – frunkad

+0

Вы должны позаботиться о "print()", "printf()" и "println()" - http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6 -b14/Java/IO/PrintStream.java # PrintStream.print% 28long% 29 – Kartic

2

Там, кажется, немного непонимания того, что делает System.out.println. System.out.println отправляет String в Outputstream (stdout) программы Java. Поэтому он возвращается в операционную систему. Это обычно используется, чтобы сделать вывод видимым для пользователя, но также и для других приложений. Другое приложение может прочитать это с помощью System.in.read.

В вашем случае вы хотели бы использовать вывод в том же приложении, что необязательно, потому что приложение знает свои собственные данные.

Если вам нужно сохранить историю выведенных данных, вы можете, конечно, сохранить историю в своем приложении - (как указано в комментарии), украшенный PrintStream может выполнить эту работу.

Если вы новичок на Java, может быть проще написать новый метод, который хранит вашу историю. Например. Вы можете добавить следующие строки в ваш класс:

private static LinkedList<String> stdoutHistory; 

public static void betterPrintln(String s) 
{ 
    System.out.println(s); 
    stdoutHistory.add(s); 
} 

// this method returns the last printed output 
public static String getLastOutput() 
{ 
    return stdoutHistory.get(stdoutHistory.count()-1); 
} 

, а затем вызвать этот метод, чтобы напечатать что-то

+0

Не будет 'setOut' лучше? – frunkad