Java IO流实现文件复制

目录

前言

文件复制底层逻辑

 代码实现

​编辑 重点!!! 

完整代码

 改善思考


前言

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.xdnf.cn/news/139706.html

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

相关文章

uploadifive上传工具php版使用

uploadifive自带的DEMO文件。 下载地址&#xff1a; http://www.uploadify.com/download/ <!DOCTYPE HTML> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"> <title>UploadiFive Test&…

MQ - 24 Pulsar集群架构设计与实现

文章目录 导图概述集群构建主节点弱 ZooKeeper 实现数据可靠性安全控制传输加密端到端加密身份认证资源鉴权可观测性总结导图 概述 从设计定位上来看,Pulsar 是作为 Kafka 的升级替代品出现的,它主要解决了 Kafka 在集群层面的弹性和规模限制问题。那么现在我们就从集群的角…

STM32实现PMBus从机程序

最近在野火的STM32F103VET6开发板上实现PMBus从机程序&#xff0c;这个程序参考了以下这篇博客的关于使用中断法实现I2C从机程序&#xff1a;STM32设置为I2C从机模式_iic从机_柒壹漆的博客-CSDN博客 &#xff0c;实测这个程序是可以正常运行的&#xff0c;感谢博主的分享&#…

3.wifi开发,网络编程

网络协议栈LwIP WiFi UDP Clinet编程 WiFi UDP Server编程 WiFi TCP Client编程 WiFi TCP Server编程 一。LWIP原理介绍&#xff0c;API介绍&#xff0c;文件结构 1.Lwip支持的协议 2.API 3.文件结构 1.api目录&#xff1a;应用程序接口文件。 2.arch目录&#xff1a;与硬件和…

k8s master 是如何进行pod的调度的

Master 节点将 Pod 调度到指定的 Node 节点的原理 该工作由 kube-scheduler 来完成&#xff0c;整个调度过程通过执行一些列复杂的算法最终为每个 Pod 计算出一个最佳的目标 Node&#xff0c;该过程由 kube-scheduler 进程自动完成。常见的有轮询调度&#xff08;RR&#xff09…

Chrome浏览器删除网站cookies的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

[论文笔记]P-tuning v2

引言 今天带来第五篇大模型微调论文笔记P-tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Across Scales and Tasks。 作者首先指出了prompt tuning的一些不足,比如在中等规模的模型上NLU任务表现不好,还不能处理困难的序列标记任务,缺乏统一应用的能力。 然…

安卓系统--翻译手机rom语言 添加多国语言 编译apk 反编译ODEX 工具步骤解析

很多小品牌机型不具备多语言设置。国内大都是中文。要想换为其他语言除非固件支持。例如国际版固件等等。大厂基本都有中文或者英文或者其他语言配置。而小品牌机型只能通过修改rom来达到多语言调用. 工具步骤演示 今天给友友介绍一款工具&#xff0c;可以用来翻译手机rom语言…

LinkedList相较于Arravlist的特点/优化

Arravlist底层是内存空间连续的数组&#xff0c;可以根据下标进行随机访问&#xff0c;效率比较高&#xff0c;因为在根据下标访问某一个元素时&#xff0c;并不是一个一个去查&#xff0c;而是算出来这个下标的地址&#xff0c;直接根据这个地址的指向去获取的&#xff0c;因为…

Android Key/Trust Store研究+ssl证书密钥

前言&#xff1a;软件搞环境涉及到了中间件thal trustzone certificate key&#xff0c;翻译过来是thal信任区域证书密钥 &#xff0c;不明白这是什么&#xff0c;学习一下 ssl证书密钥 SSL密钥是SSL加密通信中的重要组成部分。SSL证书通过加密算法生成&#xff0c;用于保护网…

思科路由器:NAT的基础配置

一直以来&#xff0c;对于华为、H3C、锐捷交换机的命令配置&#xff0c;不断的有朋友留言&#xff0c;三家交换机的配置命令容易弄混&#xff0c;经常在实际项目配置中出错&#xff0c;因此&#xff0c;找几个基础的示例来练练。 R1配置 Router>en Router>enable Rout…

