io基础理解


IO流:

一.io基础理解:


      可以在设备上搬运数据的流对象,相对于内存而言,(可以把io理解为内存公司请的搬运工)硬盘上存储的是二进制,8个2进制为一个字节。

     搬进内存的流:inputstream(读)

     搬出内存的流:outputstream(写)

每个国家都有自己使用的语言,和使用的字符。每个国家都有他们使用的字符和2进制字节对应关系的编码表,将编码表和字节流封装就形成了字符流。

搬进内存的流:reader(读)

  搬出内存的流:writer(写)

上面的读写都是一个一个读写,效率低,所有引入了缓冲流。

 BufferedInputstream

 BufferedOutputstream

 Buffered Reader

 Buffered Writer

 字符流=字节流+编码表

转化流:字节转字符: inputstreamReader(new inputstream(基本数据源),编码表)

        字符转字节 outputstreamWriter(new outputstream(基本数据源),编码表)

(注意:流创建后需要关闭(流对象.close))

二.下面详细数码io流:

1.	拷贝文件:
(a) //将硬盘中的一个文件进行复制。
		/*思路:首先你有输入流,获取文件,在有输出流,将复制的文件进行存储。
		 * 这里面为了高效,定义一个缓冲区。*/

		FileReader fr = new FileReader("c:\\demo.txt");
	    FileWriter fw = new FileWriter("c:\\copy_demo.txt");
	    char[] buf = new char[1024];
	    int  len = 0;
	    while((len = fr.read(buf))!=-1){//将demo文件读到cha数组中去。
	    	 //进行写的操作
	    	fw.write(buf, 0, len);
	    }

	    fr.close();
	   fw.close();}}
(解析代码:源文件需要用输入流关联,目的地用输出流关联。 引入缓冲流可以提高效率,读的方法 对象.read(char[])写的方法 对象.writer(char[] ,start,end).  重点注意读写方式。

(b)加入缓冲流的coyp
	FileReader fr = new FileReader("c:\\ demo.txt");
		BufferedReader br = new BufferedReader(fr);
//		BufferedReader br = new BufferedReader(new FileReader("buf.txt"));
		//定义一个写入硬盘流  并装饰。  
		FileWriter fw = new FileWriter("c:\\ copy_demo.txt");
		BufferedWriter  bw = new BufferedWriter(fw);
//		BufferedWriter bw = new BufferedWriter(new FileWriter("copy_buf.txt"));
		//然后进行读写操作。   因为定义的是默认的缓冲区,所以调用缓冲区的读取方法 ,就是一行读取
		String line = null;
		while((line = br.readLine())!=null){
			bw.write(line);
			bw.newLine();
		}
		
		br.close();
		bw.close();
	
	  }

}
(代码解析:缓冲流只是装饰,注意怎么装饰的。由于readLine()方法是读取一行,注意变量line的类型。Newline可以换行。)

(c)复制MP3:

BufferedInputStream bufis=new BufferedInputStream(new FileInputStream("a.mp3"));
		BufferedOutputStream bufos=new BufferedOutputStream(new FileOutputStream("coyp_a. mp3"));
		
		int len=0
		while((len=bufis.read())!=-1){
			bufos.write(len);
		}





 2装饰设计模式
         理解:当想要对已有的独享进行功能增强时,可以定义类,将已有的对象传入,基于已经有的功能,并提供加强功能,那么自定义的该类称为装饰类
装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。
Io流中装饰模式应用非常广泛,出字节输入输出流,字符,输入输出和装换流外大多是装饰。

自定义BufferedReader 的装饰类MyBufferedReader  :

package com.io;
import java.io.*;
public class MyBufferedReader  {
	
		private Reader r;
		

    	public MyBufferedReader(Reader r) {
			super();
			this.r = r;
		}


		//可以一次读取一行的方法
	 	public String myReadLine() throws IOException
	 	{
	 		//定义一个临时容器。StringBulider容器,应用于存储字符数组
	 		StringBuilder sb=new StringBuilder();
	 		int ch=0;
	 		while((ch=r.read())!=-1){
	 			if(ch=='\r')
	 					continue;
	 			if(ch=='\n')
	 				return sb.toString();
	 			else
	 				sb.append((char)ch);
	 		}
	 		
	 		if(sb.length()!=0)
	 			return sb.toString();
	 		return null;
	 	}
	 	
	 	//复写reader中的抽象方法
	 	//复写close方法
	 	public  void  close() throws IOException
	 	{
	 		r.close();
	 	}
	 	//复写read方法
	 	public int read (char[] c,int off,int len) throws IOException{
	 		
	 		return r.read(c, off, len);
	 	}
}

总结:io最根本的是对数据进行操作,必须掌握它的读写。理解他的装饰模式和设计思想。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值