2016-01-22 75 views
0

在C++中,我通過傳遞std::ostream對象來節省大量時間。例如,我不會將所有數據記錄硬編碼爲std::cout,而是使std::cout成爲像這樣的函數的默認參數。Java中的C++風格多態輸出

void func(std::ostream os = std::cout) { 
    ... 
    os<<"Something"; 
    ... 
} 

這樣,如果我想同樣的數據後打印到文件,我可以通過調用func(file)其中file是一個std::ofstream做到這一點沒有問題。

我的問題是,在Java中,似乎沒有任何統一的I/O方式。我需要將完全相同的一組數據打印到控制檯和文件。我能做到的最簡潔的方式是什麼?如果我可以像std::ostreamstd::ofstream那樣多態地做到這一點,這將是我的偏好,因爲這是我習慣的。

+0

所以在Java中你有良好的日誌框架。如果你的目的是記錄,爲什麼要創造你自己的車輪。使用例如slf4j登錄你的東西,並做一個日誌配置,這給你更多的靈活性。 – Alex

回答

2

因爲PrintStream可以採取一個文件名作爲構造函數的參數,我將簡化保羅的回答是這樣的:

void someMethod(PrintStream ps) { 
    ps.print(...); 
    ps.format(....); 
    // etc 
} 

someMethod(System.out);       // Output to console 
someMethod(new PrintStream("file.out", "UTF-8")); // Output to a file 

Documentation here

+0

這正是我所期待的。它很簡潔,它反映了我習以爲常的機制。 – anthropomorphic

0

System.outPrintStream,寫入文件是通過在java中執行FileOutputStream。普通的超級班級是OutputStream。由於OutputStream只會寫byte[],byte和一些其他原語,不過你必須使用包裝類。

class OutputWrapper{ 
    private OutputStream os; 

    public OutputWrapper(OutputStream os){ 
     this.os = os; 
    } 

    public void print(String s){ 
     os.write(s.getBytes()); 
    } 

    public void flush(){ 
     os.flush(); 
    } 

    ... 
} 

void someMethod(OutputStream os){ 
    OutputWrapper out = new OutputWrapper(os); 
    out.print("Hello, World!"); 
    out.flush(); 
} 

someMethod(System.out);//print to console 
someMethod(new FileOutputStream("somefile.txt"));//print to file 

我在這裏省略了錯誤處理,這個例子是非常基本的,但這是最接近上述行爲的。

0

在你的情況的StringBuffer類java會達到目的。它的主要操作是append和insert方法,它們被重載以接受任何類型的數據。 要知道更多你可以參考StringBuffer_reference