IO中基本流的使用

89 阅读4分钟

IO的分类特点

以流向的不同:

  • 输入流
  • 输出流

以存储处理单位的不同:

  • 字节流
  • 字符流

以流的角色不同:

  • 节点流
  • 处理流

io流都是从如下4个抽象基类派生而出的

抽象基类输入流输出流
字节流InputStreamOutputStream
字符流ReaderWriter

Image.png

字节输入/输出流

字节输入流: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();

    }

读取的结果如下

image.png

字节输出流:FileOutputStream

依旧是1.关联路径读取对象 2.用write写出

image.png

字节输出流的细节:

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

image.png

知道了字节字符输入输出流,我们现在就可以使用这两种方法,来进行一个文档的拷贝操作了: 来看看字节输入输出流的运用

image.png 对于字符输入输出流,仅仅只需要床创建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中的高级流:序列流,反序列流,转换流等。我们下次细说