笔记(十二):IO操作

文件流复制文件

我们使用过RandomAccessFile对象进行过文件复制,但是复制的过程比较麻烦。
而java的IO提供了功能更强大的类型来进行类似的操作。

直接复制

package com.tedu.io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 使用流去完成文件的复制操作
 * @author Wildmess
 *
 */
public class CopyDemo1 {
	public static void main(String[] args) throws IOException {
		/*
		 * 1.创建文件输入流,读取出源文件
		 * 2.创建文件输出流,复制出新文件
		 * 3.循环从源文件中读去信息写入到新文件中
		 * 4.关闭流。
		 * 
		 */
		FileInputStream fis = new FileInputStream("raf.txt");
		FileOutputStream fos = new FileOutputStream("raf_copt2.txt");
		
		//创建一个10K的缓存
		byte[] data = new byte[1024*10];
		int len;
		long start = System.currentTimeMillis();
		while((len = fis.read(data)) != -1) {
			fos.write(data, 0, len);//len表示的是读取出来的多少字节的数据
		}
		long end = System.currentTimeMillis();
		System.out.println("程序运行了" + (end-start)+ "ms");
		fis.close();
		fos.close();
	}
}

使用缓冲流复制文件

仔细观察,很容易就可以看出,如果使用了上述的方法进行文件复制,就和RandomAccessFile没什么区别了,其实IO中提供了缓冲流来提高复制文件的效率。
在这里插入图片描述
代码如下:

package com.tedu.io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 使用IO中提供的缓冲流来实现文件复制 
 * 
 * java.io.BufferedOutputStream
 * java.io.BufferedIutputStream
 * 缓冲流是一对高级流,在流连接中的作用是加快数据的读写效率
 * (内存会将读写的数据统一转换为块读写的方式,以达到效率提高的目的)
 * 
 * @author Wildmess
 * 
 */
public class CopyDemo2 {
	public static void main(String[] args) throws IOException {
		//高级流不能直接指向文件,它创建时需要低级对象
		FileInputStream fis = new FileInputStream("raf.txt");
		BufferedInputStream bis = new BufferedInputStream(fis);
		
		FileOutputStream fos = new FileOutputStream("raf_copy3.txt");
		BufferedOutputStream bos = new BufferedOutputStream(fos);
		
		int d = -1;
		long start = System.currentTimeMillis();
		while((d = bis.read()) != -1) {
			bos.write(d);
		}
		long end = System.currentTimeMillis();
		System.out.println("程序运行了:" + (end - start) + "ms");
		
		bis.close();
		bos.close();	
	}
}

缓冲流的flush方法

void flush()
在实际应用中,不可能要求每一次都要把缓冲流写满后在进行字节写出。
在java的IO中,调用flush()方法可以强制将已经缓存的字节一次性的写出,从而提高数据写出的即时性,但是这也会同时增加实际写出的次数,降低写出效率。

package com.tedu.io;

import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 缓冲输出流写出数据缓冲区
 * @author Wildmess
 *
 */
public class BOSFlushDemo {
	public static void main(String[] args) throws IOException {
		FileOutputStream fos = new FileOutputStream("flush.txt");
		BufferedOutputStream bos = new BufferedOutputStream(fos);
		
		System.out.println("程序开始:");
		String str = "中华人民共和国万岁!";
		byte[] data = str.getBytes();
		
		bos.write(data);
		
		/*
		 * void flush()
		 * 强制将当前缓冲区中的字节一次性写出
		 * 同时缓冲区中的数据也被清空
		 * 实际上也会增加写出的次数,降低写出效率
		 */
		bos.flush();
		System.out.println("程序结束!");
		
		//事实上,close()方法内部也会调用flush()方法
		bos.close();
	}
}

在close()方法内部也会调用flush()方法,所以一般情况下这个方法使用的不多。
但如果在编写代码的时候,两个方法都没有使用,读出的字节数据就会一直存在缓冲区中,形成死循环,所以文件流一定要记得关闭。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值