Java文件读写IO/NIO及性能比较详细代码及总结

干Java这么久,一直在做WEB相关的项目,一些基础类差不多都已经忘记。经常想得捡起,但总是因为一些原因,不能如愿。

其实不是没有时间,只是有些时候疲于总结,今得空,下定决心将丢掉的都给捡起来。

文件读写是一个在项目中经常遇到的工作,有些时候是因为维护,有些时候是新功能开发。我们的任务总是很重,工作节奏很快,快到我们不能停下脚步去总结。

文件读写有以下几种常用的方法

1、字节读写(InputStream/OutputStream)

2、字符读取(FileReader/FileWriter)

3、行读取(BufferedReader/BufferedWriter)

代码(以读取为例):

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
/**
 * <b>文件读取类</b><br />
 * 1、按字节读取文件内容<br />
 * 2、按字符读取文件内容<br />
 * 3、按行读取文件内容<br />
 * @author qin_xijuan
 *
 */
public class FileOperate {
	private static final String FILE_PATH = "d:/work/the List of Beautiful Music.txt";
	/**
   * 以字节为单位读取文件内容
   * @param filePath:需要读取的文件路径
   */
	public static void readFileBybyte(String filePath) {
		File file = new File(filePath);
		// InputStream:此抽象类是表示字节输入流的所有类的超类。
		InputStream ins = null ;
		try{
			// FileInputStream:从文件系统中的某个文件中获得输入字节。
			ins = new FileInputStream(file);
			int temp ;
			// read():从输入流中读取数据的下一个字节。
			while((temp = ins.read())!=-1){
				System.out.write(temp);
			}
		}
		catch(Exception e){
			e.getStackTrace();
		}
		finally{
			if (ins != null){
				try{
					ins.close();
				}
				catch(IOException e){
					e.getStackTrace();
				}
			}
		}
	}
	/**
   * 以字符为单位读取文件内容
   * @param filePath
   */
	public static void readFileByCharacter(String filePath){
		File file = new File(filePath);
		// FileReader:用来读取字符文件的便捷类。
		FileReader reader = null;
		try{
			reader = new FileReader(file);
			int temp ;
			while((temp = reader.read()) != -1){
				if (((char) temp) != '\r') {
					System.out.print((char) temp);
				}
			}
		}
		catch(IOException e){
			e.getStackTrace();
		}
		finally{
			if (reader != null){
				try {
					reader.close();
				}
				catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	/**
   * 以行为单位读取文件内容
   * @param filePath
   */
	public static void readFileByLine(String filePath){
		File file = new File(filePath);
		// BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
		BufferedReader buf = null;
		try{
			// FileReader:用来读取字符文件的便捷类。
			buf = new BufferedReader(new FileReader(file));
			// buf = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
			String temp = null ;
			while ((temp = buf.readLine()) != null ){
				System.out.println(temp);
			}
		}
		catch(Exception e){
			e.getStackTrace();
		}
		finally{
			if(buf != null){
				try{
					buf.close();
				}
				catch (IOException e) {
					e.getStackTrace();
				}
			}
		}
	}
	public static void main(String args[]) {
		readFileBybyte(FILE_PATH);
		readFileByCharacter(FILE_PATH);
		readFileByLine(FILE_PATH);
	}
}

//-----------------------------------------------------------------分割线-----------------------------------------------------------------------------

再经过两位同行的提点下,我对之前写的文件做了点修改,并通过读写一个1.2M的文本文件来测试各方法的性能。从多次测试结果来看,行读写却是是Java.nio更有效率。

经过修改之后的代码如下:

package com.waddell.basic;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
 * <b>文件读取类</b><br />
 * 1、按字节读取文件内容<br />
 * 2、按字符读取文件内容<br />
 * 3、按行读取文件内容<br />
 *
 * @author qin_xijuan
 *
 */
public class FileOperate {
	private static final String FILE_PATH = "d:/work/jipinwodi.txt";
	/**
   * 以字节为单位读写文件内容
   *
   * @param filePath
   *      :需要读取的文件路径
   */
	public static void readFileBybyte(String filePath) {
		File file = new File(filePath);
		// InputStream:此抽象类是表示字节输入流的所有类的超类。
		InputStream ins = null;
		OutputStream outs = null;
		try {
			// FileInputStream:从文件系统中的某个文件中获得输入字节。
			ins = new FileInputStream(file);
			outs = new FileOutputStream("d:/work/readFileByByte.txt");
			int temp;
			// read():从输入流中读取数据的下一个字节。
			while ((temp = ins.read()) != -1) {
				outs.write(temp);
			}
		}
		catch (Exception e) {
			e.getStackTrace();
		}
		finally {
			if (ins != null && outs != null) {
				try {
					outs.close();
					ins.close();
				}
				catch (IOException e) {
					e.getStackTrace();
				}
			}
		}
	}
	/**
   * 以字符为单位读写文件内容
   *
   * @param filePath
   */
	public static void readFileByCharacter(String filePath) {
		File file = new File(filePath);
		// FileReader:用来读取字符文件的便捷类。
		FileReader reader = null;
		FileWriter writer = null;
		try {
			reader = new FileReader(file);
			writer = new FileWriter("d:/work/readFileByCharacter.txt");
			int temp;
			while ((temp = reader.read()) != -1) {
				writer.write((char)temp);
			}
		}
		catch (IOException e) {
			e.getStackTrace();
		}
		finally {
			if (reader != null && writer != null) {
				try {
					reader.close();
					writer.close();
				}
				catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	/**
   * 以行为单位读写文件内容
   *
   * @param filePath
   */
	public static void readFileByLine(String filePath) {
		File file = new File(filePath);
		// BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
		BufferedReader bufReader = null;
		BufferedWriter bufWriter = null;
		try {
			// FileReader:用来读取字符文件的便捷类。
			bufReader = new BufferedReader(new FileReader(file));
			bufWriter = new BufferedWriter(new FileWriter("d:/work/readFileByLine.txt"));
			// buf = new BufferedReader(new InputStreamReader(new
			// FileInputStream(file)));
			String temp = null;
			while ((temp = bufReader.readLine()) != null) {
				bufWriter.write(temp+"\n");
			}
		}
		catch (Exception e) {
			e.getStackTrace();
		}
		finally {
			if (bufReader != null && bufWriter != null) {
				try {
					bufReader.close();
					bufWriter.close();
				}
				catch (IOException e) {
					e.getStackTrace();
				}
			}
		}
	}
	/**
   * 使用Java.nio ByteBuffer字节将一个文件输出至另一文件
   *
   * @param filePath
   */
	public static void readFileByBybeBuffer(String filePath) {
		FileInputStream in = null;
		FileOutputStream out = null;
		try {
			// 获取源文件和目标文件的输入输出流
			in = new FileInputStream(filePath);
			out = new FileOutputStream("d:/work/readFileByBybeBuffer.txt");
			// 获取输入输出通道
			FileChannel fcIn = in.getChannel();
			FileChannel fcOut = out.getChannel();
			ByteBuffer buffer = ByteBuffer.allocate(1024);
			while (true) {
				// clear方法重设缓冲区,使它可以接受读入的数据
				buffer.clear();
				// 从输入通道中将数据读到缓冲区
				int r = fcIn.read(buffer);
				if (r == -1) {
					break;
				}
				// flip方法让缓冲区可以将新读入的数据写入另一个通道
				buffer.flip();
				fcOut.write(buffer);
			}
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		finally {
			if (in != null && out != null) {
				try {
					in.close();
					out.close();
				}
				catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	public static long getTime(){
		return System.currentTimeMillis();
	}
	public static void main(String args[]) {
		long time1 = getTime() ;
		// readFileByByte(FILE_PATH);// 8734,8281,8000,7781,8047
		// readFileByCharacter(FILE_PATH);// 734, 437, 437, 438, 422
		// readFileByLine(FILE_PATH);// 110, 94, 94, 110, 93
		readFileByBybeBuffer(FILE_PATH);
		// 125, 78, 62, 78, 62
		long time2 = getTime() ;
		System.out.println(time2-time1);
	}
}

在main方法中,调用各方法之后,有五组数据,分辨是我5次读写文件测试出来的时间(毫秒)。

关于Java.nio请参考:http://www.jb51.net/article/131338.htm

个人测试:

public static void main(String args[]) {
	long time1 = getTime() ;
	//     readFileByByte(FILE_PATH);   //2338,2286
	//     readFileByCharacter(FILE_PATH);//160,162,158
	//     readFileByLine(FILE_PATH);   //46,51,57
	//    readFileByBybeBuffer(FILE_PATH);//19,18,17
	//    readFileByBybeBuffer(FILE_PATH);//2048: 11,13
	//    readFileByBybeBuffer(FILE_PATH);//1024*100 100k,711k: 6,6
	//    readFileByBybeBuffer(FILE_PATH);//1024*100 100k,1422k: 7
	//    readFileByBybeBuffer(FILE_PATH);//1024*100 100k,9951k: 49,48
	//    readFileByBybeBuffer(FILE_PATH);//1024*1000 1M,711k: 7,7
	//    readFileByBybeBuffer(FILE_PATH);//1024*1000 1M,1422k: 7,8
	//    readFileByBybeBuffer(FILE_PATH);//1024*1000 1M,9951k: 48,49
	//    readFileByBybeBuffer(FILE_PATH);//1024*10000 10M,711k: 21,13,17
	//    readFileByBybeBuffer(FILE_PATH);//1024*10000 10M,1422k: 16,17,14,15
	//    readFileByBybeBuffer(FILE_PATH);//1024*10000 10M,9951k:64,60
	long time2 = getTime() ;
	System.out.println(time2-time1);
}

总结

以上就是本文关于Java文件读写IO/NIO及性能比较详细代码及总结的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

(0)

相关推荐

  • java实现文件读写与压缩实例

    本文通过实例讲述了Java对文件读写与压缩的实现方法,具体代码如下: package com.toone.iform.action.common; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutp

  • 全面了解java byte数组与文件读写

    全面了解java byte数组与文件读写 import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class FileHelper { <span style="white-space:pre"> </span

  • java对指定目录下文件读写操作介绍

    最近因为项目的国际化的需要,需要对整个项目的100来个插件做国际化,这是一件痛苦的事情,因为纯体力劳动.为了省点工作量,想着能不能写个程序批处理了,减少点工作量,于是就有了下面的代码. 1.读取指定的(.java)文件: 复制代码 代码如下: public static String readFile(String path) throws IOException { File f = new File(path); StringBuffer res = new StringBuffer();

  • java进行文件读写操作详解

    直接上代码,有详细注释,有图解,相信你懂得! 复制代码 代码如下: package day14; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.

  • Java IO 之文件读写简单实例

    Java IO 之文件读写简单实例 1.文件读 public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件. */ public static void readFileByBytes(String fileName) { File file = new File(fileName); InputStream in = null; try { System.out.println("以字节为单位读取文件内容,一次读一个字

  • Java编程之文件读写实例详解

    本文实例讲述了Java编程中文件读写的方法.分享给大家供大家参考,具体如下: Java中文件读写操作的作用是什么? 回答这个问题时应该先想到的是Java只是一门语言,我们的一种使用工具而已,这样答案就明晰了,就是将外来的各种数据写入到某一个文件中去,用以保存下来:或者从文件中将其数据读取出来,供我们使用.就如下电影过程,从网络资源中下载一部电影保存于你电脑中(写文件),当你想看的时候就用播放器打开(读文件). Java中如何对文件进行读写操作? 先理一理,Java中的流分两种,字节流和字符流,其

  • Java文件读写IO/NIO及性能比较详细代码及总结

    干Java这么久,一直在做WEB相关的项目,一些基础类差不多都已经忘记.经常想得捡起,但总是因为一些原因,不能如愿. 其实不是没有时间,只是有些时候疲于总结,今得空,下定决心将丢掉的都给捡起来. 文件读写是一个在项目中经常遇到的工作,有些时候是因为维护,有些时候是新功能开发.我们的任务总是很重,工作节奏很快,快到我们不能停下脚步去总结. 文件读写有以下几种常用的方法 1.字节读写(InputStream/OutputStream) 2.字符读取(FileReader/FileWriter) 3.

  • Java编程文件遍历之指定遍历的层数详细代码

    遍历就是把每个元素都访问一次.比如一个二叉树,遍历二叉树意思就是把二叉树中的每个元素都访问一次 本例演示了"文件遍历时,指定遍历的层数"的实现方式. 1.例子代码 package com.myjava.test; import java.io.File; import java.util.ArrayList; import java.util.List; public class JavaTest { /** * @param args */ public static void ma

  • 一文探索Java文件读写更高效方式

    目录 背景 场景分析 场景1:小文件单文件压缩 方式1:网上流传(流传在坊间的神话,其实是带刺的玫瑰) 方式2:使用缓冲区 方式3:使用通道 方式4:使用mmp 场景2:大文件单文件压缩 场景3:大文件多文件压缩 分析结论 背后机密 1.网上流传方法 2.使用缓冲区 3.使用通道 4.使用mmp 背景 最近在探秘kafka为什么如此快?其背后的秘诀又是什么? 怀着好奇之心,开始像剥洋葱 一样逐层内嵌.一步步揭晓kafka能够吊打mq的真因.了解之后不得不说kafka:yyds. 了解到顺序存盘的

  • java文件读写工具类分享

    本文实例为大家分享了java文件读写工具类的具体代码,供大家参考,具体内容如下 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.FileWriter;

  • java文件读写操作实例详解

    目录 File类 File类的构造方法 创建功能 判断 获取 删除 IO流 字节流写数据 小问题 总结 File类 它是文件和目录路径名的抽象表示. 文件和目录是可以通过File封装成对象的. 对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已.它可以是存在的,也可以是不存在的.将来是要通过具体的操作把这个路径的内容转换为具体存在的. File类的构造方法 File(String pathname) //通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例 Fi

  • Java文件与IO流操作原理详细分析

    目录 一.文件 1.基本解释 2.常用的文件操作 3.获取文件相关信息 4.目录操作和文件删除 二.IO流原理及分类 1.IO流原理 2.流的分类 3.IO流体系图 一.文件 1.基本解释 (1)什么是文件? 文件是保存数据的地方,比如大家经常使用的word文档.txt文件.excel文件等都是文件.它还可以保存一张图片,也可以保存视频声音 (2)文件流 流 :数据在数据源(文件)和程序(内存)之间经历的路径 输入流 : 数据从数据源(文件)到程序(内存)的路径 输出流 :数据从程序(内存)到数

  • Java编程实现轨迹压缩之Douglas-Peucker算法详细代码

    第一部分 问题描述 1.1 具体任务 本次作业任务是轨迹压缩,给定一个GPS数据记录文件,每条记录包含经度和维度两个坐标字段,所有记录的经纬度坐标构成一条轨迹,要求采用合适的压缩算法,使得压缩后轨迹的距离误差小于30m. 1.2 程序输入 本程序输入是一个GPS数据记录文件. 1.3 数据输出 输出形式是文件,包括三部分,压缩后点的ID序列及坐标.点的个数.平均距离误差.压缩率 第二部分 问题解答 根据问题描述,我们对问题进行求解,问题求解分为以下几步: 2.1 数据预处理 本次程序输入为GPS

  • Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)

    目录 一.系统介绍 1.开发环境 2.技术选型 3.系统功能 3.1.用户 3.2.管理员 4.数据库 5.工程截图 二.系统展示 1.注册系统 2.登录系统 3.用户-欢迎界面 4.用户-影片排行榜 5.用户-购票信息 6.用户-场次信息 8.用户-搜索电影 9.管理员-首页 10.管理员-对用户进行操作 11.管理员-对影院进行操作 12.管理员-对场厅进行操作 13.管理员-对场次进行操作 14.管理员-对电影进行操作 三.部分代码 AdminMainView.java MovieInfo

  • JAVA文件读写例题实现过程解析

    练习 有这样的一个words数组,数组中每个字符串的格式为"词性:单词" String[] words = {"verb:eat","verb:drink","verb:sleep","verb:play","noun:rice","noun:meat","noun:hand","noun:hair"}; 根据单词性质动词ver

  • JAVA文件读写操作详解

    目录 一.读文件BufferedInputStream 二.写文件BufferedOutputStream 三.实际应用场景 总结 一.读文件BufferedInputStream BufferedInputStream必须传入一个InputStream(一般是FileInputStream) 常用方法: 从该输入流中读取一个字节 public int read(); 从此字节输入流中给定偏移量处开始将各字节读取到指定的 byte 数组中. public int read(byte[] b,in

随机推荐