2016-01-22 1 views
0

В C++ я использовал для сохранения себя много времени, пройдя около std::ostream объектов. Вместо, например, жесткого кодирования всего моего журнала данных до std::cout, я бы сделал std::cout параметром по умолчанию для такой функции.Полиморфный вывод в стиле C++ в Java

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

Таким образом, если я хотел напечатать те же данные в файл позже, я не мог сделать это без проблем, вызвав func(file) где file был std::ofstream.

Моя проблема в том, что на Java не существует единого способа выполнения операций ввода-вывода. Мне нужно напечатать точно такой же набор данных на консоли и в файле. Каким образом я могу это сделать? Если я смогу сделать это полиморфно, как я использовал с std::ostream и std::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.out - PrintStream, запись в файлы осуществляется через FileOutputStream в java. Общий суперкласс - 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 будет служить этой цели. Его основными операциями являются методы добавления и вставки, которые перегружены, чтобы принимать данные любого типа. Чтобы узнать больше, вы можете обратиться к StringBuffer_reference

Смежные вопросы