2011-03-17 43 views
30

Ben System.setOut yöntemi kullanarak herhangi bir kullanıcı tanımlı değere Standart Çıktı Akışı ayarlamak için Java bir işlev olduğunu biliyoruz ..sıfırlanması Standart çıkış Akış

Ama oldu birine standart çıktıyı sıfırlamak için herhangi bir yöntem yoktur Daha önce mi depolanmış mı yoksa standart çıktı mı?

cevap

63

Dosya tanıtıcısını FileDescriptor.out üzerinden standart olarak alabilirsiniz. konsola yazdırmak için dışarı standart sıfırlamak için aşağıdaki gibi

System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out))); 

başka yolu da, sadece orijinal nesneye tutunmak olduğunu yapın:

PrintStream stdout = System.out; 
System.setOut(new PrintStream(logFile)); 

// ... 

System.setOut(stdout);     // reset to standard output 
22

Bu eski bir sorudur, ancak ortaya çıkıyor Google aramada her zaman ve ben bunu düzeltmek istedim. Aslında, FileDescriptor sınıfını kullanarak alabilirsiniz. new PrintStream(new FileOutputStream(FileDescriptor.out))) numaralı telefonu arayarak, stdout'a basan bir şey vermelisiniz. Kabul cevap yanlışsa

import java.io.FileDescriptor; 
import java.io.FileOutputStream; 
import java.io.PrintStream; 


public static void main(String [] args) { 
    System.err.println("error."); 
    System.out.println("out."); 
    System.setOut(System.err); 
    System.out.println("error?"); 
    System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out))); 
    System.out.println("out?"); 
} 
+0

bu daha upvoted değildir gelmek nasıl ... – Jas

+1

sen açıklayabilir misiniz ('System.setOut (stdout) yani eğer;' olarak beklenen çalışır)? Orijinal akışınızı depolamak için yönteminize bir avantaj var mı? Ayrıca, 'System.out' ve benzerlerinin hepsinin 'final' olarak işaretlendiğini, Java'nın setOut() 'un kapakların altında nasıl işlendiğine dair herhangi bir fikir verebileceğinizi merak ediyorum. – dimo414

+1

'System.out' ve' System.err', temel yerel C kodu tarafından işlenir. Onlar "final" olarak işaretlenirler, böylece sanal gerçeklik "farketmeksizin" işaretçi değerleri değiştirilmez. Sağlanan “setOut()” yöntemi, yerel parçanın dahili referanslarını ayarlamasına izin vermek için gereklidir. – ksmonkey123

İlgili konular