Java IO流实现文件复制

news2024/12/23 23:05:07

目录

前言

文件复制底层逻辑

 代码实现

​编辑 重点!!! 

完整代码

 改善思考


前言

Windows文件复制时我们是使用Ctrl C复制Ctrl V粘贴,上一篇文章Java基础入门·对存储文件的相关操作

我们学习了Java IO流对文件的读写操作,那我们可以思考一下,IO流字节的读取和写入,怎样运用到文件复制的操作中?


文件复制底层逻辑

IO流的输入流InputStream是读取文件到内存里,outputStream是把字节输出到文件里保存

文件中每个字节依次向新文件中移动,当字节全部移动完成,新文件也就copy复制成功了 


代码实现

首先在Java代码中 IO流的使用,需要输入和输出,所以我们需要

绑定数据源文件        绑定要复制的目标文件(没有此文件时,输出时会自动生成)

先看一下我们要复制的文件,新建了一个1.txt文件,字符为:Hello World ,我们获取一下它的路径,写入代码中绑定,然后让其生成并保存在2.txt文件中

//字节输入流,绑定数据源文件
        FileInputStream fileInputStream = new FileInputStream("F:\\Text\\1.txt");
        //字节输出流,绑定复制的目标文件
        FileOutputStream fileOutputStream = new FileOutputStream("F:\\Text\\2.txt");

 设置字节数组缓冲,提高效率

原有的输出为1个字节1个字节地复制,设置字节数组为1024,则每次输出的大小为1KB(不一定为1024,也可以为1024的整数倍)

//字节数组缓冲
        byte[] bytes = new byte[1024];

 循环读取文件字节,直到read读取到末尾返回-1

这里的write后面两个参数指得是从头开始,然后读取到r个字节,就写入r个字节

最后不要忘记close关闭两个IO流(记得是两个,一个也不能少)

最后不要忘记close关闭两个IO流(记得是两个,一个也不能少)

最后不要忘记close关闭两个IO流(记得是两个,一个也不能少)

while ((r = fileInputStream.read(bytes))!=-1){
            //字节输出流,写入字节数组
            fileOutputStream.write(bytes,0,r);
        }
fileInputStream.close();
        fileOutputStream.close();

最后我们运行一下代码,可以发现是可行的,成功新建了一个文件,并把1.txt的内容复制到了2.txt里。这种方法不局限于复制文本文件,还可以进行图片,视频的复制等


重点!!! 

文件名一定要注意中英文!!!

若使用的编码不对,出现中文乱码,文件就无法复制,出现报错!!!


完整代码

public class copyText {
    public static void main(String[] args) throws IOException {
        copy01();
    }

    public static void copy01() throws IOException {
        //字节输入流,绑定数据源文件
        FileInputStream fileInputStream = new FileInputStream("F:\\Text\\1.txt");
        //字节输出流,绑定复制的目标文件
        FileOutputStream fileOutputStream = new FileOutputStream("F:\\Text\\2.txt");
        //字节数组缓冲
        byte[] bytes = new byte[1024];

        int r = 0;
        //循环读取数据源文件
        while ((r = fileInputStream.read(bytes))!=-1){
            //字节输出流,写入字节数组
            fileOutputStream.write(bytes,0,r);
        }
        fileInputStream.close();
        fileOutputStream.close();
    }
}

文件夹复制

在Java中要复制文件夹,可以通过递归来实现。

首先需要判断当前处理的文件是文件夹还是文件,如果是文件夹,就遍历文件夹下的所有文件和子目录

递归操作;如果是文件,则使用IO流来拷贝文件。

这个示例代码会将指定的源文件夹路径中的所有内容复制到指定的目标文件夹路径中,包括子文件夹和文件。需要注意的是,如果目标文件夹不存在,程序会自动创建一个。

import java.io.*;

public class CopyFolderExample {
    public static void main(String[] args) {
        String sourceFolder = "C:\\input"; // 源文件夹路径
        String destinationFolder = "C:\\output"; // 目标文件夹路径
        File sourceFile = new File(sourceFolder);
        File destinationFile = new File(destinationFolder);

        try {
            if (sourceFile.isDirectory()) {
                if (!destinationFile.exists()) {
                    destinationFile.mkdir();
                }
                String[] files = sourceFile.list();
                for (String file : files) {
                    File srcFile = new File(sourceFile, file);
                    File destFile = new File(destinationFile, file);
                    copyFolder(srcFile, destFile);
                }
            } else {
                InputStream inputStream = new FileInputStream(sourceFile);
                OutputStream outputStream = new FileOutputStream(destinationFile);

                byte[] buffer = new byte[1024];
                int length;
                while ((length = inputStream.read(buffer)) > 0) {
                    outputStream.write(buffer, 0, length);
                }

                inputStream.close();
                outputStream.close();
            }
            System.out.println("Folder copied successfully.");
        } catch (IOException e) {
            e.printStackTrace();
            System.err.println("Unable to copy folder.");
        }
    }

