CC00079.bigdatajava——|Java&IO流.V06|——|Java.v06|IO流.v06|文件字节流|实现文件拷贝|

一、FileOutputStream类(重点)
### --- FileOutputStream类(重点)

——>     [文件字节流实现文件拷贝]——[拷贝文件方式一的实现和缺点]
——>     [拷贝文件方式二的实现和缺点]——[拷贝文件方式三的实现和缺点]
### --- 基本概念

——>        java.io.FileOutputStream类主要用于将图像数据之类的原始字节流写入到输出流中。
二、常用的方法
方法声明功能介绍
FileOutputStream(String name)根据参数指定的文件名来构造对象
FileOutputStream
(String name,boolean append)
以追加的方式根据参数指定的文件名来构造对象
void write(int b)将指定字节写入此文件输出流
void write(byte[] b, int off, int len)将指定字节数组中从偏移量off开始的len个字节写入此文件输出流
void write(byte[] b)将 b.length 个字节从指定字节数组写入此文件输出流中
void flush() 刷新此输出流并强制写出任何缓冲的输出字节
void close()关闭流对象并释放有关的资源
三、FileInputStream类(重点)
### --- 基本概念

——>        java.io.FileInputStream类主要用于从输入流中以字节流的方式读取图像数据等。
四、常用的方法
方法声明功能介绍
FileInputStream(Stringname)根据参数指定的文件路径名来构造对象
int read()从输入流中读取单个字节的数据并返回,返回-1表示读取到末尾
int read(byte[] b, intoff, int len)从此输入流中将最多len个字节的数据读入字节数组中,
返回读取到的字节个数,返回-1表示读取到末尾
int read(byte[] b)从此输入流中将最多 b.length 个字节的数据读入字节数组中,返回读取到的字节个数,返回-1表示读取到末尾
void close()关闭流对象并释放有关的资源
int available() 获取输入流所关联文件的大小
### --- 案例题目

——>        编程实现两个文件之间的拷贝功能。
五、编程代码
package com.yanqi.task17;

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

public class FileByteCopyTest {

    public static void main(String[] args) {

        // 获取当前系统时间距离1970年1月1日0时0分0秒的毫秒数
        long g1 = System.currentTimeMillis();

        FileInputStream fis = null;
        FileOutputStream fos = null;

        try {
            // 1.创建FileInputStream类型的对象与d:/03 IO流的框架图.png文件关联
            //fis = new FileInputStream("d:/03 IO流的框架图.png");
            fis = new FileInputStream("d:/02_IO流的框架结构.mp4");
            // 2.创建FileOutputStream类型的对象与d:/IO流的框架图.png文件关联
            //fos = new FileOutputStream("d:/IO流的框架图.png");
            fos = new FileOutputStream("d:/IO流的框架结构.mp4");
            // 3.不断地从输入流中读取数据内容并写入到输出流中
            System.out.println("正在玩命地拷贝...");
            // 方式一:以单个字节为单位进行拷贝,也就是每次读取一个字节后再写入一个字节
            // 缺点:文件稍大时,拷贝的效率很低
            /*int res = 0;
            while ((res = fis.read()) != -1) {
                fos.write(res);
            }*/
            // 方式二:准备一个和文件大小一样的缓冲区,一次性将文件中的所有内容取出到缓冲区然后一次性写入进去
            // 缺点:若文件过大时,无法申请和文件大小一样的缓冲区,真实物理内存不足
            /*int len = fis.available();
            System.out.println("获取到的文件大小是:" + len);
            byte[] bArr = new byte[len];
            int res = fis.read(bArr);
            System.out.println("实际读取到的文件大小是:" + res);
            fos.write(bArr);*/
            // 方式三:准备一个相对适当的缓冲区,分多次将文件拷贝完成
            byte[] bArr = new byte[1024];
            int res = 0;
            while ((res = fis.read(bArr)) != -1) {
                fos.write(bArr, 0, res);
            }

            System.out.println("拷贝文件成功!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 4.关闭流对象并释放有关的资源
            if (null != fos) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != fis) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        long g2 = System.currentTimeMillis();
        System.out.println("使用文件流拷贝视频文件消耗的时间为:" + (g2-g1));  // 165
    }
}
六、编译打印
D:\JAVA\jdk-11.0.2\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=52374:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\NO.Z.10000——javaproject\NO.H.00001.javase\javase\out\production\javase com.yanqi.task17.FileByteCopyTest
正在玩命地拷贝...
拷贝文件成功!
使用文件流拷贝视频文件消耗的时间为:10

Process finished with exit code 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yanqi_vip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值