Подсчет размера текстового файла в java при записи в файл

Этот вопрос является продолжением принятого ответа на этот вопрос. Я пытаюсь реализовать подход, предложенный Аароном: оборачивать FileOutputStream, чтобы включить логику для сохранения количества записанных байтов no.of. Однако такой подход, похоже, не работает должным образом. Кажется, что OutputStreamWriter использует StreamEncoder, который буферизует данные перед делегированием вызова метода FileOutputStream.write().

Вот небольшая демонстрация:

package Utils;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class MyFileOutputStream extends FileOutputStream{

private int byteCount;
public int getByteCount() {
    return byteCount;
}

public void setByteCount(int byteCount) {
    this.byteCount = byteCount;
}

public MyFileOutputStream(String arg0) throws FileNotFoundException {
    super(arg0);
    byteCount = 0;
}

@Override
public void write(byte[] b) throws IOException{
    byteCount += b.length;
    super.write(b);
}

@Override
public void write(byte[] b , int off , int len) throws IOException{
    byteCount += len;
    super.write(b, off, len);
}
}

И класс водителя:

  package main;
  import java.io.BufferedWriter;
  import java.io.FileNotFoundException;
  import java.io.FileOutputStream;
  import java.io.IOException;
  import java.io.OutputStreamWriter;
  import java.io.Writer;

  import Utils.MyFileOutputStream;

  public class Driver {

/**
 * @param args
 * @throws IOException 
 */
public static void main(String[] args) throws IOException {
    MyFileOutputStream fos = new MyFileOutputStream("testFile");
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
    for(int i=0;i<1000;i++){
        bw.write("Writing this string\n");
        System.out.println("Bytes Written : "+fos.getByteCount());
    }
    bw.close();
    System.out.println(fos.getByteCount());
}

}

Выход:-

Написано байт: 0
Написано байт: 0
...
Написано байтов: 8192
Написано байтов: 8192
...

Как видно из выходных данных, StreamEncoder буферизует до 8192 байт перед делегированием вызова метода write () FileOutputStream. Есть ли способ обойти это, чтобы в любой момент времени записывать байты no.of в файл?

2 ответа

Есть ли способ обойти это, чтобы в любой момент времени записывать байты no.of в файл?

Вот что ты получаешь. Количество байтов, которые были записаны в файл.

То, что вы действительно просите, это количество символов, которые были записаны в BufferedWriter , В этом случае, что вам нужно сделать, это обернуть / расширить BufferedWriter.

Вы можете flush() самый внешний писатель / поток. Что заставляет BufferedWriter преобразовать все символы в своем буфере в байты и отправить их в базовый FileOutputStream,

Обратите внимание, что это довольно дорогая операция: она не только преобразует байты, но и записывает их на диск. Так что если вы позвоните flush() слишком часто это будет плохо для общей производительности.

Другой вариант - уменьшить размер буфера, скажем, до 128. Это может привести к 64-кратному увеличению числа операций ввода-вывода, но даст более детальную картину.

Если производительность является проблемой, то вам нужно переместить буферизацию дальше вниз. Напишите прямо в OutputStreamWriter и обернуть FileOutputStream в классе, который расширяется BufferedOutputStream,

Таким образом, символы будут немедленно преобразованы в байты и добавлены в буфер в BufferedOutputStream, Теперь вам просто нужно спросить BufferedOutputStream сколько байт записано в FileOutputStream + this.count,

Как насчет CountingOutputStream? Это легко решит вашу проблему.

Другие вопросы по тегам