`
Sunflower-13
  • 浏览: 74029 次
  • 性别: Icon_minigender_2
  • 来自: 长沙
社区版块
存档分类
最新评论

提高文件复制的性能

阅读更多
    昨天学习了字节输入流 :InputStream和字节输出流 :OutputStream的一些常用方法,课后老师要求我们能利用所学知识来提高文件复制的性能。课后我用了两种方法实现文件的复制,第一种是读取一个字节写入一个字节的方法,这种方法比较慢,耗时多。第二种方法是创建了一个字节数组作为中间流的缓存区(姑且让我这么说),因为其原理是先将输入流存放到数组,再将数组中的数据流写入输出流中,这样大大减少了耗时时间量。下面是两种方法的源代码及凭自己的理解加的一些注释,可能会不太精准
方法一:普通实现,大小为915k的文件复制耗时约1400多毫秒
/**
* 提高文件复制效率:例如要将F:\sun\上课笔记\cc.txt中的内容复制到F:\sun\上课笔记\x.txt中, cc.txt的大小为915KB
*/

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Homeworkcopy1 {
public static void main(String[] args) {
try {
//根据文件路径创建文件输入流
FileInputStream input=new FileInputStream("F:\\sun\\上课笔记\\cc.txt");

// 根据文件路径创建文件字节输出流, 如果文件不存在,就会自动创建这个文件
FileOutputStream output=new FileOutputStream("F:\\sun\\上课笔记\\x.txt");

//创建一个文件复制前的时间
long time = System.currentTimeMillis();

//读取一个字节写入一个字节,直到到达文件尾部 ,速度慢  
try {
int t = input.read();
while (t != -1) {
output.write(t);
t = input.read();
}
//刷新此输出流并强制写出所有缓冲的输出字节
output.flush();

//关闭输出流
output.close();

//关闭输入流
input.close();
} catch (IOException e) {

e.printStackTrace();
}
//定义一个结束时间,计算文件复制时间,耗时大约1400多毫秒
long time1 = System.currentTimeMillis();
System.out.println(time1-time);

} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
方法二:改进后,大小为915k的文件复制耗时约15毫秒

/**
* 提高文件复制效率:例如要将F:\sun\上课笔记\cc.txt中的内容复制到F:\sun\上课笔记\y.txt中, cc.txt的大小为915KB
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Homeworkcopy2 {
public static void main(String[] args) {
try {
//根据文件路径创建文件输入流
FileInputStream input=new FileInputStream("F:\\sun\\上课笔记\\cc.txt");

// 根据文件路径创建文件字节输出流, 如果文件不存在,就会自动创建这个文件
FileOutputStream output=new FileOutputStream("F:\\sun\\上课笔记\\y.txt");

//创建一个文件复制前的时间
long time = System.currentTimeMillis();

//创建一个文件对象并给定路径
File f=new File("F:\\sun\\上课笔记\\cc.txt");

//创建一个字符数组并将文件的长度赋给它,用来作为中间数组存放流中的数据
byte[] b=new byte[(int) f.length()];

try {
//从输入流中读取字节填充b数组
input.read(b);

//将b数组中的所有字节写到输出流中
output.write(b);

//刷新此输出流并强制写出所有缓冲的输出字节
output.flush();

//关闭输出流
output.close();

//关闭输入流
input.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//定义一个结束时间,计算文件复制时间,大概为15毫秒
long time1 = System.currentTimeMillis();
System.out.println(time1-time);


} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
1
5
分享到:
评论
14 楼 Sunflower-13 2016-08-20  
代码有考虑不周全,谢谢大家提供宝贵的意见,如果是跟我一样的初学者,有需要的话可以看一下我改进后的另一篇:更正--提高文件复制性能。
13 楼 CurrentJ 2016-08-19  
裤子都脱了,你就给我看这个????
12 楼 hellotieye 2016-08-19  
white_crucifix 写道
楼上都是大坏蛋,楼主刚学 io操作 第二天。。。。。。

这话 很体贴
11 楼 hellotieye 2016-08-19  
masuweng 写道

天很热
10 楼 hellotieye 2016-08-19  
vb2005xu 写道
不建议一次读完所有的字节,如果文件大怎么办? 建议考虑下 缓冲区的大小


正解
9 楼 hellotieye 2016-08-19  
cs6641468 写道
说好的RandomAccessFile呢?
说好的管道,内存映射呢?
说好的Commons-IO里的文件操作呢?
说好的JDK7里的Files API的copy呢?


懂的真多
8 楼 hellotieye 2016-08-19  
hellotieye 写道
if(i!=我){} 写道
真是一届不如一届

同学,建议你用个5G多的高清电影做测试。

PS:好好学学Buffered Stream,NIO


你挺 new bee 呗



你是 哪一届的
7 楼 hellotieye 2016-08-19  
if(i!=我){} 写道
真是一届不如一届

同学,建议你用个5G多的高清电影做测试。

PS:好好学学Buffered Stream,NIO


你挺 new bee 呗
6 楼 Sunflower-13 2016-08-18  
white_crucifix 写道
楼上都是大坏蛋,楼主刚学 io操作 第二天。。。。。。

     原谅我不知道怎么一一回复,只能说大神真好

cs6641468 写道
说好的RandomAccessFile呢?
说好的管道,内存映射呢?
说好的Commons-IO里的文件操作呢?
说好的JDK7里的Files API的copy呢?

     小生初来乍道,请多多指教

if(i!=我){} 写道
真是一届不如一届

同学,建议你用个5G多的高清电影做测试。

PS:好好学学Buffered Stream,NIO

好的,谢谢指教

vb2005xu 写道
不建议一次读完所有的字节,如果文件大怎么办? 建议考虑下 缓冲区的大小

谢谢大神提点,已经做出了修改

masuweng 写道

谢谢你
5 楼 white_crucifix 2016-08-18  
楼上都是大坏蛋,楼主刚学 io操作 第二天。。。。。。
4 楼 cs6641468 2016-08-18  
说好的RandomAccessFile呢?
说好的管道,内存映射呢?
说好的Commons-IO里的文件操作呢?
说好的JDK7里的Files API的copy呢?
3 楼 if(i!=我){} 2016-08-18  
真是一届不如一届

同学,建议你用个5G多的高清电影做测试。

PS:好好学学Buffered Stream,NIO
2 楼 vb2005xu 2016-08-18  
不建议一次读完所有的字节,如果文件大怎么办? 建议考虑下 缓冲区的大小
1 楼 masuweng 2016-08-18  

相关推荐

    文件复制算法 文件复制算法

    2. 块复制:为了提高效率,文件复制可以采用块为单位进行,一次读取和写入多个字节。这种方式减少了磁盘I/O的次数,提高了复制速度。 3. 并行复制:利用多线程或分布式系统,同时从源文件读取数据并写入多个目标...

    高效率文件复制java版

    在StartCopy方法中,我们使用了transferTo方法来实现文件复制,该方法可以将源文件的内容直接传输到目标文件中,这样可以提高文件复制的效率。在文件复制完成后,我们可以打印出文件复制的时间和速度信息。 知识点3...

    文件复制(大文件快速复制工具)

    下面将详细阐述大文件复制的挑战、FastCopy的特点以及如何使用它来提升复制性能。 首先,我们要理解为什么大文件复制会成为问题。当处理GB级别的大文件时,传统的文件复制方法,如Windows自带的复制粘贴功能,可能...

    java文件复制器代码

    Java 文件复制器是一种实用程序,用于在计算机上复制文件。在这个特定的代码示例中,我们看到一个名为 `FileCopy` 的类,该类包含了复制文件的核心逻辑。下面我们将详细探讨这个程序的关键部分以及实现文件复制所...

    提升文件的复制速度

    10. **硬件升级**:如果系统性能瓶颈在于CPU或内存,那么升级硬件可以进一步提升文件复制速度。增加内存容量可以减少硬盘的换页操作,而更快的CPU则可以更快地处理复制操作。 综上所述,提升文件复制速度涉及多个...

    监听文件下文件发生变化时复制文件到另一个文件夹

    因为文件系统监听和文件复制可能涉及I/O操作,这些操作通常是阻塞的,如果在一个线程中执行,可能会阻塞程序的其他部分。为了解决这个问题,我们可以创建一个单独的线程或线程池来处理文件复制。在Python中,可以...

    文件复制工具类

    总结来说,"文件复制工具类"是为了简化和优化文件复制过程而设计的代码模块,它涵盖了文件I/O、路径处理、异常处理等多个关键知识点,对于提高开发效率和保证程序稳定性有着重要作用。通过学习和使用这样的工具类,...

    java文件复制,实现文件的复制

    ### Java 文件复制技术详解 在Java编程中,文件复制是一项常用且重要的操作。无论是单一文件还是整个文件夹的复制,都是开发过程中常见的需求之一。本文将深入探讨如何使用Java实现文件及其目录结构的完整复制。 #...

    远程或本地文件复制

    3. **性能优化**:对于大量文件的复制操作,可以考虑使用多线程技术来提高复制效率。 4. **错误处理**:良好的错误处理机制可以增强程序的健壮性和用户体验。本例中使用了异常捕获并记录错误日志的方式。 #### 五、...

    Windows监视文件被复制

    - **安全威胁检测**:监视文件复制活动可以帮助早期识别潜在的安全威胁,如未经授权的数据转移等。 #### 三、实现方式 ##### 1. 使用Windows内置功能 - **启用SACL记录**:管理员可以通过设置特定文件或目录的...

    极速复制文件,复制大文件更轻松!

    Teracopy是一款专为提高文件复制和移动速度而设计的软件,尤其在处理大文件或大量文件时,其性能表现尤为突出。它通过使用持续的数据流技术和智能缓存来减少读写操作,从而加快复制过程。 Teracopy的核心功能包括:...

    快速复制大文件软件

    它旨在提高文件复制速度,减少等待时间,提高工作效率。下面我们将深入探讨这个主题,了解相关知识点。 首先,我们来理解为什么传统文件复制过程可能会慢。在Windows系统中,文件复制操作涉及到多个步骤,包括数据...

    Java编程中多种IO API复制文件的性能分析.pdf

    Java中的IO API可以分为多种不同的编程方式,例如,使用基本的InputStream和OutputStream来实现文件复制,使用缓冲IO来提高性能,使用NIO来实现高性能的IO操作等。 在实际应用中,需要根据实际情况选择合适的IO API...

    io操作复制文件

    本篇文章将详细讲解如何使用Java的IO流进行文件复制。 一、基本概念 IO流是Java中处理输入输出的基础,分为字节流和字符流两大类。字节流处理原始的8位字节数据,如 FileInputStream 和 FileOutputStream;字符流...

    复制文件小助手 Copy Handler

    Copy Handler的核心特性在于其多线程处理技术,能够同时处理多个文件复制任务,显著提高了文件传输速度。相比Windows自带的复制功能,Copy Handler在处理大量文件时更为快速,尤其在大文件或者网络传输的情况下,...

    C# winfrom 大文件复制

    在C# WinForm应用开发中,大文件复制是一项常见的任务,尤其在数据迁移、备份或者文件传输场景下。本文将详细讲解如何在C#中实现高效且稳定的WinForm大文件复制功能。 首先,理解基本的文件操作是至关重要的。C#...

    delphi模拟windows文件复制粘贴

    通过使用Windows API,我们可以在不依赖于外部库的情况下模拟这些基本的文件操作,从而提高应用程序的灵活性和性能。 总之,通过Delphi提供的强大API支持和对Windows API的灵活运用,我们可以轻松地实现文件复制和...

    海量大量文件复制工具

    这些技术能够减少磁盘访问次数,提高文件复制速度,并且通常能更好地管理系统资源,降低对CPU和内存的占用,使得整个复制过程更快、更平稳。 在标签“海量大量文件复制工具”中,我们可以推断出该软件可能具备以下...

    FileCopy1.rar_多文件复制_多线程复制

    在IT行业中,多文件复制和多线程复制是提高效率的关键技术,特别是在处理大量数据时。本文将深入探讨“FileCopy1.rar”压缩包中所包含的“多文件复制_多线程复制”这一主题。 首先,让我们理解什么是多文件复制。在...

    Qt 复制文件 实现进度条显示

    在Qt框架下,实现文件复制并伴随进度条显示是一项常见的任务,这有助于用户了解操作进度,提高用户体验。这里我们将深入探讨如何使用QFile、copy函数以及QProgressBar来完成这一功能。 首先,`QFile`是Qt提供的一个...

Global site tag (gtag.js) - Google Analytics