powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Java :: вторничная классовая борьба с printf
14 сообщений из 14, страница 1 из 1
Java :: вторничная классовая борьба с printf
    #39998872
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для печати отчетов необходимо было сделать что-то типа.

Код: java
1.
2.
3.
new MultipleWriterHelper(System.out, new PrintWriter(new FileWriter("....business-ent-report.log"))
   .printf("Report branch = %s is here\n", branch)
   .printf("%s", body);



При этом тело отчота печатается в файл и дублируется на консоли чтоб девопс мог его видеть в реальном времени.

К сожалению экземпляр System.out и класс java.io.PrintWriter - не близкие родственники. У них общее - это
интерфейсы Appendable/Closable но это все не то. Там нет реализации форматной печати.

И красивого решения у меня пока не получается.

Как-бы вы сделали?
...
Рейтинг: 0 / 0
Java :: вторничная классовая борьба с printf
    #39998892
dimonz80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,


String.format("%s",...)
...
Рейтинг: 0 / 0
Java :: вторничная классовая борьба с printf
    #39998895
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimonz80, ммм мне придется дублировать вызовы? А я хотел нечто вроде списка стримов. И потом может еще slf4.Logger
добавлю.


Код: java
1.
2.
3.
4.
5.
6.
7.
public MultipleWriterHelper(Appendable ...appendables) {
   ....
}

void printf(String format, Object ...args) {
  ...
}
...
Рейтинг: 0 / 0
Java :: вторничная классовая борьба с printf
    #39998897
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не очень понимаю, что за красивое решение.

Я бы делал MultipleOutputStream, который все вызовы методов OutputStream'а раскидывает в два или более стреамов.

Мне кажется, что System.out спокойно должен кастоваться к OutputStream.

Соответственно:

new PrintWriter(
new MultipleOutputStream( System.out, new FileOutputStream("my_file") ),
)

Извиняюсь, если написал чуш.
...
Рейтинг: 0 / 0
Java :: вторничная классовая борьба с printf
    #39998901
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev, OutputStream - это уровень битов и байтов. А PrintWriter - это как-бы следующий слой абстракций.
Но я тоже об этом думал.
...
Рейтинг: 0 / 0
Java :: вторничная классовая борьба с printf
    #39998904
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
мне придется дублировать вызовы?

в смысле дублировать? appendables.forEach(a -> a.append(String.format))

mayton
И потом может еще slf4.Logger

ну тогда нужно более высокий уровень абстракции - какой-то свой интерфейс и обертки вокруг Appendable и любых других вариантов. Либо я жесто туплю, либо задача вроде как элементарная.

Leonid Kudryavtsev
Мне кажется, что System.out спокойно должен кастоваться к OutputStream.
имхо, это в целом те же яйца, вид сбоку
...
Рейтинг: 0 / 0
Java :: вторничная классовая борьба с printf
    #39998905
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Leonid Kudryavtsev, OutputStream - это уровень битов и байтов. А PrintWriter - это как-бы следующий слой абстракций.
Но я тоже об этом думал.


Ну так оберни OutputStream в OutputStreamWriter по вкусу.
Врят ли разные источники нужны в разных кодировках.

Ну или сделать MultipleWriter наследующий от Writer. Вроде не сильно много методов переопределять https://docs.oracle.com/javase/7/docs/api/java/io/Writer.html
...
Рейтинг: 0 / 0
Java :: вторничная классовая борьба с printf
    #39998913
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
new PrintWriter(
  new MultipleWriter( 
    new OutputStreamWriter( System.out, consoleCodepage ),
    new OutputStreamWriter( new FileOutputStream( fileName ), fileCodepage )
  ),
)



p.s. вроде в FileWriter нельзя кодепайдж передать, т.ч. если хочется указывать кодепайдж, все равно через OutputStream работать надо )))
...
Рейтинг: 0 / 0
Java :: вторничная классовая борьба с printf
    #39998916
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или я жутко туплю и чего-то не понимаю?
...
Рейтинг: 0 / 0
Java :: вторничная классовая борьба с printf
    #39998933
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha
mayton
мне придется дублировать вызовы?

в смысле дублировать? appendables.forEach(a -> a.append(String.format))

Да. Я думаю так я и сделаю.
...
Рейтинг: 0 / 0
Java :: вторничная классовая борьба с printf
    #39998975
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо.
...
Рейтинг: 0 / 0
Java :: вторничная классовая борьба с printf
    #39999384
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выдалось на работе свободное время, решил покодить на java )))


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
import java.io.IOException;
import java.io.PrintWriter;

public class MultiWriterTest {
    public final static void main( String argv[] ) throws IOException {
        PrintWriter p;
        p = new PrintWriter(
                new MultiWriter().addDest(System.out).addFileDest("d:\\log.txt").addFileDest("d:\\log2.txt")
        );
        p.printf("Hello %s", "world");
        p.close();
        return;
    }
};



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
import java.io.*;
import java.util.ArrayList;

public class MultiWriter extends Writer {
    ArrayList<Writer> writers;
    public MultiWriter() {
        writers = new ArrayList();
    }

    public MultiWriter addDest( Writer w ) {
        this.writers.add( w );
        return this;
    }

    public MultiWriter addDest( OutputStream s ) {
        return this.addDest( new OutputStreamWriter( s ) );
    }

    public MultiWriter addFileDest( String fname ) throws IOException {
        return this.addDest( new FileWriter( fname ) );
    }

    @Override
    public void write(char[] chars, int i, int i1) throws IOException {
        for ( Writer w : writers ) {
            w.write( chars, i, i1 );
        }
    }

    @Override
    public void flush() throws IOException {
        for ( Writer w : writers ) {
            w.flush();
        }
    }

    @Override
    public void close() throws IOException {
        for ( Writer w : writers ) {
            w.close();
        }

    }
}



...
Рейтинг: 0 / 0
Java :: вторничная классовая борьба с printf
    #39999502
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev @Override
public void write(char[] chars, int i, int i1) throws IOException {
for ( Writer w : writers ) {
w.write( chars, i, i1 );
}
}


Напомнило код из Бобины:

Код: java
1.
2.
3.
4.
5.
6.
7.
    void logMessage(Level level, String msg) {
        if (needsLogging(loggerName, level)) {
            destinations.each {
                it.logMessage(loggerName, level, msg)
            }
        }
    }



https://github.com/INFINITE-TECHNOLOGY/BOBBIN/blob/master/src/main/groovy/io/infinite/bobbin/Bobbin.groovy

это я к чему- Mayton - используй Бобину для этого.
https://i-t.io/website/#/Bobbin
...
Рейтинг: 0 / 0
Java :: вторничная классовая борьба с printf
    #39999534
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras, я от твоей бобины ночью вскакиваю и кричу.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Java :: вторничная классовая борьба с printf
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]