    private static void copyFolder(File source, File destination) throws IOException {
        if (source.isDirectory()) {
            if (!destination.exists()) {
                destination.mkdir();
            }

            String[] files = source.list();
            for (String file : files) {
                File srcFile = new File(source, file);
                File destFile = new File(destination, file);
                copyFolder(srcFile, destFile);
            }
        } else {
            InputStream inputStream = new FileInputStream(source);
            OutputStream outputStream = new FileOutputStream(destination);

            byte[] buffer = new byte[1024];
            int length;
            while ((length = inputStream.read(buffer)) > 0) {
                outputStream.write(buffer, 0, length);
            }

            inputStream.close();
            outputStream.close();
        }
    }
}

改善思考

 文件复制粘贴会了,那剪切是否可以尝试一下,哈哈其实就是在原有的基础上,先通过复制文件,把字节都移动后,再把原文件删除即可,这对于你们来说,应该是小意思,那就当课后作业吧!

今天的Java文章分享就到此结束了, 喜欢的小伙伴记得一键三连,点赞收藏评论,如果想了解更多内容,可以用未来百万富豪的手指,点点小小的关注!你们的支持就是我最大的动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1033459.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构--排序(1)

文章目录 排序概念直接插入排序希尔排序冒泡排序堆排序选择排序验证不同排序的运行时间 排序概念 排序指的是通过某一特征关键字(如信息量大小,首字母等)来对一连串的数据进行重新排列的操作,实现递增或者递减的数据排序。 稳定…

深度学习自学笔记二:逻辑回归和梯度下降法

目录 一、逻辑回归 二、逻辑回归的代价函数 三、梯度下降法 一、逻辑回归 逻辑回归是一种常用的二分类算法,用于将输入数据映射到一个概率输出,表示为属于某个类别的概率。它基于线性回归模型,并使用了sigmoid函数作为激活函数。 假设我们…

Git_06_创建分支/查看分支

创建分支 # 创建分支的同时,切换到该分支上 > git checkout -b 分支名称 # > git push origin 分支名称查看分支 # 查看本地分支 > git branch # 查看远程分支 > git branch -r # 查看所有分支 > git branch -a删除分支 # 删除本地分支 > git …

app一键加固加签名脚本 百度加固 window版本

echo off setlocal enabledelayedexpansionset KEYSTORE_PATH*.jks set KEYSTORE_PASSWORD* set KEY_ALIAS* set KEY_PASSWORD*set OUTPUT_DIR%cd%\out set UNSIGNED_DIR%cd%\unsignedREM 设置加固工具的路径和密钥 set APKPROTECT_PATH"apkprotect" set AKEY替换成你…

Postman 全局配置接口路径变量等

Postman 全局配置接口路径变量等 一、简介 这里主要是介绍通过配置postman接口测试工具,简化每次新增模块等接口时修改url的繁琐过程,方便以后查阅!!! 二、全局变量设置 1、新增测试环境 新增测试环境 2、接口集合设…

上N下P三极管推挽电路----》交越失真问题的解决

交越失真现象: 波形失真原因: 三极管的导通条件是Vbe > 0.7V,在正弦波驱动波形介于-0.7v ~ 0.7v之间时,上N管子截止、下P管子也截止,此时波形失真。 (关于三极管的伏安特性曲线、米勒效应,请自行百度) …

UOS Deepin Linux 安装 anaconda

UOS Deepin Linux 安装 anaconda 下载 anaconda 官网下载 国内开源镜像站下载 官网下载 anaconda 官网: https://www.anaconda.com/ 点击右上角 Free Download 按钮 跳转值下载页面:https://www.anaconda.com/download 国内开源镜像站下载 清华大学开源…

MySQL案例详解 二:MHA高可用配置及故障切换

