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()获取文件的长度,此方法少用或用于小文件