在写入文件时计算java中文本文件的大小

时间:2014-05-04 04:34:08

标签: java io filesize fileoutputstream io-buffering

此问题是对this question中接受的答案的跟进。我正在尝试实现Aaron建议的方法:包装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在委托调用FileOutputStream的write()方法之前缓冲多达8192个字节。是否有任何解决方法可以在任何时刻将no.of字节写入文件?

3 个答案:

答案 0 :(得分:1)

  

是否有任何解决方法可以在任何时刻将no.of字节写入文件?

这就是你得到的。已写入文件的字节数。

您真正要求的是已经写入BufferedWriter的字符数。在这种情况下,您需要做的是包装/扩展{{ 1}}

答案 1 :(得分:1)

你可以flush()最外层的作家/流。这迫使BufferedWriter将其缓冲区中的所有字符转换为字节,并将它们发送到基础FileOutputStream

请注意,这是一个有点昂贵的操作:它不仅会转换字节,而且实际上会将它们写入磁盘。因此,如果您过于频繁地致电flush(),那将对整体表现造成不利影响。

另一种选择是将缓冲区大小减小到128.这将导致IO的64倍,但会提供更精细的图像。

如果性能有问题,那么您需要进一步降低缓冲。直接写入OutputStreamWriter并将FileOutputStream包含在扩展BufferedOutputStream的类中。

这样,字符将立即转换为字节并添加到BufferedOutputStream中的缓冲区中。现在,您只需询问BufferedOutputStream已向FileOutputStream + this.count写入的字节数。

答案 2 :(得分:1)

CountingOutputStream怎么样?它将轻松解决您的问题。