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

Код: 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
15.09.2020, 16:49
    #39998892
dimonz80
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java :: вторничная классовая борьба с printf
mayton,


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


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

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

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

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

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

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

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

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

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

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

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


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

Ну или сделать MultipleWriter наследующий от Writer. Вроде не сильно много методов переопределять https://docs.oracle.com/javase/7/docs/api/java/io/Writer.html
...
Рейтинг: 0 / 0
15.09.2020, 17:13
    #39998913
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java :: вторничная классовая борьба с printf
Код: 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
15.09.2020, 17:18
    #39998916
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java :: вторничная классовая борьба с printf
или я жутко туплю и чего-то не понимаю?
...
Рейтинг: 0 / 0
15.09.2020, 17:45
    #39998933
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java :: вторничная классовая борьба с printf
chpasha
mayton
мне придется дублировать вызовы?

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

Да. Я думаю так я и сделаю.
...
Рейтинг: 0 / 0
15.09.2020, 19:32
    #39998975
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java :: вторничная классовая борьба с printf
Всем спасибо.
...
Рейтинг: 0 / 0
16.09.2020, 15:53
    #39999384
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java :: вторничная классовая борьба с printf
Выдалось на работе свободное время, решил покодить на 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
16.09.2020, 18:20
    #39999502
dakeiras
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java :: вторничная классовая борьба с printf
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
16.09.2020, 20:04
    #39999534
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java :: вторничная классовая борьба с printf
dakeiras, я от твоей бобины ночью вскакиваю и кричу.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Java :: вторничная классовая борьба с printf / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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