文章目录 1. MHA的简单介绍1.1 MHA概述1.2 MHA的核心组件1.2.1 Manager 节点1.2.2 Master 节点1.2.3 Slave 节点 1.3 MHA的工作原理1.4 工作流程1.5 MHA架构的特点 2. 部署MHA实现MySQL高可用2.1 首先实现主从复制2.1.1 前置准备2.1.2 配置主服务器2.1.3 配置从服务器12.1.4 配…

给/etc/docker/daemon.json中配置graph后docker启动失败

目录 背景 排查 解决 另外注意 背景 启动报错: Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details. 迁移docker目录&…

Neo4j CQl语句(持续更新)

1.清空所有数据 MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r2.删除一个节点及其所有的关系 MATCH (r) WHERE id(r) 11 DETACH DELETE r3.删除一个节点 DELETE(通过属性删除) MATCH (n:标签{name:temp}) delete n4.删除所有节点和所有的关系 MA…

Android事件分发机制源码解析

触摸事件传递机制是Android中一块比较重要的知识体系,了解并熟悉整套的传递机制有助于更好的分析各种滑动冲突、滑动失效问题,更好去扩展控件的事件功能和开发自定义控件。 预备知识 MotionEvent 在Android设备中,触摸事件主要包括点按、长…

Steam VR Plugin 2.7.3爬坑指南

因为项目有VR串流的需要,于是就用起了PicoSteam VR串流,真是一把心酸泪,坑还真不少。有些解决了,有些没有,等待后续更新或者有好心人指点一下啊,进入正题。 (1)导入插件之后&#xf…

Qt5开发及实例V2.0-第十六章-Qt汽车销售管理系统实例

Qt5开发及实例V2.0-第十六章-Qt汽车销售管理系统实例 Qt汽车销售管理系统实例一、 系统概述二、 系统模块三、 界面设计四、 代码实现五、 总结 本章相关例程源码下载 Qt汽车销售管理系统实例 一、 系统概述 汽车销售管理系统是一款基于QT5框架开发的管理系统,主要…

回归预测 | Matlab实现基于MIC-BP最大互信息系数数据特征选择算法结合BP神经网络的数据回归预测

回归预测 | Matlab实现基于MIC-BP最大互信息系数数据特征选择算法结合BP神经网络的数据回归预测 目录 回归预测 | Matlab实现基于MIC-BP最大互信息系数数据特征选择算法结合BP神经网络的数据回归预测效果一览基本介绍研究内容程序设计参考资料 效果一览 基本介绍 Matlab实现基于…

LeetCode【69. x 的平方根】

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 1&#xff1…

智云谷再获AR HUD新项目定点,打开HUD出口海外新通道

深圳前海智云谷科技有限公司(以下简称“智云谷”)于近日收到国内某新能源车企的《定点通知书》,选择智云谷作为其新车型AR HUD开发与量产供应商。智云谷获得定点的车型为海外出口车型,该车型预计在2024年下半年量产。 中国汽车全产业链出海“圈粉” 随…

矿山定位系统-矿井人员定位系统在矿山自动化安全监控过程中的应用

一,矿井人员定位系统现阶段使用的必要性 1,煤矿开采是一项非常特殊的工作,现场属于非常复杂多变的环境,井下信号极差,数据传输非常不稳定,人员安全难以保证,煤矿企业一直在研究如何使用更合适的…

【MATLAB第77期】基于MATLAB代理模型算法的降维/特征排序/数据处理回归/分类问题MATLAB代码实现【更新中】

【MATLAB第77期】基于MATLAB代理模型算法的降维/特征排序/数据处理回归/分类问题MATLAB代码实现 本文介绍基于libsvm代理模型算法的特征排序方法合集,包括: 1.sing 2.adaboost 3.corr 4.svmrfe_ker 5.svmrfe_ori 1.sing 十折交叉取平均错误率值 累计贡…

微信小程序python+nodejs+php+springboot+vue 学习资料销售平台

本文的组织结构如下: 1、绪论。综述了本文的研究背景,分析了微信小程序学习资料销售平台的结构;更好的从用户的角度出发,发现当今学习资料销售管理中的不足,同时要指出本次系统中的特色。 3、系统的设计与实现。介绍了…

31.链表练习题(2)(王道2023数据结构2.3.7节16-25题)

【前面使用的所有链表的定义在第29节】 试题16:两个整数序列A,B存在两个单链表中,设计算法判断B是否是A的连续子序列。 bool Pattern(LinkList L1,LinkList L2){ //此函数实现比较L1的子串中是否有L2LNode *p, *q; //工作在L1,p记录L1子串…