Вопрос на PrintStream буферизуется, но очистка не снижает производительность, а BufferedOutputStream повышает производительность пишет, что
PrintStream буферизируется путем добавления операции очистки после каждой печати(), быстродействие должно значительно ухудшиться, но это вовсе не так, как показано в приведенном ниже фрагменте кода.
// PrintStream is buffered but takes 4228ms to complete
long start = System.currentTimeMillis();
try (PrintStream ps = new PrintStream(new FileOutputStream("1.txt") ))
{
for (int i = 0; i < 1_000_000; i++) {
ps.print(i + " ");
}
}
long stop = System.currentTimeMillis();
System.out.println(stop - start);
// PrintStream is buffered, but with auto-flush takes 4140ms to complete, no degraded speed implying flush did nothing
start = System.currentTimeMillis();
try (PrintStream os = new PrintStream(new FileOutputStream("1.txt") ))
{
for (int i = 0; i < 1_000_000; i++) {
os.print(i + " ");
os.flush();
}
}
stop = System.currentTimeMillis();
System.out.println(stop - start);
В ответе на https://stackoverflow.com/a/42682673/10082400 написано, что:
Хотя внутренние элементы PrintStream
"буферизируются", метод записи сбрасывает внутренние буферы в базовый поток на каждом write()
.
внутренние "буферы" действительно предназначены для преобразования символов в байты
В реализации PrintStream
, в частности write()
,print()
и println()
, я вижу, что все методы записи вызывают flush()
, только когда autoFlush
истинно и условие, которое оно представляет, истинно.Это противоречит "методу записи, сбрасывающему внутренние буферы в базовый поток на каждом write()
" в ответе?
Я также вижу, что PrintStream
косвенно использует буфер в его BufferedWriter
поле textOut
.Где внутренний буфер PrintStream
его собственный?