IO流总结

io流图

在这里插入图片描述
看图说话:
1、第三层是抽象类:reader、writer、InputStream、OutputStream第三层往后都是不同类
2、所有类都实现了(Closeable extends AutoCloseable)接口(表示两个接口都实现了,在关闭的时候我们一般写AutoCloseable)
3、Buffered类有两对,其构造方法都要包含第三层抽象类的子类(一般是其父亲的兄弟类),比如:高效字节流的构造: public BufferedInputStream(InputStream in) 实际写的话形参可以是:字节流FileInputStream对象
4、字符流和字节流在都有write和read方法,在字节流中这两方法要使用byte来接收
在字符流中这两方法要使用char[] /String 来接收

buffered高效缓冲字节输入输出流

BufferedInputStream

构造方法
public BufferedInputStream(InputStream in)
//默认的字节数组大小是8192 InputStream一般写实现类:FileInputStream
public BufferedInputStream(InputStream in, int size)
//自己放一个字节数组的长度

BufferedOutputStream

构造方法
public BufferedOutputStream(OutputStream out)
//默认的字节数组大小是8192 OutputStream一般写实现类:FileOutputStream
public BufferedOutputStream(OutputStream out, int size)
//自己放一个字节数组的长度
普通方法: 我 的 归 纳 \color{red}{我的归纳} 很 重 要 ! ! ! ! \color{red}{很重要!!!!}
首先追加方法只在FileOutputStream()
public FileOutputStream(String name, boolean append)
BufferedInputStream
记住write的使用小技巧:只能传字节所以write()中的参数只能是单个字节/字节数组
因为需要字节与int相互转换所以只推荐 字节数组放入write
write(bs,0,len); write(bs); bs 是byte数组 write(int b) flush();
同理:
BufferedOutputStream
read():只要记住int len = (输入流对象).read(bs) 即从外界可读取len大小的byte放入bs中内存中使用
int b=(输入流对象).read();比较low

以后拷贝字节文件的标准写法:

fi = new FileInputStream(oldfile);//从b中读取进内存
bo.write(bs,0,len);//这个方法你用的少,多用用
public static void autoClose(AutoCloseable… args){//可变参数

		public static void copy1(String oldfile,String newfile){
		FileInputStream fi=null;
		FileOutputStream fo=null;
		BufferedInputStream bi=null;
		BufferedOutputStream bo=null;
		try {
			 	fi = new FileInputStream(oldfile);//从b中读取进内存
				fo = new FileOutputStream(newfile);
				 bi = new BufferedInputStream(fi);
				 bo = new BufferedOutputStream(fo);	
				 
				 int len=0;
				 byte bs[]=new byte[1024];
				 while((len=bi.read(bs))!=-1){
					 bo.write(bs,0,len);//这个方法你用的少,多用用
					 bo.flush();				 
				 }		
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			autoClose(fi,fo,bi,bo);
		}	
	}
	//NB的写法  记得copy!!!!!!!!
	public static void autoClose(AutoCloseable... args){//可变参数
		for(AutoCloseable c:args){
			if(c!=null){
				try{
					c.close();
				}catch(Exception e){
					e.printStackTrace();
				}
			}
		}
	}
	
	//利用泛型来整个关闭方法
		public static <T extends AutoCloseable> void autoClose2(T...ts ){
		for (T t : ts) {
			if(t!=null){
				try {
					t.close();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

高效缓冲字符输入输出流

高效缓冲字符流 BufferedReader和BufferedWriter特点

	1.能够写入适配不同操作系统的换行符
	2.能够读取一行
	3.字符流的拷贝字符和字符数组以及字符串的功能
	4.能够提高字符流的效率
	5.具备读取一行写入一行拷贝文件的方法

BufferedReader

构造方法:
public BufferedReader(Reader in, int sz)
public BufferedReader(Reader in)

BufferedWriter

构造方法:
public BufferedWriter(Writer out, int sz)
public BufferedWriter(Writer out)
普通方法:
类似于上面的字节流方法
关键!!!!
读 写 方 法 内 的 参 数 在 字 符 流 中 只 能 是 c h a r [ ] / c h a r [ ] , o f f , l e n / S t r i n g \color{red}{读写方法内的参数在字符流中只能是char[]/ char[],off,len /String} char[]/char[],off,len/String
不能是byte

拷贝案例标准写法

拷贝方法:(推荐使用:)
//Buffered字符输入流 readLine()表示读取一行数据,返回类型为String,且当读取到最后一行的下一行返回null
// public String readLine()
//Buffered字符输出流write()内的参数可以是char[]/char[],off,len/String
//newLine()方法作用:根据不同操作系统选出不同的换行符进行写入
//flush()一次性输出缓冲区中所有的数据

	//NB的copy
	public static void copyNB(String oldfile,String newfile){
		try (BufferedReader br = new BufferedReader(new FileReader(oldfile));
				BufferedWriter bw = new BufferedWriter(new FileWriter(newfile,true));//追加功能true
				){
			String line=null;
					//Buffered字符输入流 readLine()表示读取一行数据,返回类型为String,且当读取到最后一行的下一行返回-1
					//  public String readLine() 
					//Buffered字符输出流write()内的参数可以是char[]/char[],off,len/String
					//newLine()方法作用:根据不同操作系统选出不同的换行符进行写入
					//flush()一次性输出缓冲区中所有的数据
			while((line=br.readLine())!=null){
				bw.write(line);
				bw.newLine();
				bw.flush();
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	}

老copy:

	public static void copy(String oldfile,String newfile){
		try (BufferedReader br = new BufferedReader(new FileReader(oldfile));
				BufferedWriter bw = new BufferedWriter(new FileWriter(newfile,true));	
				){
		char[] bs=new char[1024];
		int len=0;
		while((len =br.read(bs))!=-1){
			bw.write(bs);
			bw.flush();
		}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值