`
java--hhf
  • 浏览: 308792 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

文件读出和写入两种基本方法

阅读更多

             文件读出和写入两种基本方法

  首先,我们的目的是:通过java源代码的运行将文件从一个地方复制到另外一个地方。只需要两步就可以了——将文件读出来,将读出来的内容保存到新建的一个文件夹内。

  现在介绍两种最基本的方法——字节流InputStream和缓冲流BufferedInputStream。第一种是将磁盘中文件的内容一个一个字节的读出写入;后一种则是将文件一段一段的读出写入。在创建 BufferedInputStream 时,会相应的创建一个内部缓冲区数组在java虚拟机内存中,因此每次处理的就是这一整块内存。

  我们先用InputStream来实现这一功能,然后再用BufferedInputStream 实现,最后比较这两者的优劣。

 

/**
	 * 读取指定文件内容
	 * 
	 * @param fileName被复制文件名
	 * @return 将读取到的内容作为String类型返回
	 * @throws IOException
	 *             文件操作异常
	 */
	private String readFileString(String fileName)
			throws IOException {
		// java.io.InputStream抽象类是表示字节输入流的所有类的超类,java.io.FileInputStream是它的一个实现类
		// 定义这样的输入流对象,来进行文件操作
		java.io.InputStream ins = new java.io.FileInputStream(fileName);
		// 也可以这样(多个构造方法)
		// java.io.InputStream ins1 = new java.io.FileInputStream(new
		// File(fileName));
		// 根据ins中的字节长度 创建一个byte数组保存读出的数据
		byte[] contentByte = new byte[ins.available()];
		// 对contentByte数组赋值
		// 读入就是把文件中的东西读出后读入到另一个东西里去
		ins.read(contentByte);
		//方法二
//		while (true) {
//			int i = ins.read();
//			if(i == -1)
//				break;
//	
//		}
		// 把contentByte转变为String类型
		String s = new String(contentByte);
		//关闭文件流
		ins.close();
		System.out.println("InputStream使用结束,文件已被读出");
		return s;
	}

  下一步就是创建一个新的文件,然后将刚刚获得的返回值写入进去便可了。

/**
	 * contentString 文件的内容
	 * @param path新路径名 
	 * @throws IOException
	 *             文件操作异常
	 */
	private void whiteFile_OutputStream(String contentString, String path)
			throws IOException {
		// 定义输出流对象,来进行文件操作
		java.io.OutputStream os = new java.io.FileOutputStream(path);
		// 对contentByte数组赋值
		byte[] contentByte = contentString.getBytes();
		//写入path中
		os.write(contentByte);
		os.close();
		System.out.println("OutputStream结束,文件已被复制");
	}

 这样的话filename里面的文件就被复制到了path里面。

     下面我们再看一下如果是BufferedInputStream 会怎么样。

/**
	 * 复制指定文件内容
	 * @param path新文件的路径
	 * @param fileName
	 * 
	 * @throws IOException
	 *             文件操作异常
	 */
	private void copyBuffered(String fileName, String path)
			throws IOException {//还是需要先 定义InputStream输入流对象	
		java.io.InputStream ins = new java.io.FileInputStream(fileName);
		// 创建一个BufferedInputStream对象时 需要用InputStream作为输入
		java.io.BufferedInputStream bis = new java.io.BufferedInputStream(ins);
		// 文件复制中的输出流
		java.io.OutputStream os = new java.io.FileOutputStream(path);
		java.io.BufferedOutputStream bos = new java.io.BufferedOutputStream(os);
		// 根据ins中的字节长度 创建一个byte数组保存读出的数据
		byte[] contentByte = new byte[bis.available()];
		// 对contentByte数组赋值
		// 读入就是把文件中的东西读出后读入到另一个东西里去
	           bis.read(contentByte);
		bos.write(contentByte);
//方法二		while (true) {
//			int i = bis.read();
//			if (i == -1) {
//				break;
//			}
//			bos.write(i);
//		}
		System.out.println("BufferedInputStream拷贝结束");
		bos.flush();// 将缓冲区中的内容强制全部写入到文件中(不管是否已经全部写入)有点类似于下面的语句
		// bos.close();
		// bis.close();
		// os.close();
		// ins.close();
		
	}

 

   读者将会发现其实并没有多少区别。

   只能说,形式的确是如此。但程序运行时内部的处理是不同的,这体现为后者的读取复制速度远远快于前者。

 

2
2
分享到:
评论
8 楼 canghailan 2012-12-17  
yonge812 写道
canghailan 写道
FileChannel.transferTo
,其实这个更方便,性能可能更好。

http://yonge812.iteye.com/blog/1747393这是我做的测试,并没有体现他的高性能。

性能可能更好更多地体现在CPU与内存使用上。
传统拷贝方式:源文件块=>操作系统文件缓存=>JVM缓冲区=>操作系统文件缓存=>目标文件块。
而NIO省掉了 操作系统文件缓存=>JVM缓冲区=>操作系统文件缓存 这个过程。
对于常规的磁盘IO来说,内存中内容拷贝所消耗的时间可以忽略。
操作系统可能会使用DMA等来节省系统资源,所以transferTo可能性能(CPU,内存)更好,但也要看具体实现。
测试第一次比其他几次耗时长应该是操作系统文件缓存的原因。
7 楼 sc_zcx 2012-12-15  
学习了。。。。
6 楼 java--hhf 2012-12-14  
byte[] contentByte = new byte[1024];
OutputStream os = new FileOutputStream("fileName");
while(true){
   int ret = bis.read(contentByte);
   if (ret > 0) {
	os.write(buf, 0, ret);
   } else if (-1 == ret) {
	break;
   }
}
os.close();  


这个代码写的不错^_^ 谢谢啦
5 楼 java--hhf 2012-12-14  
FileChannel.transferTo  这个 具体咋用呢?? API貌似不好懂
4 楼 yonge812 2012-12-14  
canghailan 写道
FileChannel.transferTo
,其实这个更方便,性能可能更好。

http://yonge812.iteye.com/blog/1747393这是我做的测试,并没有体现他的高性能。
3 楼 xiaoZ5919 2012-12-14  
crazywen2011 写道
byte[] contentByte = new byte[bis.available()];  
        // 对contentByte数组赋值  
        // 读入就是把文件中的东西读出后读入到另一个东西里去  
               bis.read(contentByte);  
        bos.write(contentByte);  
//方法二       while (true) {  
//          int i = bis.read();  
//          if (i == -1) {  
//              break;  
//          }  
//          bos.write(i);  
//      }  

对于这种做法并不赞成,小文件还可以用用,文件很大的话,会造成内存溢出的哦。
byte[] contentByte = new byte[1024];
OutputStream os = new FileOutputStream("fileName");
while(true){
   int ret = bis.read(contentByte);
   if (ret > 0) {
	os.write(buf, 0, ret);
   } else if (-1 == ret) {
	break;
   }
}
os.close();  

个人更赞成这样的写法

还是1楼说的fileChannel.transferTo吧其实两个文件的读写,没有必要字节数组copy到jvm的内存中。利用fileChannel在内核态搞定避免了四次copy
2 楼 crazywen2011 2012-12-14  
byte[] contentByte = new byte[bis.available()];  
        // 对contentByte数组赋值  
        // 读入就是把文件中的东西读出后读入到另一个东西里去  
               bis.read(contentByte);  
        bos.write(contentByte);  
//方法二       while (true) {  
//          int i = bis.read();  
//          if (i == -1) {  
//              break;  
//          }  
//          bos.write(i);  
//      }  

对于这种做法并不赞成,小文件还可以用用,文件很大的话,会造成内存溢出的哦。
byte[] contentByte = new byte[1024];
OutputStream os = new FileOutputStream("fileName");
while(true){
   int ret = bis.read(contentByte);
   if (ret > 0) {
	os.write(buf, 0, ret);
   } else if (-1 == ret) {
	break;
   }
}
os.close();  

个人更赞成这样的写法
1 楼 canghailan 2012-12-14  
FileChannel.transferTo
,其实这个更方便,性能可能更好。

相关推荐

    使用RandomAccessFile流将一个文本文件读出,并导致写入到另一个文件当中。

    ### 使用RandomAccessFile流将一个文本文件读出并写入到另一个文件中的知识点解析 在Java编程语言中,`RandomAccessFile`类提供了一种非常灵活的方式来读取和写入文件。它支持随机访问,意味着我们可以直接跳转到...

    bmp文件读出为txt文件, txt文件写入为bmp文件

    这两个过程涉及到二进制与文本之间的转换,这对于理解计算机数据处理和文件格式至关重要。 首先,我们来看如何“读出BMP文件,并以txt的形式进行保存”。BMP文件格式是一个二进制文件,包含图像宽度、高度、颜色...

    C# 读取XML文件并写入Excel表格

    本项目涉及的核心技术是“读取XML文件”和“写入Excel表格”。XML(Extensible Markup Language)是一种用于存储和传输数据的标准化格式,而Excel则是Microsoft Office套件中的一个组件,用于创建、编辑和分析数据。...

    C# 对刚创建的数据文件进行读取和写入

    在C#编程中,对刚创建的数据文件进行读取和写入是常见的操作,这涉及到文件I/O(输入/输出)的基本概念。本文将详细阐述如何使用C#进行文件读写,包括创建文件、写入数据、读取数据以及相关的异常处理。 1. **创建...

    C#文本文件操作实例---杨辉三角形写入读出

    在这个实例中,我们将深入探讨如何利用C#进行文本文件的操作,特别是涉及杨辉三角形的写入与读出。杨辉三角形是数学中的一个重要概念,它在组合数学中扮演着关键角色,同时也常被用作教学示例,帮助理解二项式系数。...

    采用C#在Excel2007中读出和写入数据

    以下将详细介绍这两种方法。 **一、使用COM互操作库** 1. **安装引用**: 首先,在C#项目中,需要添加对"Microsoft.Office.Interop.Excel"的引用。这可以通过Visual Studio的"添加引用"对话框,选择"COM"类别下的...

    将两个XML文件部分内容读出写入EXCEL

    JXL支持读取和写入Excel文件,包括单元格格式、公式、图表等功能。以下是如何使用JDOM和JXL完成任务的步骤: 1. 引入库:确保在项目中引入了JDOM和JXL的jar文件。对于Maven项目,可以在pom.xml中添加相应的依赖。 ...

    行业分类-设备装置-寻址与存储一体化两读出一写入存储控制器.zip

    本主题聚焦于一种特殊类型的存储控制器——“寻址与存储一体化两读出一写入存储控制器”,这是一种针对特定应用优化的设计,旨在提高数据处理效率和系统性能。 寻址与存储一体化指的是存储控制器内置了地址管理和...

    杨辉三角形写入读出.zip

    这个压缩包文件"杨辉三角形写入读出.zip"提供了一个C#编程的实例,帮助初学者学习如何在C#环境中处理文本文件,实现杨辉三角形的生成、写入和读取功能。 首先,我们来看杨辉三角形的基本原理。每一行的数字是上一行...

    从Excel读出数据写入SQL

    以上两种方法各有优缺点。Python+pandas方案灵活性高,可以处理复杂的预处理任务,而OpenRowset函数则直接在数据库层面完成数据导入,对服务器资源要求较高。根据实际需求选择合适的方法。在实际操作中,确保数据的...

    string与blob的写入与读出

    在数据库操作或者文件存储时,理解如何有效地写入和读取这两种类型的数据至关重要。本篇文章将深入探讨`String`与`Blob`在Java中的使用,以及如何进行写入和读出操作。 首先,`String`是Java中表示文本的基本数据...

    python将txt内容读出写入excel

    在Python编程语言中,将TXT文件的内容读取并写入Excel是一种常见的数据处理任务,尤其在运维工作中,这种操作能够方便地对日志、配置文件等文本数据进行管理和分析。以下是一个详细的步骤介绍,帮助你理解如何实现这...

    实现哈夫曼树的编码与解码,有相应的用户界面,能读出文件,写入文件

    这个“数据结构大作业”可能是对上述技术的综合运用,旨在让学生理解哈夫曼编码的基本原理,掌握文件操作,以及如何在实际应用中构建用户界面。通过完成这个作业,学生将提升其编程技能和问题解决能力。

    行业分类-设备装置-差分读写回读出放大器电路和方法.zip

    本文件"行业分类-设备装置-差分读写回读出放大器电路和方法.zip"包含了关于这种高级电路设计的详细信息,特别是针对其在读取、写入和回读过程中的应用。以下是对这个主题的深入解析。 首先,理解差分信号的概念至关...

    C#小案例读出文件的相关操作

    在C#编程中,文件操作是一项基础且重要的技能,尤其对于初学者来说,理解并掌握文件的读取和写入是必要的。在这个“C#小案例读出文件的相关操作”中,我们将深入探讨如何使用C#的IO(Input/Output)类库来实现这一...

    基本文件IO(C#自己整理).doc

    1. **Directory** 和 **File**:这两个类提供了许多静态方法,如创建、删除、复制、移动文件和目录。由于它们是静态的,不需要实例化,因此在只需要执行单个操作时,它们是快速且有效的选择。 2. **DirectoryInfo**...

    将数据0x0f写入AT24C02再读出送P1口显示.zip

    这个压缩包文件“将数据0x0f写入AT24C02再读出送P1口显示.zip”显然包含了一个与微控制器编程相关的项目,主要涉及的是如何使用特定的硬件组件进行数据的存储和读取。在这个项目中,开发者可能在尝试向一个I2C接口的...

    5152单片机proteus仿真和源码将渴望乐谱写入AT24C02并读出播放

    根据提供的文件信息,本文将详细解析“5152单片机Proteus仿真和源码将渴望乐谱写入AT24C02并读出播放”这一主题所涉及的关键技术点。 ### 一、5152单片机简介 5152单片机是一种基于8051内核的增强型单片机,它继承...

    将渴望乐谱写入AT24C02并读出播放.zip

    在这个名为"将渴望乐谱写入AT24C02并读出播放.zip"的压缩包文件中,我们涉及到了一个有趣的电子音乐项目。这个项目的核心是利用微控制器和特定的存储器来存储并播放乐谱。AT24C02是一款常见的电可擦除可编程只读...

    采用无缓冲方式实现文件读写.docx

    本实验的完成环境为 Visual Studio 2013,实验内容为建立一个函数,读出数据文件的内容,然后写入目标文件中,本次实验介绍第一种文件读的方式:建立一个函数,读出数据文件 source.txt 中的内容,然后写入目标文件 ...

Global site tag (gtag.js) - Google Analytics