Java字节流文件复制
1、字节流
在 Java 中,文件的复制使用字节输入流和字节输出流实现,java.io 包有 InputStream 和 OutputStream 这两个顶层抽象类规范了读写文件所需的核心 API。
我们可以使用它们的子类 FileInputStream 和 FileOutputStream 来编写程序复制文件。
第一种方式:
使用 read() 和 write() 方法配合循环操作单字节的读取、写入
InputStream 的 read() 会尝试从文件读取一个字节,如果到了文件结尾则会返回-1
第二种方式:
使用 read(byte[]) 和 write(byte[], int, int) 方法配合字节缓冲、循环操作实现高效的读取、写入
InputStream 的 read(byte[]) 会尝试从文件读取 byte[] 长度个字节,该方法会把具体读取到的字节数返回,如果到了文件结尾则会返回 -1
OutputStream 的 write(byte[] buf, int offest, int len) 方法会把 buf 数组中从偏移量 offest 开始的 len 个字节写到输出流
2、单字节读写
private static void copyFile(String src, String dst) throws IOException {
// 用于计算程序运行时间
long start = System.currentTimeMillis();
// 定义输入流和输出流
FileInputStream fis = null;
FileOutputStream fos = null;
try {
// 实例化输入流和输出流
fis = new FileInputStream(src);
fos = new FileOutputStream(dst);
int i = fis.read();
// 循环从输入流读取字节,直到读取到-1即文件结尾
while(i != -1) {
fos.write(i); // 写出到输出流
i = fis.read();
}
} catch (IOException e) {
// 需要捕获IOException
e.printStackTrace();
throw e;
} finally {
// 在finally代码块关闭IO流
try {
if (fis != null)
fis.close();
if (fos != null)
fos.close();
} catch (IOException e) {}
}
// 计算程序运行时间
long end = System.currentTimeMillis();
System.out.println(end - start);
}
3、定义缓冲高效读写
private static void bufferedCopyFile(String src, String dst) throws IOException {
// 用于计算程序运行时间
long start = System.currentTimeMillis();
// 定义输入流和输出流
FileInputStream fis = null;
FileOutputStream fos = null;
try {
// 实例化输入流和输出流
fis = new FileInputStream(src);
fos = new FileOutputStream(dst);
// 定义一个字节缓冲数组
byte[] buf = new byte[1024];
int i = fis.read(buf);
// 循环从输入流尝试读取buf长度的字节存放到buf中
while(i != -1) {
fos.write(buf, 0, i); // 把buf写到输出流
i = fis.read(buf);
}
} catch (IOException e) {
// 需要捕获IOException
e.printStackTrace();
throw e;
} finally {
// 在finally代码块关闭IO流
try {
if (fis != null)
fis.close();
if (fos != null)
fos.close();
} catch (IOException e) {}
}
// 计算程序运行时间
long end = System.currentTimeMillis();
System.out.println(end - start);
}
4、程序运行
public static void main(String[] args) {
String src = "D:\\src.bmp";
String dst = "D:\\tmp\\java\\dst.bmp";
try {
// 单字节读写
copyFile(src, dst);
// 定义缓冲高效读写
bufferedCopyFile(src, dst);
} catch (IOException e) {
e.printStackTrace();
}
}
输出:
21092
162
可以看到定义了缓冲区的方法要比单字节地读写效率高很多
Java字节流文件复制的更多相关文章
- Java实现文件复制的四种方式
背景:有很多的Java初学者对于文件复制的操作总是搞不懂,下面我将用4中方式实现指定文件的复制. 实现方式一:使用FileInputStream/FileOutputStream字节流进行文件的复制操 ...
- java中文件复制的4种方式
今天一个同事问我文件复制的问题,他一个100M的文件复制的指定目录下竟然成了1G多,吓我一跳,后来看了他的代码发现是自己通过字节流复制的,定义的字节数组很大,导致复制后目标文件非常大,其实就是空行等一 ...
- java多种文件复制方式以及效率比较
1.背景 java复制文件的方式其实有很多种,可以分为 传统的字节流读写复制FileInputStream,FileOutputStream,BufferedInputStream,BufferedO ...
- Java 实现文件复制的不同方法
用不同的方法实现文件的复制 1. 通道 Channel,它是一个对象,可以通过它读取和写入数据.拿NIO与原来的I/O比较,通道就像是流.是对接操作系统底层和缓冲区的桥梁. 2. 性能比较 内存映射最 ...
- Java字节流文件封装
/** * 字节流封装方法 */ import java.io.FileInputStream; import java.io.FileNotFoundException; import jav ...
- java实现文件复制粘贴功能
java编程思想中讲到了IO流的思想,以前对于java基础总是不够深入,浅尝辄止,如今碰到语句插桩的时候就感到书到用时方恨少啊! 文件的复制涉及到源文件和新文件(无需手动创建),给出源文件的路径和文件 ...
- 【java】文件复制的简单实现
package 文件操作; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; ...
- javaee字节流文件复制
package Zy; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.Fil ...
- java IO 文件复制代码模型
package com.xjtu.demo; import java.io.*; public class FileCopy { public static void main(String[] ar ...
随机推荐
- 使用深度学习的超分辨率介绍 An Introduction to Super Resolution using Deep Learning
使用深度学习的超分辨率介绍 关于使用深度学习进行超分辨率的各种组件,损失函数和度量的详细讨论. 介绍 超分辨率是从给定的低分辨率(LR)图像恢复高分辨率(HR)图像的过程.由于较小的空间分辨率(即尺寸 ...
- hdu5387 钟表指针之间夹角(分数计算,模拟)
题意: 给你一个24格式的数字时间,(字符串),问你这个时刻时针与分针 时针与秒针 分针与秒针 之间的夹角, 我们发现 秒针每秒转6度,分针每秒转1/10度,每分转6度,时针每小时转30度,每分转1/ ...
- 解决iis内存占用过大的问题--ZT
解决iis内存占用过大的问题 在IIS6下,经常出现w3wp的内存占用不能及时释放,从而导致服务器响应速度很慢. 今天研究了一下,可以做以下配置: 1.在IIS中对每个网站进行单独的应用程序池配置.即 ...
- 数据分析之--log文件自动化分析
https://mp.weixin.qq.com/s?__biz=MjM5NjE2MTIyMw==&mid=2257483803&idx=1&sn=efe24b040397cd ...
- win10下通过npm成功搭建react开发环境
1.安装node-v12.13.1-x64(LTS) 2.安装creatre-react-app: npm install -g create-react-app 3.通过create-react-a ...
- (转)scipy详解
原文:https://www.cnblogs.com/ws0751/p/8361353.html#top 登月图片消噪 scipy.fftpack模块用来计算快速傅里叶变换速度比传统傅里叶变换更快 ...
- 一码学程 10284 排队找bug 题解 单调队列 或者 线段树RMQ
注:只是看到题目,未评测,所以不确定代码正确性,但是算法思路没有问题 描述 同学们的bug还真是多啊,orz... 春节期间大家存下的bug都来找肖老师解决了. 每个人都有bug,但是肖老师却只有一个 ...
- [LeetCode] 195. Tenth Line 第十行
Given a text file file.txt, print just the 10th line of the file. Example: Assume that file.txt has ...
- SVN 本地文件锁/服务端文件锁清除步骤
1.本地文件锁,直接cleanup,cleanup界面选择break locks即可 2.服务端文件锁,本地文件右击没有release lock或者break lock的选项时 方法1:右键,svn选 ...
- 没有索引导致的DIRECT PATH READ
5月20号下午4-5点,某项目组进行数据入库作业,作业人员反映入库速度很慢.在16:30和16:50分别采集了快照,并根据两个快照得到AWR报告. 直接看TOP 5 EVENTS,这是数据库问题诊断的 ...