这四个类都是抽象类,可以把这四个类想象成四根不同的管道。一端接着你的程序,另一端接着数据
源,你可以通过输出管道从数据源里面往外读数据,也可以通过输入管道往数据源里面输入数据,总
之,通过这四根管道可以让数据流进来和流出去。
字节流和字符流
按照内存我们能知道字节流
是8(bit),字符流
是16(bit)。
字节流就是通过一个字节一个字节
的读取,字符流则是通过字符
读取。一般情况下,一个字符是两个字节。
补充:
1.对于文本文件(.txt,.c,.java,.cpp),使用字符串处理。
2.对于非文本文件(.jpg,.mp3,.mp4,.avi,.doc,.ppt),使用字节流处理。
节点流和处理流
概念:
节点流:节点流可以是从一个特定的数据源读取写入数据。
处理流:处理流是
链接
在已经存在的节点流或者处理流之上,通过对数据的处理为程序提供更强大的读写功能!
节点流:
处理流:
注:一般处理流比节点流的效率快,但是并不是处理流越多越好。
节点流类型
| 类型 | 字符流 | 字节流 |
| — | — | — |
| File(文件) | | |
| Memory,Array | CharArrayReader、CharArrayWriter | ByteArrayInputStream、ByteArrayOutputStream |
| Memory,String | StringReader、StringWriter | -------- |
| Pipe(管道) | PipedReader、PipedWriter | PipedInputStream、PipedOutputStream |
节点流就是一根管道直接插到数据源上面,直接读数据源里面的数据,或者是直接往数据源里面写入数据。典型的节点流是文件流:文件的字节输入流(FileInputStream),文件的字节输出流(FileOutputStream),文件的字符输入流(FileReader),文件的字符输出流(FileWriter)。
处理流类型
| 处理类型 | 字符流 | 字节流 |
| — | — | — |
| Buffffering | BufffferedReader、BufffferedWriter | BufffferedInputStream、BufffferedOutputStream |
| Filtering | FilterReader、FilterWriter | FilterInputStream,FilterOutputStream |
| Converting between,bytes and chaacter | InputStreamReader、OutputStreamWriter | ---------- |
| Object Serialization | -------- | ObjectInputStream、ObjectOutputStream |
| Data conversion | ---------- | DataInputStream、DataOutputStream |
| Counting | LineNumberReader | LineNumberInputStream |
| Peeking ahead | PusbackReader | PushbackInputStream |
| Printing | PrintWriter | PrintStream |
处理流是包在别的流上面的流,相当于是包到别的管道上面的管道。
🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲分割线🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲
InputStream的基本使用
通过对源码的分析我们能知道inputStream
的一些功能函数的作用和使用方法。
1.
int read() throws IOException
读取一个字节并以整数的形式返回(0~255),如果返回-1就说明已经到了输入流的末尾。
2.
int read(byte[] buffer) throws IOException
读取一系列字节并存储到一个数组buffer ,返回实际读取的字节数,如果读取前已到输入流的末尾,则返回-1。
3.
int read(byte[] buffer,int offset,int length) throws IOException
读取length个字节
并存储到一个字节数组buffer,从length位置开始
返回实际读取的字节数,如果读取前以到输入流的末尾返回-1.
4.
void close() throws IOException
关闭流释放内存资源 .
5.
long skip(long n) throws IOException
跳过n个字节不读,返回实际跳过的字节数
方法1和方法2的区别
方法1中的read()就是表示一个个字节的读取,而方法2中的read(buffer)则是先把一定长度的字节放在buffer的数组里面然后在读取。这就好比用不同大小的桶来进行取水。
案例
【演示:使用 FileInputStream
流来读取 FileInputStream.java
文件的内容】
import java.io.IOException;
public class zj_bit {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = null;
try {
String pathName =“E:\IO-stream\src\ceshi.TXT”;
File file = new File(pathName);
fileInputStream = new FileInputStream(file);
byte[] buffer = new byte[100];
int len ;
while ( (len = fileInputStream.read(buffer)) != -1 ){
String print = new String(buffer,0,len);
System.out.println(print);
}
} finally {
fileInputStream.close();
}
}
}
结果:
hello铁甲小宝
//输出出来的文本内容。
🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲分割线🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲
OutputStream的基本使用
通过对OutputStream源码的查看我们也能知道其中的一下功能函数。
1.
void write(int b) throws IOException
向输出流中写入一个字节数据,该字节数据为参数b的低8位 。
2.
void write(byte[] b) throws IOException
将一个字节类型的数组中的数据写入输出流 。
3.
void write(byte[] b,int off,int len) throws IOException
将一个字节类型的数组中的从指定位置(off)开始的len个字节写入到输出流 。
4.
void close() throws IOException
关闭流释放内存资源
5.
void flush() throws IOException
将输出流中缓冲的数据全部写出到目的地。
案例
【使用FileOutputStream流复制一个文件】
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class outputStream_copy {
public static void main(String[] args) throws IOException {
FileInputStream fi = null;
FileOutputStream fo = null;
try {
String pathName1 = “E:\IO-stream\src\ceshi.TXT”;
String pathName2 = “E:\IO-stream\src\ceshi2.TXT”;
File file = new File(pathName1);//处理流
File file1 = new File(pathName2);
fi = new FileInputStream(file);
fo = new FileOutputStream(file1);
byte[] buffer = new byte[100];
int len;
while((len = fi.read(buffer)) != -1){
fo.write(buffer,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
fi.close();
fo.close();
}
}
}
结果:
FileInputStream和FileOutputStream这两个流都是字节流,都是以一个字节为单位进行输入和输出的。所以对于占用2个字节存储空间的字符来说读取出来时就会显示成乱码。
🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲分割线🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲
Reader的基本使用方法和InputStream是相同的,同理Writer的基本使用方法和OutputStream是一样的。
FileReader和FileWriter这两个流都是字符流,都是以一个字符为单位进行输入和输出的。所以读取和写
入占用2个字节的字符时都可以正常地显示出来,以上是以File(文件)这个类型为例对节点流进行了讲
解,所谓的节点流指定就是直接把输入流或输出插入到数据源上,直接往数据源里面写入数据或读取数
据。
🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲分割线🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲
缓冲流(Buffffering)
缓冲流的作用?
使用缓冲数组以后,整体的读取,写入效率提升很大。降低了CPU通过内存访问硬盘的次数。提高效率,降低磁盘损耗。
缓冲流的常用方法
BufferedReader(Reader in)
BufferedReader(Reader in,int sz) //sz 为自定义缓冲区的大小
BufferedWriter(Writer out)
BufferedWriter(Writer out,int sz)
BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in,int size)
BufferedOutputStream(InputStream in)
BufferedOutputStream(InputStream in,int size)
我们能把缓冲流比作一个桶在取水的时候是在桶满的时候才会将桶提出来,而缓冲流则也是如此。使用缓冲流我们能减少对硬盘的访问,进而保护硬盘。
注意:
这里需要注意的是,所有的缓冲流都没有任何的读取,写入文件能力,这里都需要对应的输入流和输出流
来提供对应的能力。
在创建缓冲流流对象时,需要传入对应的输入流对象和输出流对象。底层就是提供了一个默认大小的缓冲
数组,用于提高效率。
案例
【使用BufferedReader
和BufferedWriter
对文件的复制】
import java.io.*;
public class BufferTest {
public static void main(String[] args) throws IOException {
buffercopy(“E:\IO-stream\src\ceshi.TXT”,“E:\IO-stream\src\ceshi1.TXT”);
}
public static void buffercopy(String pathName1,String pathName2) throws IOException {
BufferedReader br = null;
BufferedWriter bw = null;
try {
br = new BufferedReader(new FileReader(new File(pathName1)));
bw = new BufferedWriter(new FileWriter(new File(pathName2) ));
char[] buffer = new char[1024];
int len;
while ((len = br.read(buffer)) != -1){
bw.write(String.valueOf(buffer),0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
br.close();
bw.close();
}
}
}
结果在上一个案例我们能看到。
🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳分界线🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳
转换流
转换流的作用?
提供字节流与字符流之间的转换
转换流的使用
InputStreamReader:将一个字节流的输入流转换为字符流的输入流。
InputStreamReader 需要和 InputStream “套接” 。
OutputStreamWriter:将一个字符流的输出流转换为字节流的输出流。
OutputStreamWriter 需要和 OutputStream “套接” 。
转换流非常的有用,它可以把一个字节流转换成一个字符流,转换流有两种,一种叫
InputStreamReader,另一种叫OutputStreamWriter。InputStream是字节流,Reader是字符流,
InputStreamReader就是把InputStream转换成Reader。OutputStream是字节流,Writer是字符流,
结尾
这不止是一份面试清单,更是一种”被期望的责任“,因为有无数个待面试者,希望从这篇文章中,找出通往期望公司的”钥匙“,所以上面每道选题都是结合我自身的经验于千万个面试题中经过艰辛的两周,一个题一个题筛选出来再次对好答案和格式做出来的,面试的答案也是再三斟酌,深怕误人子弟是小,影响他人仕途才是大过,也希望您能把这篇文章分享给更多的朋友,让他帮助更多的人,帮助他人,快乐自己,最后,感谢您的阅读。
由于细节内容实在太多啦,在这里我花了两周的时间把这些答案整理成一份文档了,在这里只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
er:将一个字节流的输入流转换为字符流的输入流。`
InputStreamReader 需要和 InputStream “套接” 。
OutputStreamWriter:将一个字符流的输出流转换为字节流的输出流。
OutputStreamWriter 需要和 OutputStream “套接” 。
转换流非常的有用,它可以把一个字节流转换成一个字符流,转换流有两种,一种叫
InputStreamReader,另一种叫OutputStreamWriter。InputStream是字节流,Reader是字符流,
InputStreamReader就是把InputStream转换成Reader。OutputStream是字节流,Writer是字符流,
结尾
[外链图片转存中…(img-Czesu3S3-1719263424355)]
这不止是一份面试清单,更是一种”被期望的责任“,因为有无数个待面试者,希望从这篇文章中,找出通往期望公司的”钥匙“,所以上面每道选题都是结合我自身的经验于千万个面试题中经过艰辛的两周,一个题一个题筛选出来再次对好答案和格式做出来的,面试的答案也是再三斟酌,深怕误人子弟是小,影响他人仕途才是大过,也希望您能把这篇文章分享给更多的朋友,让他帮助更多的人,帮助他人,快乐自己,最后,感谢您的阅读。
由于细节内容实在太多啦,在这里我花了两周的时间把这些答案整理成一份文档了,在这里只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!