Java文件读写和复制

package io;

import java.io.*;
import java.nio.charset.StandardCharsets;

/**
 * IO流概述和分类
 * IO流概述:
 * 1、IO:输入/输出(Input/Output)
 * 2、流:是一种抽象的概念,是对数据传输的总称,也就是说数据在设备间的传输称为流,流的本质是数据传输
 * 3、IO流就是用来处理设备间数据传输问题的(如:文件上传、下载、复制等操作)
 *
 * IO流分类:
 * 1、按照数据的流向分为:
 *      输入流:读数据
 *      输出流:写数据
 * 2、按照数据类型来分:
 *      字节流:
 *      字节输入流、字节输出流
 *      字符流:
 *      字符输入流、字符输出流
 *
 *      NOTE:
 *      1、可以通过普通编辑器打开并编辑的文件就是字符流(如txt文件)
 *      2、图像、视频等无法用普通编辑器编辑的文件就是字节流
 *      3、如果不知道具体属于什么数据类型,就用字节流
 * 3、字节流写入数据:
 *      字节流抽象基类:
 *      1、InputStream:这个抽象类是表示字节输入流的所有类的超类
 *      2、OutputStream:这个抽象类是表示字节输出流的所有类的超类
 *      3、字节流抽象类子类的特点:子类名称都是以其父类名作为子类名的后缀(如:FileInputStream)
 *      FileOutputStream:
 *      1、创建文件输出流以指定的名称写入文件
 * 4、字节缓冲流:
 *      字节缓存流:
 *      BufferOutptStream:该类实现缓冲输出流,通过设置,应用可以向底层输出流写入字节,然后一次调用即可输出流的内容
 *      BufferedIlputStream:该类将创建一个内部缓冲区数组,当从流中读取或跳过字节时,内部缓冲区将根据所包含的输入流中从新填充,一次很多字节
 *
 */

public class IoDemo {

    public static void main(String[] args) throws IOException {
        /*byteBaseWrite();
        byteBaseRead();
        copyBase();
        copyImg();*/

//        buffDemo();
        copyVideo();
    }

    /**
     * 字节流的写入基本操作
     * @throws IOException
     */
    public static void byteBaseWrite() {

        FileOutputStream fi = null;
        try {
            //构造方法需要指定一个资源路径
            boolean append = true;//如果指定第二个参数为true 则在原文件后面追加内容
            fi = new FileOutputStream("P:\\demo\\ddddd.txt",append);

            //写入单个数据 注意:参数是 int 类型
            fi.write(97);//注意:这是字节操作,因此97对应的是字符的a,所以文件中被写入了一个a

            //换行
            fi.write("\r\n".getBytes(StandardCharsets.UTF_8));

            //写入多个数据 注意:参数是byte数组
            byte[] bytes = "我喜欢Java".getBytes(StandardCharsets.UTF_8);//将字符串转换为byte字节
            fi.write(bytes);//我喜欢Java


        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //操作完后一定要关闭资源
            if (fi != null) {
                try {
                    fi.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 字节流的读取基本操作
     */
    public static void byteBaseRead() {
        FileInputStream fi = null;
        try {
            fi = new FileInputStream("P:\\demo\\ddddd.txt");
            //一次读取一个字节
            /*int read;
            while ((read = fi.read()) != -1){
                System.out.print(read);
            }*/

            //一次读取一个字节数组
            byte[] bys = new byte[5];//字母和数字:一个字节, 汉字:GBK 2个字节 UTF8 3个字节
            int len = fi.read(bys);//从该输入流读取最多 b.length 个字节的数据到一个字节数组

            System.out.println(new String(bys,0,len));

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 复制文件:
     *      其实就是将一个文件的数据复制到另一个文件
     *
     *      FileInputStream:打开文件,读取其中数据
     *      FileOutputStream:创建新文件,并将上面读取到的数据写入
     */
    public static void copyBase() {

        FileInputStream fi = null;
        FileOutputStream fi1 = null;
        try {
            //打开文件
            fi = new FileInputStream("P:\\demo\\ddddd.txt");

            //创建文件
            fi1 = new FileOutputStream("P:\\demo\\bbbbbbb.txt");

            //读取打开的文件内容,将内容写入到新文件
            int by;
            while ((by = fi.read()) != -1){
                fi1.write(by);
            }


        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //操作完后一定要关闭资源
            if (fi != null) {
                try {
                    fi.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (fi1 != null) {
                try {
                    fi1.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    /**
     * 复制图片
     */
    public static void copyImg() {
        //打开文件
        FileInputStream fi = null;
        //写入文件
        FileOutputStream fos = null;
        try {
            //打开文件
            fi = new FileInputStream("C:\\Users\\admin\\Pictures\\IntelliJ IDEA 构建Java项目06.png");
            //写入文件
            fos = new FileOutputStream("C:\\Users\\admin\\Pictures\\ttttt.png");

            //读取/写入文件 单个字节
            int len;
            while ((len = fi.read()) != -1) {
                fos.write(len);
            }

            //读取/写入文件 字节数组
            byte[] bys = new byte[1024];
            int lens;
            while ((lens = fi.read(bys)) != -1) {
                fos.write(bys,0,lens);
            }


        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 字节缓冲输出流和输入流
     */
    public static void buffDemo() {

        BufferedOutputStream bos = null;
        BufferedInputStream bis = null;
        try{
            //创建缓冲输出流
            bos = new BufferedOutputStream(new FileOutputStream("P:\\demo\\aaaaa.txt"));
            //写入数据
            bos.write("我喜欢Java,还喜欢Linux".getBytes(StandardCharsets.UTF_8));
            //释放资源
            bos.close();

            //创建缓冲输入流
            bis = new BufferedInputStream(new FileInputStream("P:\\demo\\aaaaa.txt"));
            //读取数据
            byte[] bys = new byte[1024];
            int len;
            while ((len = bis.read(bys)) != -1) {
                System.out.println(new String(bys,0,len));
            }

            //释放资源
            bis.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    /**
     * 复制视频
     */
    public static void copyVideo() {
        BufferedInputStream fis = null;
        BufferedOutputStream fos = null;

        try{
            //打开文件
            fis = new BufferedInputStream(new FileInputStream("C:\\Users\\admin\\Videos\\video_2020-12-18_17-34-09.mp4"));
            //准备写入的文件
            fos = new BufferedOutputStream(new FileOutputStream("C:\\Users\\admin\\Videos\\video.mp4"));

            //读取文件/写入文件
            byte[] bys = new byte[1024];
            int len;
            while ((len = fis.read(bys)) != -1) {
                System.out.println(len);
                fos.write(bys,0,len);
            }

            fos.close();
            fis.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

添加新评论