IO的分类特点
以流向的不同:
- 输入流
- 输出流
以存储处理单位的不同:
- 字节流
- 字符流
以流的角色不同:
- 节点流
- 处理流
io流都是从如下4个抽象基类派生而出的
| 抽象基类 | 输入流 | 输出流 |
|---|---|---|
| 字节流 | InputStream | OutputStream |
| 字符流 | Reader | Writer |
字节输入/输出流
字节输入流:FileOutputStream
1.关联路径获取读取对象 2.使用read读取
public class 字节输入流 {//读东西进来
public static void main(String[] args) throws IOException {
//获取读取对象:如果不存在,直接报错
FileInputStream fi=new FileInputStream("IO\a.txt");
//读取操作
int read = fi.read();
int read2=fi.read();
System.out.println(read);
System.out.println((char) read2);//强转
//释放
fi.close();
}
读取的结果如下
字节输出流:FileOutputStream
依旧是1.关联路径读取对象 2.用write写出
字节输出流的细节:
1.创建字节输出流对象
- 细节1: 参数是宁符串表示的路径或者是File对象都是可以的
- 细节2: 如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。
-
如左边的a.txt文件。正常是IO:\a.txt来引用。 -
不能够IO:\aaa\a.txt来引用。因为父级路径不存在 - 细节3:如果文件已经存在,则会清空已有的相同内容
-
但是写多个write则会继续添加 -
如果原本有abc ,我又创建一个a在同一个文件中。则会变成a
字符输入/输出流
说到字符输入输出流时,由于编译器的编码解码方式的不同,会导致最后呈现出来的结果,可能会带来 不同的差异。这里我们默认使用idea中的utf-8编码。
下面来看看吧
字符输入流:FileReader
这里使用了循环,来一个个读取字符输入流的对象
FileReader fi=new FileReader("IO\Test.txt");
char[]chars=new char[2];
int len;
while((len= fi.read(chars))!=-1){
//read 的有参构造器
System.out.println(new String(chars,0,len));
字符输出流:FileWrite
知道了字节字符输入输出流,我们现在就可以使用这两种方法,来进行一个文档的拷贝操作了: 来看看字节输入输出流的运用
对于字符输入输出流,仅仅只需要床创建FileRead和FileWrite两个对象,同上字节流操作,也可以实现了拷贝操作。
字符流中的细节:
字符流: 字符流的底层其实就是字节流 字符流=字节流+字符集
特点: 输入流:一次读取一个字节,遇到中文时,一次读取多个字节
按照编码方式的不同读中文。uft-8读三个字节 gk8读两个
** ** 输出流****:底层会把数据按照指定的编码方式进行编码,变成字节再写入到文件中
使用场景:对于纯文本文件进行读写操作
字符流原理解析:
创建字符输入流对象
底层:关联文件,并创建缓冲区(长度为8192的字节数组)
读取数据
底层:
1.判断缓冲区中是否有数据可以读取
2.缓冲区没有数据:就从文件中获取数据,装到缓冲区中,每次尽可能装满缓冲区如果文件中也没有数据了,返回-1
3.缓冲区有数据:就从缓冲区中读取,并且覆盖最前面的缓冲区数据
空参的read方法:一次读取一个字节,遇到中文一次读多个字节,把字节解码并转成十进制返回.
有参的read方法:把读取字节,解码,强转三步合并了,强转之后的字符放到数组中.
这是由于字符流所特有的缓冲区特点,也便有了IO中一个高级流:缓冲流 这里我们就用缓冲流的方法,对字节流实现的拷贝文件进行优化
public class 拷贝文件 {
public static void main(String[] args) throws IOException {
//字符缓冲输入输出流,仍然依靠基本的输入输出流进行,只是创建了8192的缓冲区
//BufferedInputStream 名字 =new BufferInputStreaM(new FileIntputstream(路径))
BufferedInputStream fi=new BufferedInputStream(new FileInputStream("IO\a.txt"));
BufferedOutputStream fo=new BufferedOutputStream(new FileOutputStream("IO\COPY3.txt"));
int len;
while ((len=fi.read())!=-1){
fo.write(len);
}//一次读取多个字节操作
/*byte[]bytes=new byte[1024];
int len
while((len=fi.read(bytes))!=-1){
fo.write(bytes,0,len);
}
*/
fo.close();
fi.close();
}
}
对于IO中的高级流:序列流,反序列流,转换流等。我们下次细说