什么是字节流

像操作 图片 视频 mp4 文档(里面可能有图片) 等等

注意点

  1. 必须使用try catch finally 来包 不用throws(流是要关闭的 如果中途抛错 throws 无法将流关闭 浪费资源)
  2. UTF-8编码下 一个 中文占3个字节 GB2312编码下 一个中文占2个字节

示例

package day03;

import org.junit.Test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;


/**
 * 对于文本文件(.txt .java .c .cpp) 使用字符流处理
 * <p>
 * 对于非文本文件(.jpg .mp3 .mp4 .doc .ppt) 使用字节流处理
 */
public class FileInputOutputStream {
    /**
     * 使用字节流 处理 文本文件 可能出现乱码
     * 我�	�吴�	�� �	�吴�	�� �	�宝�	��我	老�	�
     * UTF-8编码下 一个 中文占3个字节  GB2312编码下 一个中文占2个字节
     */
    @Test
    public void testFileInputStream() {
        FileInputStream fileInputStream = null;
        try {
            File file = new File("08_IO\\hello1");

            fileInputStream = new FileInputStream(file);

            byte[] bytes = new byte[5];
            int len;

            while ((len = fileInputStream.read(bytes)) != -1) {
                String s = new String(bytes, 0, len);
                System.out.print(s + "\t");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if (fileInputStream != null) {
                    fileInputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    /**
     * 使用FileInputStream  和  FileOutPutStream 复制文件的操作
     */
    @Test
    public void testFileInputOutputSream() {
        // 定义 输入  输出 对象
        FileInputStream fis = null;
        FileOutputStream fos = null;

        try {
            // 定义File类对象
            File srcFile = new File("08_IO\\16.jpg");
            File destFile = new File("08_IO\\16_1.jpg");

            // 定义 操作对象
            fis = new FileInputStream(srcFile);
            fos = new FileOutputStream(destFile);

            byte[] bytes = new byte[5];
            int len;
            // 复制图片
            while ((len = fis.read(bytes)) != -1) {
                fos.write(bytes, 0, len);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭流资源
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

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


    /**
     * 指定路径下文件的复制
     */
    public void copyFile(String srcPath, String destPath) {
        // 定义 输入  输出 对象
        FileInputStream fis = null;
        FileOutputStream fos = null;

        try {
            // 定义File类对象
            File srcFile = new File(srcPath);
            File destFile = new File(destPath);

            // 定义 操作对象
            fis = new FileInputStream(srcFile);
            fos = new FileOutputStream(destFile);

            byte[] bytes = new byte[100];
            int len;
            // 复制图片
            while ((len = fis.read(bytes)) != -1) {
                fos.write(bytes, 0, len);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭流资源
            if (fis!=null){
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

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


    @Test
    public void testCopyFile() {
        long startTime = System.currentTimeMillis();
        copyFile("C:\\Users\\yyll\\Desktop\\1.mp4","C:\\Users\\yyll\\Desktop\\1_1.mp4");

        long endTime = System.currentTimeMillis();
        System.out.println("复制花费时间==>" + (endTime - startTime)); // 4915
    }
}

小结

字节流 总结起来
第一步 创建File对象

  1. new File(String path);
  2. new File(String parent,String child);
  3. new File(File parent,String child)
    常用的三种创建方式

第二步创建流
new FileInputSream(File)
new FileInputSream(String)

第三步读取操作

read方法 write方法

第四步关闭流
一定要放到finally中

即使再小的帆也能远航