字符流实现文件数据的拷贝

Java中的IO流就是输入输出流,也成为读写流,实现数据的读写。处理字节数据的称作字节流,其中有关的两个抽象基类:InputStream,OutputStream;处理字符数据的称为字符流,下面也有两个抽象基类:Reader,Writter,由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。如:InputStream的子类FileInputStream。

如:Reader的子类FileReader;Writter的子类FileWritter
下面就以FileReader和FileWritter来实现文数据的复制拷贝为例,说明字符流读取文件时的运行机制。

package com.io.com;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyTest {
	/**
	 * 需求:将当前工作空间下的一个文件复制到D盘
	 * 复制的原理:其实就是将相对目录下的数据存储到D盘的文件中。
	 * 步骤:
	 * 1、在D盘创建一个文件,用于存储空间下文件中的数据。
	 * 2、定义读取流和工作空间文件关联。
	 * 3,通过不断的读写完成读写完成数据存储
	 * 4,关闭资源
	 * 提供两种方法:一种是读取一个字符就写一个字符;另外一种是创建一个字符数组用来存放读取到的数据,存满后一次性写入
	 */
	public static void main(String[] args) {
		
		//调用功能
		copy_1();
		copy_2();
		
	}
	//从C盘读取一个字符,就往D盘写一个字符。
	public static  void copy_1(){
		//建立对象引用
		FileReader fr=null;
		FileWriter fw =null;
		try {
			//创建数据存放的目的地,开启续写功能,可以接着在文件末尾续写
			fw  =new FileWriter("D:\\RuntimeDmeo_copy.txt",true);
			//与已有文件关联
			 fr = new FileReader("FileReaderDemo1.java");
		
			 	int len =0;
			 	//read()返回读取的字符,如果已到达流的末尾,则返回 -1 
				while((len=fr.read())!=-1){
					//写入单个字符
	/*				write
					public void write(int c)
					           throws IOException写入单个字符。 

					覆盖:
					类 Writer 中的 write
					参数:
					c - 指定要写入字符的 int。 */

					fw.write(len);
					fw.flush();
				}
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		//释放资源
		finally{
			if (fr!=null) {
					try {
						fr.close();
					} catch (IOException e) {
						
						e.printStackTrace();
					}
			}
			if (fw!=null) {
					try {
						fw.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
			}
		}
	}
	
	//功能2,利用字符数组存放读取的数据
	public static void copy_2(){
		//建立对象引用
		FileWriter fw=null;
		FileReader fr =null;
		
		try {
			//创建目的地,文件写的位置
			fw =new FileWriter("D:\\SystemDemo_copy.txt");
			//创建输入流对象,实现文件关联
			 fr = new FileReader("FileReaderDemo1.java");
			
			//定义一个字符数组,用户存储读取到的数据
			char [] buf =new char [1024];
			int len =0;
			while ((len=fr.read(buf))!=-1) {
				/*public void write(char[] cbuf,
		                  int off,
		                  int len)
		           throws IOException写入字符数组的某一部分
		           只写数组中读取到的数据,避免无效数据写入*/
				fw.write(buf,0,len);
			}
			
		} catch (IOException e) {

				throw new RuntimeException("读写失败");
		}
		//释放资源
			finally{
				if(fr!=null){
						try {
							//关闭输入流
							fr.close();
						} catch (IOException e) {
						
						}
				}
				if (fw!=null) {
					try {
						//关闭输出流
						fw.close();
					}  catch (IOException e) {
						throw new RuntimeException("读写失败");
					}
				}
			
			}	
		
	}

}
虽然这两种方法都能实现文件的读取,对第一种方式来讲,当复制的数据量较大时,相对于第二种来说效率就要低许多了!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值