java中的IO流之文件复制

编程之家收集整理的这篇文章主要介绍了java中的IO流之文件复制编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

O(∩_∩)O哈哈~

 

1.综述

一门成熟的语言肯定具备的几个模块:IO,通信,线程,UI......

Java作为一门成熟的程序语言,其IO流是比较复杂的。上个图大家感受下:

 

简单分析一下,IO分为两种流:字符流和字节流。字符流的父类Reader(读取到内存)和Writer(从内存输出),字节流的父类InputStream(读取到内存)和OutputStream(从内存输出),然后为了方便各种操作,比如为了文件操作,派生了文件流;为了对象操作,派生了对象流;等等。当初我也是傻傻分不清到底是Input还是Output,其实搞懂了谁是主体就容易懂了,以你现在正在写的程序为主体,Input就是流入你的程序,Output就是从你的程序流出去。

 

2.对于缓冲的理解

 

刚开始学IO时,不理解那个Buffered究竟有什么作用,为什么要输入输出总要有一步缓冲过渡呢?后来还是看了百度知道上一个大神写的,个人觉得很有道理,复制粘贴如下,应该不算侵权吧(⊙﹏⊙)

 

“如果是边读边写,就会很慢,也伤硬盘。缓冲区就是内存里的一块区域,把数据先存内存里,然后一次性写入,类似数据库的批量操作,这样效率比较高。

调用I\O操作的时候,实际上还是一个一个的读或者写,关键就在,cpu只有一个,不论是几个核心。cpu在系统调用时,会不会还要参与主要操作?参与多次就会花更多的时间。 

系统调用时,若不用缓冲,cpu会酌情考虑使用 中断。此时cpu是主动地,每个周期中都要花去一部分去询问I\O设备是否读完数据,这段时间cpu不能做任何其他的事情(至少负责执行这段模块的核不能)。所以,调用一次读了一个字,通报一次,cpu腾出时间处理一次。 

而设置缓冲,cpu通常会使用 DMA 方式去执行 I\O 操作。cpu 将这个工作交给DMA控制器来做,自己腾出时间做其他的事,当DMA完成工作时,DMA会主动告诉cpu“操作完成”。这时,cpu接管后续工作。在此,cpu 是被动的。DMA是专门 做 I\O 与 内存 数据交换的,不仅自身效率高,也节约了cpu时间,cpu在DMA开始和结束时做了一些设置罢了。 
所以,调用一次,不必通报cpu,等缓冲区满了,DMA 会对C PU 说 “嘿,伙计!快过来看看,把他们都搬走吧”。 

综上,设置缓冲,就建立了数据块,使得DMA执行更方便,cpu也有空闲,而不是呆呆地候着I\O数据读来。从微观角度来说,设置缓冲效率要高很多。尽管,不能从这个程序上看出来。 几万字的读写就能看到差距。”

OK,从以上可以看出,省时省力。

 

3.文件复制

 

文件复制的原理很简单,从硬盘读取文件流到程序,再从程序中输出流到目标文件,就完成了文件的复制。事实上用到了java中的文件输入输出流。看着代码挺多,其实忽略那些try-catch及异常处理,很简单的几行代码

 1 package test0713;
 2 
 3 import java.io.*;
 4 
 5 public class Manage {
 6     private InputStream input;
 7      OutputStream output;
 8     private static int length;
 9 /**
10      * 文件的复制
11      * 
12      * @param beginFilename
13      *            原始文件
14      * @param endFilename
15      *            目标文件
16      */
17     void fileCopy(String beginFilename,String endFilename) {
18         // 创建输入输出流对象
19         try {
20             input = new FileInputStream(beginFilename);
21             output =  FileOutputStream(endFilename);
22 
23              获取文件长度
24             25                 length = input.available();
26 
27                  创建缓存区域
28                 byte[] buffer = new byte[length];
29                 文件中的数据写入缓存数组
30                 input.read(buffer);
31                  将缓存数组中的数据输出文件
32                 output.write(buffer);
33 
34             } catch (IOException e) {
35 
36                 e.printStackTrace();
37             }
38 
39         }  (FileNotFoundException e) {
40             e.printStackTrace();
41 
42         } finally43             if (input != null && output != null) {
44                 45                     input.close();  关闭
46                     output.close();
47                 } 48                     e.printStackTrace();
49                 }
50 51 
52         }
53     }
54 
55      main(String[] args) {
56         Manage man =  Manage();
57          第一个参数是将要复制的文件,第二个参数是输出的目标文件(如果没有,则新建一个,实现文件的复制)
58         man.fileCopy("F:\\CodeWorkSpace\\java\\FileCopy\\src\\test0713\\Manage.java",59                 C:\\Users\\yuxiu\\Desktop\\123.txt);
60 
61 62 
63 }

 

总结

以上是编程之家为你收集整理的java中的IO流之文件复制全部内容,希望文章能够帮你解决java中的IO流之文件复制所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

相关文章

猜你在找的Java相关文章

感觉基础知识学了不少,但是一直搞不清一个项目的实际开发流程,所以就借着这个小记账本的程序梳理一下。因为楼主也是出于学习阶段的菜鸟,所以程序可能会有各种玄学的bug,希望一起提升吧。 跟着站长学到了很多
O(∩_∩)O~~ 概述 我想学过数据结构的小伙伴一定都认识哈弗曼,这位大神发明了大名鼎鼎的“最优二叉树”,为了纪念他呢,我们称之为“哈弗曼树”。哈弗曼树可以用于哈弗曼编码,编码的话学问可就大了,比如
现在编程的思想分成了两大阵营,面向过程和面向对象。现在谈谈啥是面向对象。 作为一只单身狗,谈“对象”还是很伤心很伤心的(;′⌒`)...... 先看看百度怎么说? 好吧,百度说的太抽象,我换个简单的说
1.java变量存储域 java变量的存储区域主要放在以下几个地方: (1)寄存器:可以说是最快的存储区,在C/C++中可以声明寄存器变量,但是在java中不能声明寄存器变量,只是编译器在编译时确定。
文/朱季谦 在一次Java解析xml文件的开发过程中,使用SAX解析时,出现了这样一个异常信息: Error on line 60 of document : 对实体 "xxx"
一.类继承Boolean的源码类定义部分如下: 1 public final class Boolean implements java.io.Serializable, 2 Comparable&l
文/朱季谦 想起刚开始接触JAVA面向对象编程时,若遇到大量流程判断语句,几乎满屏都是if-else语句,多得让自己都忘了哪里是头,哪里是尾,但是,纵然满屏是if-else,但彼时也没有觉得多别扭。等
一、案例场景 遇到过这样的场景,在定义一个static修饰的Map时,使用了大量的put()方法赋值,就类似这样—— public static final Map<String,String&