Apifox接口测试工具详细解析

最近发现一款接口测试工具--apifox&#xff0c;我我们很难将它描述为一款接口管理工具 或 接口自测试工具。 官方给了一个简单的公式&#xff0c;更能说明apifox可以做什么。 Apifox Postman Swagger Mock JMeter Apifox的特点&#xff1a; 接口文档定义&#xff1a; Api…

2023华为杯D题——基于Kaya模型的碳排放达峰实证研究

一、前言 化石能源是推动现代经济增长的重要生产要素&#xff0c;经济生产活动与碳排放活动密切相关。充分认识经济增长与碳排放之间的关系对转变生产方式&#xff0c;确定碳达峰、碳中和路径极为必要。本研究在对经济增长与碳排放关系现有研究梳理的基础上&#xff0c;系统地分…

【2023年中国研究生数学建模竞赛华为杯】E题 出血性脑卒中临床智能诊疗建模 问题分析、数学模型及代码实现

【2023年中国研究生数学建模竞赛华为杯】E题 出血性脑卒中临床智能诊疗建模 1 题目 1.1 背景介绍 出血性脑卒中指非外伤性脑实质内血管破裂引起的脑出血&#xff0c;占全部脑卒中发病率的10-15%。其病因复杂&#xff0c;通常因脑动脉瘤破裂、脑动脉异常等因素&#xff0c;导致…

iOS17.0.2更新修复iPhone 15系列机型数据迁移问题,附新机快速数据迁移办法!

iPhone 15 系列机型已于今日正式发售&#xff0c;为解决iPhone15这些机型出现的数据迁移问题&#xff0c;苹果紧急发布了 iOS 17.0.2 更新&#xff0c;内部版本号为 21A350。 需要注意的是&#xff0c; iOS 17.0.2 更新仅适用于 iPhone 15、iPhone 15 Plus、iPhone 15 Pro 和 …

中兴R5300 G4服务器iSAC管理员zteroot密码遗失的重置方法及IPV6地址启用设置

本文讲解中兴R5300 G4服务器BMC带外iSAC管理员zteroot密码遗失&#xff0c;无法登录时如何对其进行密码重置&#xff0c;以及iSAC启用IPV6地址的方法。 一、重置中兴R5300 G4服务器iSAC管理员zteroot密码 1、通过SSH登录到iSAC&#xff0c;默认用户名&#xff1a;sysadmin&am…

科普之加密、签名和SSL握手

一 背景知识 感悟&#xff1a; 不能高不成低不就备注&#xff1a; 以下内容没有逻辑排版,仅做记录 ① 加密方式 说明&#xff1a; 单向和双向认证遗留&#xff1a; 如何用openssl从私钥中提取公钥? ② 互联网数据安全可靠条件 说明&#xff1a; 二者相互印证 二 互联…

Windows专业版的Docker下载、安装与启用Kubenetes、访问Kubernetes Dashboard

到Docker 官网https://www.docker.com/ 下载windows操作系统对应的docker软件安装 Docker Desktop Installer-Win.exe 2023-09版本是4.23 下载后双击安装 重启windows后&#xff0c;继续安装 接受服务继续安装 解决碰到的Docker Engine stopped 打开 控制面板》程序》启用或关…

成为威胁:网络安全中的动手威胁模拟案例

不断变化的网络威胁形势要求组织为其网络安全团队配备必要的技能来检测、响应和防御恶意攻击。然而&#xff0c;在研究中发现并继续探索的最令人惊讶的事情是&#xff0c;欺骗当前的网络安全防御是多么容易。 防病毒程序建立在庞大的签名数据库之上&#xff0c;只需更改程序内…

jupyterlab开发环境最佳构建方式

文章目录 背景jupyterlab环境构建运行虚拟环境构建以及kernel映射验证总结 背景 从jupyter notebook切换到了jupyter lab. 这里记录一下本地环境的最佳构建方式. jupyter lab 安装在jupyterlab-local的anaconda 虚拟环境中.建立多个其他虚拟环境安装各种python包实现环境隔离,…