day20

I/O流

  • 字节流的两个顶层父类:InputStream,OutputStream
  • 字符流的两个顶层父类:Reader,Writer
  • 这些体系的子类都以父类名作为后缀,前缀表示功能

字符流

FileWriter
FileWriter fw = new FileWriter("demo.txt");
fw.write("asdfg");//写入临时缓冲区
fw.flush();//进行刷新,将数据写入存储文件
fw.close();//关闭流,关闭资源
//关闭之后还想写入,要开启新的流
换行
private static final String LINE_SEP = System.getProperty("line.separator");
fw.write("abc"+LINE_SEP+"wer");
续写
FileWriter fw = new FileWriter("demo.txt",true);
fw.write("scz");
IO异常的简单处理
FileWriter fw = null;//针对流对象,都是先创建对象赋给空指针,然后在try部分再赋值
try{
  fw = new FileWriter("xxx.txt");
  fw.write("adc");
}
catch(IOException e){}
finally{
  if(fw!=null)
    try{
      fw.close();
    }
    catch(IOException e){
      throw new RuntimeException("关闭失败")}
}
FileReader
int read(char[] buf);//返回读取的字符数,如果到达流的结尾则返回-1,该方法是从FileReader的父类Reader中继承的
int read();
//每次读取一个字符
FileReader fr = new FileReader("xxx.txt");
int ch = 0;
while((ch=fr.read())!=-1){
  System.out.println((char)ch);
}
//按数组读取
char[] buf = new char[1024];
int len = 0;
while((len=fr.read(buf))!=-1){
  System.out.println(new String(buf,0,len));//写入数组buf的元素,从第1个开始,一共len个
  fw.write(buf,o,len);//write方法内也可以这么写
}
//前者相当于一次吃一粒花生米,后者一次吃一勺

在这里插入图片描述

缓冲区
  • 类似于购物时的小推车
BufferedWriter
FileWriter fw = new FileWriter("buf.txt");
BufferedWriter bw = new BufferedWriter(fw);
bw.write("avc");
bw.newLine();//换行操作,该方法BufferedWriter特有
bw.write("xxx");
bw.flush();
bw.close();//关闭缓冲区,其实关闭的就是流对象fw,所以无法再写入
BufferedReader
FileReader fr = new FileReader("xxx.txt");
BufferedReader br = new BufferedReader(fr);
String line = br.readLine();//读取一行文本

readLine原理如下图所示
在这里插入图片描述
利用缓冲区进行文本复制

FileReader fr = new FileReader("xxx.txt");
BufferedReader br = new BufferedReader(fr);
FileWriter fw = new FileWriter("buf.txt");
BufferedWriter bw = new BufferedWriter(fw);
//一行一行地复制
String line = null;
while((line=br.readLine())!=null){
  bw.write(line);
  bw.newLine();
  bw.flush();
}
//单个字符复制
int ch = 0;
while((ch=br.read())!=-1){
  bw.write(ch);
}

bw.close();
br.close();

在这里插入图片描述
练习:自定义一个BufferedReader

字节流

  • 字节流与字符流处理的方式一样,只是最小处理单位变成了byte和byte数组
FileOutputStream fos = new FileOutputStream("xxx.txt");
fos.write("dfsf".getBytes());
//fos.flush();字节流是直接写入目的文件,所以不需要缓冲,且子类的缓冲没有被实现
fos.close();
//读取
FileIutputStream fis = new FileIutputStream("xxx.txt");
byte[] buf = new byte[fis.available()];
fis.read(buf);
//available()获取文件的长度,此方法少用或用于小文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值