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及异常处理,很简单的几行代码。
 package test0713;
 import java.io.*;
 public class Manage {
     private InputStream input;
     private OutputStream output;
     private static int length;
 /**
      * 文件的复制
      *
      * @param beginFilename
      *            原始文件
      * @param endFilename
      *            目标文件
      */
     public void fileCopy(String beginFilename, String endFilename) {
         // 创建输入输出流对象
         try {
             input = new FileInputStream(beginFilename);
             output = new FileOutputStream(endFilename);
             // 获取文件长度
             try {
                 length = input.available();
                 // 创建缓存区域
                 byte[] buffer = new byte[length];
                 // 将文件中的数据写入缓存数组
                 input.read(buffer);
                 // 将缓存数组中的数据输出到文件
                 output.write(buffer);
             } catch (IOException e) {
                 e.printStackTrace();
             }
         } catch (FileNotFoundException e) {
             e.printStackTrace();
         } finally {
             if (input != null && output != null) {
                 try {
                     input.close(); // 关闭流
                     output.close();
                 } catch (IOException e) {
                     e.printStackTrace();
                 }
             }
         }
     }
     public static void main(String[] args) {
         Manage man = new Manage();
         // 第一个参数是将要复制的文件,第二个参数是输出的目标文件(如果没有,则新建一个,实现文件的复制)
         man.fileCopy("F:\\CodeWorkSpace\\java\\FileCopy\\src\\test0713\\Manage.java",
                 "C:\\Users\\yuxiu\\Desktop\\123.txt");
     }
 }
java中的IO流之文件复制的更多相关文章
- Java中常用IO流之文件流的基本使用姿势
		
所谓的 IO 即 Input(输入)/Output(输出) ,当软件与外部资源(例如:网络,数据库,磁盘文件)交互的时候,就会用到 IO 操作.而在IO操作中,最常用的一种方式就是流,也被称为IO流. ...
 - java中的IO流读取文件
		
1 InputStream类和OutputStream类 InputStream.read()方法从文件中读取一个字节(0-255),然后将此字节转换成对应的整数返回.假设一个文件的编码为utf-8编 ...
 - java中的IO流
		
Java中的IO流 在之前的时候我已经接触过C#中的IO流,也就是说集中数据固化的方式之一,那么我们今天来说一下java中的IO流. 首先,我们学习IO流就是要对文件或目录进行一系列的操作,那么怎样操 ...
 - Java中的IO流总结
		
Java中的IO流总结 1. 流的继承关系,以及字节流和字符流. 2. 节点流FileOutputStream和FileInputStream和处理流BufferedInputStream和Buffe ...
 - Java中的IO流(二)
		
上一篇<Java中的IO流(一)>把学习IO流的字符流作了一下记录,本篇把字节流记录一下. 一,Java中的字节流 Java中的字节流的操作方式与字符流的操作方式大致相同,连方法名都是类似 ...
 - Java中的IO流大体介绍
		
由于Java中的IO流是在是知识点繁多,所以我大约花了1周的时间将其整理起来.但是整理起来后并不是将完事了,我还是要分字节流和字符流来讲述.然后字节流和字符流中还有是否带有缓冲流. 讲述完IO流后我将 ...
 - Java中的IO流,Input和Output的用法,字节流和字符流的区别
		
Java中的IO流:就是内存与设备之间的输入和输出操作就成为IO操作,也就是IO流.内存中的数据持久化到设备上-------->输出(Output).把 硬盘上的数据读取到内存中,这种操作 成为 ...
 - Java中的IO流(五)
		
上一篇<Java中的IO流(四)>记录了一下Properties类,此类不属于IO流,它属于集合框架.接下来说一下IO流中的其它流 一,打印流PrintStream PrintStream ...
 - Java中的IO流(六)
		
上一篇<Java中的IO流(五)>把流中的打印流PrintStream,PrintWriter,序列流SequenceInputStream以及结合之前所记录的知识点完成了文件的切割与文件 ...
 
随机推荐
- kickstart简介 20140707
			
kickstart是红帽发行版中的一种安装方式,它通过以配置文件的方式来记录linux系统安装是的各项参数和想要安装的软件.只要配置正确, 整个安装过程中无需人工交互参与,达到无人值守安装的目的,因而 ...
 - JavaScript学习小结(一)——JavaScript入门基础
			
一.JavaScript语言特点 1.1.JavaScript是基于对象和事件驱动的(动态的) 它可以直接对用户或客户输入做出响应,无须经过Web服务程序.它对用户的响应,是采用以事件驱动的方式进行的 ...
 - require.js js模块化方案
			
一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载.下面的网页代 ...
 - Java 中判断两个对象是否相等
			
由于每次实例化一个对象时,系统会分配一块内存地址给这个对象,而系统默认是根据内存地址来检测是否是同一个对象,所以就算是同一个类里实例化出来的对象它们也不会相等. public class Transp ...
 - 将raw里面的数据库文件写入到data中
			
package com.city.list.db; import java.io.File; import java.io.FileNotFoundException; import java.io. ...
 - PHP JS HTML ASP页面跳转代码 延时跳转代码 返回到上一界面并刷新 JS弹出指定大小的新窗口
			
1.PHP延时跳转代码 //跳转到浏览界面 header("Refresh:1;url=machine_list.php"); //不延时 <?php header(&quo ...
 - 释放C盘空间的27招优化技巧
			
主要讲讲Windows操作系统在C盘空间不足的情况下,我们可以通过那些具体手段来增加C盘空间. 1.打开"我的电脑"-"工具"-"文件夹选项" ...
 - [转]SQLServer 2008以上误操作数据库恢复方法——日志尾部备份
			
原文出处:http://blog.csdn.net/dba_huangzj/article/details/8491327 问题: 经常看到有人误删数据,或者误操作,特别是update和delete的 ...
 - 十天学会单片机Day4串行口通信
			
并行与串行基本通信方式 1.并行通信方式 通常是将数据字节的各位用多条数据线同时进行传送. 并行通信控制简单.传输速度快:由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难. 2.串行通 ...
 - 转:OK6410内存及启动流程
			
一.内存 只是从大体上介绍,并没有涉及寄存器的操作 6410的系统资源为:256MB DDR .2GB NANDFlash 如下图所示: ROM是只读存储器,RAM是随机存储器. 区别: 1.ROM( ...