字节输出流

1.构造方法

        //1.创建字节输出流的对象 告诉虚拟机我要往哪个文件中写数据了
            //如果文件不存在会自动创建
        FileOutputStream fos = new FileOutputStream("D:\\a.txt");
        //2.写数据(会把以前存在的内容覆盖)
            //传递一个整数时 实际上写到文件中的是这个整数在码表中对应的字符串
        fos.write(97);

        //3.释放资源
        fos.close();//不释放会一直占用a.txt导致无法删除

如果想要不覆盖原有数据,需要在路径后加一个true(不加的话在创建FileOutputStream对象时内容就会被全部覆盖)

FileOutputStream fos = new FileOutputStream("D:\\a.txt", true);

2.字节流写数据的三种方法

void write(int b)
void write(byte[] b)
void write(byte[] b, int off, int len)
//示例代码
        FileOutputStream fos = new FileOutputStream("a.txt");
        byte[] bytes = {97, 98, 99, 100, 101, 102, 103, 104, 105};
        fos.write(bytes);
        fos.write(bytes, 0, 5);//字节数组名, 起始下标, 总长度
        fos.close();

3.写入数据时换行:

fos.write("\r\n".getBytes());//getByte()的作用是把字符串转换为一个字节数组

4.try catch finally

        try {
            file = new FileOutputStream("a.txt");
            file.write(97);
        } catch (Exception e){
            e.printStackTrace();
        } finally {
            if (file != null){
                try {
                    file.close();
                } catch (IOException e){
                    e.printStackTrace();
                }
            }
        }

字节输入流

构造函数

        FileInputStream file = new FileInputStream("a.txt");
        char res = (char)file.read();//read()方法一次只能读取一个字节, 而且读到的是在码表中对应的数字
        //所以要用(char)强转成字符
        file.close();
        System.out.println(res);

连续读取

    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("a.txt");
        int b;
        while ((b = fis.read()) != -1){
            System.out.println((char)b);
        }
    }

单字节复制

无参数的 read() 方法:
int read(): 读取一个字节的数据,并返回一个 int 值。如果读取到字节数据,则返回该字节的值(0-255), 没读取到就返回-1

        FileInputStream fis = new FileInputStream("D:\\刷课\\浏览器版-1.2.0\\超星智慧树网课助手浏览器版V1.2.0\\运行此文件.exe");
        FileOutputStream fos = new FileOutputStream("运行此文件.exe");
        int b;
        while ((b = fis.read()) != -1){
            fos.write((char)b);
        }

字节数组复制

有参数的 read(byte[] b) 方法:
int read(byte[] b): 读取数据到字节数组 b 中,并返回实际读取的字节数。如果没读取到,则返回 -1。

        FileInputStream fis = new FileInputStream("D:\\剪辑\\抽奖\\002.mp4");
        FileOutputStream fos = new FileOutputStream("002.mp4");
        byte[] carray  = new byte[1024];
        while ((length = fis.read(carray)) != -1){
            fos.write(carray, 0, length);
        }

缓冲流

缓冲流 是在字节流基础上进行优化的流,使用内存中的缓冲区来减少对底层I/O的直接操作,从而提高效率。在底层和字节流通过字节数组复制一样, 内置了一个字节数组.

缓冲流单字节复制

    public static void main(String[] args) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\剪辑\\抽奖\\202401082102.mp4"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("1.mp4"));

        int b;
        while((b = bis.read()) != -1){
            bos.write(b);
        }
        bis.close();
        bos.close();
    }

缓冲流字节数组复制

    public static void main(String[] args) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\剪辑\\抽奖\\202401082102.mp4"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("1.mp4"));

        byte[] temp = new byte[1024];
        int len;
        while ((len = bis.read(temp)) != -1){
            bos.write(temp, 0, len);
        }
        bis.close();
        bos.close();

    }