//io流总结:
io流分为字节流和字符流,其中字节流的顶层是InputStream和OutputStream,字符流的顶层是Reader,Writer,InputStream,
OutputStream是抽象类,不能new,Reader,Writer也是抽象类,InputStream下面比较常用的子类对象是FileInputStream,操作文件的
输入流,OutputStream下面比较常用的子类对象是FileOutputStream,操作文件的输出流,包装类有BufferedInputStream,BufferedOutputStream
,Reader下面的子类中比较常用的是FileReader,Writer下面的子类中比较常用的是FileWriter,这两个管道可以直接捅到文件上去,
字节流转字符流的桥梁是InputStreamReader,字符流转字节流的桥梁是OutputStreamWriter,这两个都是字符流,
下面讲一讲字节流的读写操作,例如如下:
//第一种方式,一个字节一个字节的读取,再一个字节一个字节的写出去
FileInputStream fis = new FileInputStream("a.txt");
FileOutPutStream fos = new FileOutPutStream("b.txt");
int a;
while((a=fis.read())!=-1){
fos.write(a);
}
fis.close();
fos.close();
//第二种方式,读取到一个数组里去,再把数组里的字节写出去,因为都是在内存完成,这种方式会比第一种效率更加高一点
FileInputStream fis = new FileInputStream("a.txt");
FileOutPutStream fos = new FileOutPutStream("b.txt");
//定义一个字节数组
byte arr = new byte[8192];//为什么是8192?从源码知道的
int len; //这是每一次实际读取到的个数,注意是个数
while((len=fis.read(arr))!=-1){
fos.write(arr,o,len); //把数组里的内容写出去,从0开始到实际读取到的len个
}
fis.close();
fos.close();
注意事项:01,这里要理解是怎样读取到数组里去的,如果最后剩下几个字节,比数组容量小是怎样的情况,
这几个字节会把前一段装满的数组字节替换出来几个,所以我们写的时候就要要求写出去实际的个数。
02:第一种方法java设计者为什么要用一个int类型的变量来接呢?因为我们读取字节的时候判断读取到末尾是-1,如果文本
中间是一个-1的数字怎么办?难道我们就结束读取了吗?为了避免在中间读取到-1就结束读取工作,所以在设计的时候,就用
了int。
下面讲一讲字符流的读写:
//第一种方式,一个字符一个字符的读取,再一个字符一个字符的写出去
FileReader filereader = new FileReader("a.txt");
FileWiter filewriter = new FileWriter("b.txt");
int a ;//一个字符一个字符的读取,中文是两个字节,第一个字节是负数,读取的时候见到负数连续读两个字节
while((a=filereader.read())!=-1){
filewriter.writer(a);
}
//第二种方式,读取到一个字符数组里面去,再把字符数组写出去,类似上面的字节流
FileReader filereader = new FileReader("a.txt");
FileWiter filewriter = new FileWriter("b.txt");
//定义一个字符数组
char[] arr = new char[8192];
int len;
while((len=filereader.read(arr))!=-1){
filewriter.write(arr,0,len);
}
filereader.close();
filewriter.close();
//下面讲一讲更加高效率的字节流读取,BufferedInputStream有8192个单位的缓冲,这是更加高效率的字节流读取方式的第一种
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("b.txt"));
int a ;//从缓冲区里一个一个的读取
while((a=bis.read())!=-1){
bos.write(a); //读取一个字节写出一个字节
}
bis.close();
bos.close();
//这是更加高效率的字节流读取方式的第二种
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("b.txt"));
//定义一个字节数组
byte[] arr = new byte[1024];//这里是建议这么大的
int len; //每一次实际读取到的个数
while((len=bis.read(arr))!=-1){
bos.write(arr,0,len);
}
bis.close();
bos.close();
//下面讲一讲更加高效的字符流的读写操作,这是第一种
BufferedReader bfd = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bfw = new BufferedWriter(new FileWriter("b.txt"));
int a;//一次从缓冲区读取一个字符
while((a=bfd.read())!=-1){
bfw.write(a);
}
bfd.close();
bfw.close();
//更加高效的字符流的读写操作,这是第二种
BufferedReader bfd = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bfw = new BufferedWriter(new FileWriter("b.txt"));
//定义一个字符数组
byte[] arr = new byte[1024];
int len;//实际读取到的字符个数
while((len=bfd.read(arr))!=-1){
bfw.write(arr,0,len);//写到缓冲区,缓冲区一满就刷到文件上去,缓冲区的默认大小是8192个单位
}
bfd.close();
bfw.close();
//下面演示字节流转字符流,和字符流转字节流的用法
BufferedReader bfd = new BufferedReader(new InputStreamReader(new FileInputStream("a.txt"))); //字节流转字符流
BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt")));//字符流转字节流
//也是和更加高效的字符流的读写操作一样有两种读写操作,这里只用第二种
//定义一个字符数组
byte[] arr = new byte[1024];
int len;//实际读取到的字符个数
while((len=bfd.read(arr))!=-1){
bfw.write(arr,0,len);//写到缓冲区,缓冲区一满就刷到文件上去,缓冲区的默认大小是8192个单位
}
bfd.close();
bfw.close();
一些其他的流的用法: |
|