最近项目中要用到对大文件进行操作,做了下JAVA io方面的测试
对于java.io包中的FileOutputStream,BufferedOutputStream和FileWriter三个不同类写入到文本文件性能,
测试代码和结果如下:
环境: 机器ibm thinkpad 61i,
配置:2.0G双核CPU,2G内存,操作系统xp sp2,java api1.5.
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
public class TestTxtWriter {
public TestTxtWriter() {
}
public static void main(String[] args) {
FileOutputStream out = null;
FileOutputStream outSTr = null;
BufferedOutputStream Buff = null;
FileWriter fw = null;
int count = 10000000;// 写文件行数
try {
out = new FileOutputStream(new File("D:/FileOutputStream.txt"));
long begin = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
out.write("测试FileOutputStream,BufferedOutputStream和FileWriter,对文件写操作/r/n".getBytes());
}
out.close();
long end = System.currentTimeMillis();
System.out.println("FileOutputStream执行耗时:" + (end - begin) + " 豪秒");
outSTr = new FileOutputStream(new File("D:/BufferedOutputStream.txt"));
Buff = new BufferedOutputStream(outSTr);
long begin0 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
Buff.write("测试FileOutputStream,BufferedOutputStream和FileWriter,对文件写操作/r/n" .getBytes());
}
Buff.flush();
Buff.close();
long end0 = System.currentTimeMillis();
System.out.println("BufferedOutputStream执行耗时:" + (end0 - begin0) + " 豪秒");
fw = new FileWriter("D:/FileWriter.txt");
long begin3 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
fw.write("测试FileOutputStream,BufferedOutputStream和FileWriter,对文件写操作/r/n");
}
fw.close();
long end3 = System.currentTimeMillis();
System.out.println("FileWriter执行耗时:" + (end3 - begin3) + " 豪秒");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fw.close();
Buff.close();
outSTr.close();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
以下结果经过多次执行,取常出现的数据,由于只是简单比较,不做详细统计。
1.当count=1 000的,即写文件1 000行的时候,写出的文件大小为66.4KB:
FileOutputStream执行耗时:31 豪秒
BufferedOutputStream执行耗时:16 豪秒
FileWriter执行耗时:0 豪秒
2.当count=10 000的,即写文件10 000行的时候,写出的文件大小为664KB:
FileOutputStream执行耗时:78 豪秒
BufferedOutputStream执行耗时:32 豪秒
FileWriter执行耗时:15 豪秒
3.当count=100 000的,即写文件100 000行的时候,写出的文件大小为6.7MB:
FileOutputStream执行耗时:453 豪秒
BufferedOutputStream执行耗时:172 豪秒
FileWriter执行耗时:156 豪秒
4.当count=1 000 000的,即写文件1 000 000行的时候,写出的文件大小为64.8MB:
FileOutputStream执行耗时:4500 豪秒
BufferedOutputStream执行耗时:2422 豪秒
FileWriter执行耗时:2500 豪秒
5.当count=10 000 000的,即写文件10 000 000行的时候,写出的文件大小为648MB:
FileOutputStream执行耗时:52453 豪秒
BufferedOutputStream执行耗时:25921 豪秒
FileWriter执行耗时:36094 豪秒
FileOutputStream执行耗时:51547 豪秒
BufferedOutputStream执行耗时:35203 豪秒
FileWriter执行耗时:31609 豪秒
FileOutputStream执行耗时:50078 豪秒
BufferedOutputStream执行耗时:33515 豪秒
FileWriter执行耗时:29516 豪秒
由以上数据可以看到,如果不用缓冲流BufferedOutputStream,FileOutputStream写文件的鲁棒性是很不好的。当写 10 000 000行的文件的时候,FileOutputStream比FileWriter要慢10 000-21 000毫秒(10-21秒)。
不要小看这几秒的时间。当操作的数据量很大的时候,这点性能的差距就会很大了。在操作数据库,通过java导出生成数亿条记录文件的时候,等待的时间要10分钟以上,性能相差大了。
分享到:
相关推荐
本指南将深入探讨Java中的文件读写API,包括常用的方法、性能分析以及不同方式之间的对比。以下是对相关知识点的详细说明: 1. **File类**: Java中的`java.io.File`类是文件和目录路径名的抽象表示形式。它提供了...
在写文件时,Java提供了`FileOutputStream`和`FileWriter`。`FileWriter`主要用于写入文本文件,而`FileOutputStream`则更为通用,可以处理任何字节流。为了提高性能,通常会结合使用`BufferedOutputStream`。例如,...
首先,Java提供了一系列的类来支持文件操作,如`java.io.File`用于文件和目录的操作,`java.io.FileReader`、`java.io.FileWriter`用于文本文件的读写,`java.io.BufferedReader`、`java.io.BufferedWriter`用于提高...
I/O流是Java处理数据输入输出的关键部分,包括字节流(如`FileInputStream`和`FileOutputStream`)和字符流(如`FileReader`和`FileWriter`)。`InputStreamReader`和`OutputStreamWriter`用于在字节流与字符流之间...
Java 提供了 `FileReader` 和 `FileWriter` 类用于文本文件的读写。`FileReader` 用于读取字符流,而 `FileWriter` 用于写入字符流。如果需要处理二进制数据,可以使用 `FileInputStream` 和 `FileOutputStream`。...
- `FileReader`和`FileWriter`是字符流类,适用于处理文本文件,它们在内部使用了缓冲,但没有`BufferedReader`高效。 - `BufferedInputStream`和`BufferedOutputStream`是字节流的缓冲版本,可以与`...
在给出的代码片段中,使用了三种不同的方法写入文件:直接使用 `FileOutputStream`,配合 `BufferedOutputStream`,以及使用 `FileWriter`。每种方法都计算了写入一定数量行的时间,以比较它们的效率。 ### 注意...
对于音频等二进制文件,一般使用FileInputStream和FileOutputStream,或者BufferedInputStream和BufferedOutputStream进行读写,它们可以处理任何类型的数据,不受字符编码限制。 总结来说,Java IO流是处理输入...
- **FileReader** 和 **FileWriter**:这是字符流的基础类,用于读取和写入文本文件。使用它们时,需要注意字符编码。例如: ```java FileWriter writer = new FileWriter("Java写入文件1.txt"); writer.write(...
Java 二进制和文本输入输出 Java 中的输入输出(Input/Output,简称 I/O)是指Java 程序与外部世界交互的一种机制。Java 提供了多种方式来实现输入输出,包括二进制I/O 流和文本I/O 流。 二进制I/O 流 Java 中的...
- **FileReader与FileWriter**:用于读写文本文件,自动处理字符编码。用法类似FileInputStream,但需要配合BufferedReader和BufferedWriter提升性能。 3. **缓冲流(Buffered Stream)** - **BufferedReader与...
总的来说,Java提供了丰富的API来处理文件I/O,无论是文本数据还是二进制数据,都可以灵活地保存到指定的文件中。在编写代码时,理解不同类的功能、正确使用流以及妥善处理异常都是确保程序正确性和健壮性的重要因素...
8. **读写文件内容**:使用FileWriter的write()方法写入文本,使用BufferedReader的readLine()方法逐行读取文件内容。 9. **异常处理**:进行文件操作时,通常需要捕获IOException,这是所有I/O操作可能出现的异常...
- `FileInputStream`和`FileOutputStream`:分别用于读取和写入文件的字节流,通常配合`BufferedInputStream`和`BufferedOutputStream`使用以提高性能。 - `BufferedReader`和`BufferedWriter`:用于处理字符流,...
9. **高级特性**: `PrintWriter`类提供了格式化输出功能,`Files`类(Java 7引入)提供了更简洁的文件操作API,如`Files.write()`。 10. **NIO与通道**: Java NIO(非阻塞I/O)提供了通道(Channel)和缓冲区...
在`java.io`包中,`File`类用于表示文件或目录路径,`FileWriter`和`FileReader`用于文本文件的读写,而`BufferedInputStream`和`BufferedOutputStream`则用于二进制文件的处理。`java.nio`包引入了通道(Channel)...
- **`BufferedOutputStream`**: `BufferedOutputStream` 提供了缓冲机制,可以减少对磁盘的访问次数,从而提高写文件的速度。通常与 `FileOutputStream` 结合使用。 ```java FileOutputStream fos = new ...
本文将详细介绍三种常见的Java写入文件的方法,它们分别是:`FileOutputStream`、`BufferedOutputStream`和`FileWriter`。这三种方式各有特点,适用于不同的场景。 首先,我们来看`FileOutputStream`。`...
3. **字符流**:对于文本文件,Java提供了`FileReader`和`FileWriter`,它们是字符流,更适合处理文本数据。 4. **缓冲流**:为了提高效率,可以使用`BufferedInputStream`和`BufferedOutputStream`,以及对应的...