Kum*_*ran 4 java file-io filewriter fileoutputstream bufferedwriter
根据Java文档,
通常,Writer立即将其输出发送到基础字符或字节流。除非需要及时输出,否则建议将BufferedWriter包装在其write()操作可能会很昂贵的所有Writer周围,例如FileWriters和OutputStreamWriters。例如,
PrintWriter out =新的PrintWriter(新的BufferedWriter(新的FileWriter(“ foo.out”))));
将缓冲PrintWriter的输出到文件。如果不进行缓冲,则每次调用print()方法都会导致将字符转换为字节,然后将这些字节立即写入文件中,这可能会非常低效。
但是以下代码似乎像FileWriter在刷新到输出流之前也缓冲字节一样。
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class TestFileWriter {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
FileWriter fileWriter= new FileWriter("test.txt");
File file=new File("test.txt");
for (int i=0; i<1000; i++) {
fileWriter.write("a very long string, a very long string, a very long string, a very long string, a very long string\n");
if(i%50 == 0)
System.out.print("file size=" + file.length()+",");
}
fileWriter.close();
System.out.println("file size=" + file.length());
}
}
Run Code Online (Sandbox Code Playgroud)
输出:-
文件大小= 0,文件大小= 0,文件大小= 8192,文件大小= 8192,文件大小= 16384,文件大小= 24576,文件大小= 24576,文件大小= 32768,文件大小= 32768,文件大小= 40960,文件大小= 49152,文件大小= 49152,文件大小= 57344,文件大小= 57344,文件大小= 65536,文件大小= 73728,文件大小= 73728,文件大小= 81920,文件大小= 81920,文件大小= 90112,档案大小= 99000
为什么在写入数据时和写入时不将数据写入文件?
如果添加
fileWriter.flush();
Run Code Online (Sandbox Code Playgroud)
您会看到每行的尺寸都已更改。这意味着正在发生缓冲。
使用调试器,我将此跟踪到了StreamEncoder,它在Oracle JDK中没有源,但可以在线使用
private static final int DEFAULT_BYTE_BUFFER_SIZE = 8192;
private StreamEncoder(OutputStream out, Object lock, CharsetEncoder enc) {
// some deleted
if (ch == null) {
bb = ByteBuffer.allocate(DEFAULT_BYTE_BUFFER_SIZE);
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,编码器具有自己的缓冲区。
注意:由于这是一个内部类,因此将来可能会更改,并且可能无法在所有平台上以这种方式运行。
| 归档时间: |
|
| 查看次数: |
1401 次 |
| 最近记录: |