`
imshare
  • 浏览: 323676 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

java API 写文本文件比较 FileOutputStream, BufferedOutputStream, FileWriter

    博客分类:
  • Java
阅读更多
最近项目中要用到对大文件进行操作,做了下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的用法指南,性能分析与对比。

    本指南将深入探讨Java中的文件读写API,包括常用的方法、性能分析以及不同方式之间的对比。以下是对相关知识点的详细说明: 1. **File类**: Java中的`java.io.File`类是文件和目录路径名的抽象表示形式。它提供了...

    Java文件读写.pdf

    在写文件时,Java提供了`FileOutputStream`和`FileWriter`。`FileWriter`主要用于写入文本文件,而`FileOutputStream`则更为通用,可以处理任何字节流。为了提高性能,通常会结合使用`BufferedOutputStream`。例如,...

    java文件读写

    首先,Java提供了一系列的类来支持文件操作,如`java.io.File`用于文件和目录的操作,`java.io.FileReader`、`java.io.FileWriter`用于文本文件的读写,`java.io.BufferedReader`、`java.io.BufferedWriter`用于提高...

    java API帮助文档

    I/O流是Java处理数据输入输出的关键部分,包括字节流(如`FileInputStream`和`FileOutputStream`)和字符流(如`FileReader`和`FileWriter`)。`InputStreamReader`和`OutputStreamWriter`用于在字节流与字符流之间...

    Java I/O文件读写/删除/复制等

    Java 提供了 `FileReader` 和 `FileWriter` 类用于文本文件的读写。`FileReader` 用于读取字符流,而 `FileWriter` 用于写入字符流。如果需要处理二进制数据,可以使用 `FileInputStream` 和 `FileOutputStream`。...

    Java io 读写文件

    - `FileReader`和`FileWriter`是字符流类,适用于处理文本文件,它们在内部使用了缓冲,但没有`BufferedReader`高效。 - `BufferedInputStream`和`BufferedOutputStream`是字节流的缓冲版本,可以与`...

    Java文件读写[文].pdf

    在给出的代码片段中,使用了三种不同的方法写入文件:直接使用 `FileOutputStream`,配合 `BufferedOutputStream`,以及使用 `FileWriter`。每种方法都计算了写入一定数量行的时间,以比较它们的效率。 ### 注意...

    java IO流实例,包括文件的读写、上传和下载

    对于音频等二进制文件,一般使用FileInputStream和FileOutputStream,或者BufferedInputStream和BufferedOutputStream进行读写,它们可以处理任何类型的数据,不受字符编码限制。 总结来说,Java IO流是处理输入...

    JAVA文件流控制台程序

    - **FileReader** 和 **FileWriter**:这是字符流的基础类,用于读取和写入文本文件。使用它们时,需要注意字符编码。例如: ```java FileWriter writer = new FileWriter("Java写入文件1.txt"); writer.write(...

    Java 的二进制和文本输入输出

    Java 二进制和文本输入输出 Java 中的输入输出(Input/Output,简称 I/O)是指Java 程序与外部世界交互的一种机制。Java 提供了多种方式来实现输入输出,包括二进制I/O 流和文本I/O 流。 二进制I/O 流 Java 中的...

    java io读取文件

    - **FileReader与FileWriter**:用于读写文本文件,自动处理字符编码。用法类似FileInputStream,但需要配合BufferedReader和BufferedWriter提升性能。 3. **缓冲流(Buffered Stream)** - **BufferedReader与...

    java 将数据保存到指定的文件中

    总的来说,Java提供了丰富的API来处理文件I/O,无论是文本数据还是二进制数据,都可以灵活地保存到指定的文件中。在编写代码时,理解不同类的功能、正确使用流以及妥善处理异常都是确保程序正确性和健壮性的重要因素...

    java文件流学习实验

    8. **读写文件内容**:使用FileWriter的write()方法写入文本,使用BufferedReader的readLine()方法逐行读取文件内容。 9. **异常处理**:进行文件操作时,通常需要捕获IOException,这是所有I/O操作可能出现的异常...

    Java读写文件及FTP例子.docx

    - `FileInputStream`和`FileOutputStream`:分别用于读取和写入文件的字节流,通常配合`BufferedInputStream`和`BufferedOutputStream`使用以提高性能。 - `BufferedReader`和`BufferedWriter`:用于处理字符流,...

    Java 实例 - 文件写入源代码-详细教程.zip

    9. **高级特性**: `PrintWriter`类提供了格式化输出功能,`Files`类(Java 7引入)提供了更简洁的文件操作API,如`Files.write()`。 10. **NIO与通道**: Java NIO(非阻塞I/O)提供了通道(Channel)和缓冲区...

    android文件读写源码

    在`java.io`包中,`File`类用于表示文件或目录路径,`FileWriter`和`FileReader`用于文本文件的读写,而`BufferedInputStream`和`BufferedOutputStream`则用于二进制文件的处理。`java.nio`包引入了通道(Channel)...

    java基础资料以及基本算法

    - **`BufferedOutputStream`**: `BufferedOutputStream` 提供了缓冲机制,可以减少对磁盘的访问次数,从而提高写文件的速度。通常与 `FileOutputStream` 结合使用。 ```java FileOutputStream fos = new ...

    欧柏泰克:java写入文件的三种方式

    本文将详细介绍三种常见的Java写入文件的方法,它们分别是:`FileOutputStream`、`BufferedOutputStream`和`FileWriter`。这三种方式各有特点,适用于不同的场景。 首先,我们来看`FileOutputStream`。`...

    java文件操作大全

    3. **字符流**:对于文本文件,Java提供了`FileReader`和`FileWriter`,它们是字符流,更适合处理文本数据。 4. **缓冲流**:为了提高效率,可以使用`BufferedInputStream`和`BufferedOutputStream`,以及对应的...

Global site tag (gtag.js) - Google Analytics