常用IO类总结_2(FileWriter、FileReader;BufferedInputStream、BufferedOutPutStream)

说明:总结这种东西,要是自己肚子里没有电墨水还真的是不那么容易做到,说错了不仅害了别人也害了自己。反正不懂的直接百度,不管是理论还是代码都是一堆一堆的。。。下面直接贴出测试代码

===========================================

下面进行FileWriter和FileReader类的测试:(原先测试的时候没有给其设置编码,所以导致中文乱码,以下已经设置了GBK编码,所以读写不会出现乱码。)

package com.lin.filewriterandreader;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import org.junit.Test;

public class TestWriterAndReader {

	@Test
	public void testFileReader(){
//		FileReader fr = null;
		InputStreamReader isr = null;
		try {
			File file = new File("C:/Users/Administrator/Desktop/hello1.txt");
//			fr = new FileReader(file);
			isr = new InputStreamReader(new FileInputStream(file), "GBK");
			
			//每次读取的字符数
			char[] c = new char[24];
			//记录每次读取的长度
			int len;
			while((len = isr.read(c)) != -1){
				String str = new String(c, 0, len);
				System.out.println(str);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(isr!=null){
				try {
					isr.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
	
	/*==========================================================*/
	
	/**
	 * 使用FileReader  FileWriter 可以实现文本文件的复制。
	 * 对于非文本文件(视频、音频、图片等),只能使用字节流!
	 **/
		
	@Test
	public void testFileInputStreamOutputStream(){
		//1.提供读入、写出的文件
		File file1 = new File("C:/Users/Administrator/Desktop/hello1.txt");
		File file2 = new File("C:/Users/Administrator/Desktop/hello2.txt");
		//2.提供相应的流
		//输入流对应的文件一点要存在,否则抛出异常。输出流对应的文件可以不存在,执行过程中会自动创建。
//		FileReader fr = null;
//		FileWriter fw = null;
		InputStreamReader isr = null;
		OutputStreamWriter osw = null;
		try {
//			fr = new FileReader(file1);
//			fw = new FileWriter(file2);
			
			isr = new InputStreamReader(new FileInputStream(file1), "GBK");
			osw = new OutputStreamWriter(new FileOutputStream(file2),"GBK");
			
			//3.实现文件的读取并写入(复制)
			char[] c = new char[24];//每次读取到的数据要写入的数组
			int len;//每次读入到byte中的字节的长度
			while((len=isr.read(c)) != -1){
				osw.write(c, 0, len);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(isr!=null){
				try {
					isr.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
					
			}
			if(osw!=null){
				try {
					osw.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
					
			}
		}
	}
}

=================================================

下面进行BufferedReader和BufferedWriter类的测试:(同样解决了中文乱码,都是一样的处理方式)

package com.lin.bufferedwriterreader;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import org.junit.Test;

/**
IO的体系
*		抽象基类			节点流(文件流)			缓冲流(处理流的一种,可以提升文件操作的效率)
*		InputStream		FileInputStream		        BufferedInputStream
*		OutputStream	        FileOutputStream	        BufferedOutputStream(写完数据后要调用flush())
*		Reader			FileReader			BufferedReader(readLine())
*		Writer			FileWriter			BufferedWriter(写完数据后要调用flush())
**/
public class TestBuffered {
	
	@Test
	public void testBufferedReader(){
		BufferedReader br = null;
		BufferedWriter wr = null;
		try {
			File file = new File("C:\\Users\\Administrator\\Desktop\\1.txt");
			File file2 = new File("C:\\Users\\Administrator\\Desktop\\3.txt");
//			FileReader fr = new FileReader(file);
//			FileWriter fw = new FileWriter(file2);
			
			InputStreamReader inStream = new InputStreamReader(new FileInputStream(file), "GBK"); 
			OutputStreamWriter writerStream = new OutputStreamWriter(new FileOutputStream(file2),"GBK");
			
			br = new BufferedReader(inStream);
			wr = new BufferedWriter(writerStream);
			/*char[] c = new char[1024];
			int len;
			while((len=br.read(c))!=-1){
				String str = new String(c,0,len);
				System.out.println(str);
			}*/
			String str;
			while((str=br.readLine())!=null){
				System.out.println(str);//,每次读取一行数据并每次显示一行数据在控制台上
				wr.write(str+"\n");//将读取的数据存储在文件中
				wr.flush();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(br!=null){
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	//使用BufferedInputStream和BufferedOutputStream实现非文本文件的复制
	@Test
	public void BufferedInputOutputStream(){
		//3.将创建的结点流的对象作为形参传递给缓冲流的构造器中
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		try {
			//1.提供读入、写出的文件
			File file1 = new File("C:\\Users\\Administrator\\Desktop\\7.jpg");
			File file2 = new File("C:\\Users\\Administrator\\Desktop\\72.jpg");
			//2.创建相应的节点流,FileInputStream、FileOutputStream
			FileInputStream fis = new FileInputStream(file1);
			FileOutputStream fos = new FileOutputStream(file2);
			bis = new BufferedInputStream(fis);
			bos = new BufferedOutputStream(fos);
			//4.具体的实现文件复制的操作
			byte[] b = new byte[1024];//每次读取的字节数
			int len;//用来记录每次读取的字节数的长度
			while((len=bis.read(b))!=-1){
				bos.write(b,0,len);
				bos.flush();//如果最后一次读取的时候数据没有存满,则强制发送,否则有可能在一直等待
			}
		} catch (IOException e) {
			e.printStackTrace();
		}finally{//关闭相应的流
			if(bos!=null){
				try {
					bos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
					
			}
			if(bis!=null){
				try {
					bis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
					
			}
		}
			
	}
}

======================================================

小结,在实际开发中缓冲流最经常被使用:BufferedInputStream、BufferedOutputStream(写完数据后要调用flush())、BufferedReader(readLine())、BufferedWriter(写完数据后要调用flush()) 。原因当然是相比之前的流来说可以提升文件操作的效率啦~~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值