`

java 几种读取文件的方法比较

阅读更多
影响java io性能的原因之一是大量使用单字符io操作,即用inputStream.read(),Reader.read()每次读取一个字符。
缓冲可以通过两个方法实现:使用java提供的BufferedReader和BufferedInputStream实现,或者是块读取方法一次读取一大块数据
package useBuffer;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
//使用不同缓冲区读取文件
public class BufferTest {

	public static void main(String[] args) {

		File file = new File("D:\\zhoujunmei\\downloads\\XPath.chm");
		BufferTest t = new BufferTest();
		long start = System.currentTimeMillis();
		t.read1(file);
		System.out.println("read1耗时:"+(System.currentTimeMillis()-start)+"MS");
		
		start = System.currentTimeMillis();
		t.read2(file);
		System.out.println("read2耗时:"+(System.currentTimeMillis()-start)+"MS");
		
		start = System.currentTimeMillis();
		t.read3(file);
		System.out.println("read3耗时:"+(System.currentTimeMillis()-start)+"MS");
	}

	public void read2(File file){  //使用缓冲区,从缓冲区中读取字符,大大减少通过底层的I/O操作
		try {
			FileInputStream fis = new FileInputStream(file);
			BufferedInputStream bis = new BufferedInputStream(fis);
			int cnt =0;
			int b;
			while((b=bis.read())!=-1){
				if(b=='\n')
				cnt++; //记录行数
			}
			bis.close(); //不用关闭fileinputstream???
			System.out.println("文件行数:"+cnt);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void read1(File file){ //逐个读取字符
		try {
			FileInputStream fis = new FileInputStream(file);
			int cnt =0;
			int b;
			while((b=fis.read())!=-1){
				if(b=='\n')
				cnt++; //记录行数
			}
			fis.close();
			System.out.println("文件行数:"+cnt);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void read3(File file){ //块读取,直接将数据存入缓冲区中
		try {
			FileInputStream fis = new FileInputStream(file);
			byte[] buffer = new byte[1024];
			int cnt =0;
			int n; //每次读入的字节数
			while((n=fis.read(buffer))!=-1){
				for(int i = 0;i<n;i++){
					if(buffer[i]=='\n')cnt++;
				}
			}
			fis.close();
			System.out.println("文件行数:"+cnt);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


执行结果:
文件行数:320
read1耗时:234MS
文件行数:320
read2耗时:31MS
文件行数:320
read3耗时:0MS

可以看出第二种和第三种都比第一种方法的效率高
分享到:
评论
2 楼 hnzhoujunmei 2010-12-06  
多谢建议,fis.available()指的是文件大小吗?
1 楼 javapub 2010-12-06  
方法三还可以继续优化下:
public void read4(File file){ //块读取,直接将数据存入缓冲区中
		try {
			FileInputStream fis = new FileInputStream(file);
			byte[] buffer = new byte[fis.available()];
			int cnt =0;
			int n; //每次读入的字节数
			while((n=fis.read(buffer))!=-1){
				for(int i = 0;i<n;i++){
					if(buffer[i]=='\n')cnt++;
				}
			}
			fis.close();
			System.out.println("文件行数:"+cnt);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}


fis.available();对于太大的文件,就不推荐使用了。

相关推荐

    Java文件下载的几种方式

    ### Java文件下载的几种方式详解 在Java编程中,文件下载是常见的操作之一,无论是从本地文件系统还是网络上下载文件,都需要掌握一定的技巧和方法。本文将详细介绍几种常用的Java文件下载方式,包括本地文件下载、...

    使用Java实现对dbf文件的简单读写

    使用 Java 实现对 dbf 文件的简单读写需要使用以下几个类: 1. DBFWriter:用于 dbf 文件的写操作,提供了写入 dbf 文件的方法。 2. JDBField:用于表示 dbf 文件中的字段信息,包括字段名、字段类型、字段长度等。...

    java读取.properties配置文件的几种方法

    下面将详细介绍几种在Java中读取`.properties`配置文件的方法。 1. 使用`java.util.Properties`类 `Properties`类是Java提供的一种内置机制,用于处理属性列表。它继承了`Hashtable`类,提供了加载和保存属性列表...

    Java读取Excel文件的几种方法

    最近单位有个项目需要读取excel文件的内容,特别对java读取excel文件的方法做了一点学习,也为了其他人以后能更简单地开发,少走弯路,特写此文,以下程序经过了我的测试,可以保证程序可用,如果你照搬都不行,可能...

    Java基于IO流读取文件的方法

    总的来说,Java基于IO流读取文件的过程包括以下几个步骤: 1. 获取文件路径并解码。 2. 创建`File`对象,表示要读取的文件。 3. 使用`FileInputStream`创建字节输入流,用于读取二进制数据。 4. 使用`...

    Java程序读取服务器端数据文件的解决方法及比较

    根据上述分析,针对Java程序读取服务器端数据文件的问题,可以采取以下几种方法: 1. **文本文件读取**:对于服务器端生成的文本数据文件,可以在不同数据段之间及整个数据文件结束处设立文本结束标志。此时,Java...

    Java读取文件的几种方式

    介绍Java直接读取、带缓冲读取、内存映射读取文件,并详细注释。

    JAVA简单的读写文本文件的代码

    通过上述四个主要部分的分析,我们可以看到Java语言在处理文件读写方面提供了丰富的API支持。使用合适的类库可以极大地简化开发工作并提高程序的性能。例如,使用`StringBuffer`可以有效地处理字符串的动态增长;而`...

    java读取配置文件

    在Java中,我们可以使用多种方法来读取配置文件,下面将详细介绍几种常见的方法。 1. **使用`java.io`流读取** 最基础的方式是使用Java的I/O流来读取文本配置文件(通常是.properties格式)。例如,`java.io....

    Java流(文件读写操作)

    根据不同的标准,流可以分为几种类型。 ##### 1. 按数据流动方向 - **输入流**:主要用于从数据源读取数据。输入流只能从中读取数据,而不能向其中写入数据。例如,`FileInputStream`用于从文件中读取字节数据。 -...

    hdf5文件结构以及基于java的读写

    ### HDF5 文件结构以及基于 Java 的读写 #### HDF 概述 HDF(Hierarchical Data Format)是一种自我描述、多对象的文件格式,专为高效地存储和分发科学数据而设计。它由美国国家超级计算应用中心(NCSA)开发,...

    java读取文件方法大全.txt

    ### Java读取文件方法概述 在Java中,有多种方式可以用来读取文件的内容。这些方法大致可以分为两类:基于字节流的方法和基于字符流的方法。这两种方法分别适用于不同的场景,具体选择哪一种取决于实际需求。 ####...

    Java大文本txt文件读取的三种方法

    很好的解决大文件读取中需要耗费大量时间的问题,三种方法各异,对不同的文本文件都能较好解决。

    java 读取properties文件代码

    在Java编程中,Properties文件是一种常用的配置文件格式,用于存储应用程序的配置参数或者环境设置。这些文件通常以键值对的形式存在,例如`key=value`。读取Properties文件是Java开发中的常见操作,特别是在需要...

    java读写xml文件

    ### Java读写XML文件知识点详解 #### 一、概述 在Java编程中,对XML文件进行读取与写入是一项非常常见的任务。XML(可扩展标记语言)是一种用于标记数据的语言,非常适合用来存储和传输数据。Java提供了多种API来...

    JAVA小程序(文件读取)

    6. **Scanner类**:对于从文件中读取结构化数据,如整数、浮点数或字符串,`java.util.Scanner`类提供了一种方便的方法。 7. **异常处理**:在进行文件操作时,可能会遇到如文件未找到、权限不足等问题,因此需要...

    java类读取配置文件信息

    在Java类中,读取配置文件信息可以使用多种方法,其中一种方法是使用`this.getClass().getClassLoader().getResourceAsStream`方法。 `this.getClass().getClassLoader().getResourceAsStream`方法是Java类中的一种...

    java读取kml文件数据

    Java语言在处理各种类型的数据文件方面具有广泛的应用,其中之一就是读取KML(Keyhole Markup Language)文件。KML是一种用于存储地理空间数据的标准格式,常用于Google Earth、Google Maps等应用。本项目的核心是...

    用java读取修改xml文件的代码实现

    本文将详细介绍如何使用Java来读取和修改XML文件,主要涉及以下几个核心知识点: 1. **DOM解析器**: Document Object Model(DOM)是一种将XML文档转换为内存中的树形结构的方法,使得可以遍历和修改XML文件。...

Global site tag (gtag.js) - Google Analytics