io流(io流的引入与文件字节流)


io流的引入与文件字节流

  • io流:就是一根吸管,插入后,可以操作目标文件

  • io流的分类:

    按方向:输入,输出

    按大小:字节,字符

    按处理方式:

    • 处理流:“管套着管” --- 流结合流
    • 节点流:直接跟目标文件接触的流
  • 文件字节流

    • FileInputStream(输入)

    先将文件中的内容导入到程序中来

    一个字符等于两个字节,所以是16位

    package com.bjsxt.test01;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    
    public class Test {
        public static void main(String[] args) throws IOException {
            //文件----->程序
    
            //1.确定一个文件
            File f = new File("D:\\a.txt");//程序连接文件
            //2.将“一根管”插入源文件中去
            FileInputStream fis = new FileInputStream(f);
            //System.out.println(fis.available());//对文件大小进行评估--------15字节
            //3.开始“动作”
            byte[] b = new byte[8];//定义缓冲数组,数组长度为8,下面就是8个8个读字节
            int n = fis.read(b);//返回数组中占用的数量         这里的read方法可以使用数组传参,不传参就是一个一个读字节,传数组长度为8的数组就是8个8个读字节
            while(n!=-1){
                //System.out.println(n);
                for (int i = 0; i <=n-1; i++) {
                    System.out.println(b[i]);//这个循环用来查看数组里面的元素
                }
                n=fis.read(b);
            }
            //4.关闭流
            fis.close();
        }
    }
    
    • FileOutStream(输出)
    package com.bjsxt.test01;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class Test3 {
        public static void main(String[] args) throws IOException {
            //程序--->文件
    
            //1.确定目标文件
            File f = new File("D:\\a\\b.txt");
            //2.将一个吸管插入目标文件中
            FileOutputStream fos = new FileOutputStream(f,true);//加true就是在原来的内容上进行追加,不加就是覆盖原来的内容
            //3.给一个字符串
            String str="   附加:abc你好";
            //4.开始动作
            byte[] bytes = str.getBytes();
            /*
            for (byte b : bytes) {
                fos.write(b);
            }
    
             */
            fos.write(bytes);//这个可以代替上面注释的代码,而且更快,上面哪个是一个一个往外输
            //5.关闭流
            fos.close();
        }
    }
    
    • FileInputStream,FileOutStream(文件的复制)
      1. 效率低的方法
    package com.bjsxt.test02;
    
    import java.io.*;
    
    public class Test01 {
        public static void main(String[] args) throws IOException {
            //1.确定源文件
            File f1 = new File("D:\\a\\b.txt");
            //2.确定目标文件
            File f2 = new File("D:\\a\\a.txt");
            //3.将一根管插入源文件中
            FileInputStream fis = new FileInputStream(f1);
            //4.将一根管插入目标文件中
            FileOutputStream fos = new FileOutputStream(f2);
            //5.开始动作
            int n = fis.read();
            while(n!=-1){//-1就是结尾
                fos.write(n);
                n=fis.read();
            }
            //6.关闭流
            fos.close();
            fis.close();
        }
    }
    
    1. 效率高的方法

      注意:只往出写下标为[0,len)的数组,这是数组中的有效数组,不写无效的元素

    package com.bjsxt.test02;
    
    import java.io.*;
    
    public class Test02 {
        public static void main(String[] args) throws IOException {
            //1.确定源文件
            File f1 = new File("D:\\a\\b.txt");
            //2.确定目标文件
            File f2 = new File("D:\\a\\a.txt");
            //3.将一根管插入源文件中
            FileInputStream fis = new FileInputStream(f1);
            //4.将一根管插入目标文件中
            FileOutputStream fos = new FileOutputStream(f2);
            //5.开始动作
            byte[] b = new byte[6];
            int len = fis.read(b);//len是数组中占用的有效长度
            while(len!=-1){
                fos.write(b,0,len);//把长度为6的数组中下标【0,len)这个位置的写出去
                len = fis.read(b);
            }
            //6.关闭流
            fos.close();
            fis.close();
        }
    }