此问题是对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字节写入文件?
答案 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怎么样?它将轻松解决您的问题。