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();
}
}