文档章节

JAVA实现文件复制功能

微尘鉴
 微尘鉴
发布于 2014/05/28 09:51
字数 1050
阅读 36
收藏 0

在JAVA中,一个可以读取文件的对象叫做输入流,一个可以写入文件的对象叫输出流。在JAVA中可以字节的形式直接输入输出文件,与之相关的是抽象类InputStream,和OutputStream

下面将介绍上这两个抽象类的常用实现子类

文件输入流:FileInputStream
构造方法
FileInputStream(File file) 
FileInputStream(String name) 
即用一个文件对象,或者一个保存了文件地址的字符串来进行初始化。

需要注意的是,要读取的文件必须存在,否则会报错

int read() 读取一个字节文件,如果已经是文件末尾,则返回-1

int read(byte[] b)  读取一个字节数组

我们知道read方法是以字节形式读取文件的那

read方法返回一个int型数据而不直接返byte型数据看似不符合逻辑。JAVA开发人员为什么要这样写呢?

因为它要将字节型数据转换为整形数据。为什么要转换成整形数据呢?

因为他要用返回-1来判断是否达到文件末尾。

那-1一定可以表示文件末尾吗,文件中的数据不会出现-1吗?答案是不会出现,因为将byte型数据

转换为int型的时候是将byte数据左边填0,所以一定会得到一个正的整数。

int available() 得到流中剩余的字节数

注意每次调用一个read方法 流中的数据都会减少。
但是如果文件大小超出了 流能读的大小 将流中的数据读完之后会怎样呢
答案: 跟文件格式有关,读GHO文件时每读一个就会从文件中输入到流中一个字节 ,ZIP格式的则不会没读一个输入一个
那么说到这来我们肯定会关心流能存的最大大小是多少呢?其实我们注意观察很容易得到一个最大范围:此方法返回的是int 型数据,那么显然它能存的数据必然小于即int 范围, 既2的31次方 2GB,我们可以大胆猜想它能存的最大数据就是2GB,但是有个看似合理的推论是不够的,那我们要怎样得到切确的数据呢?只有自己测试下了。我测试的结果是它能存的最大数据确实是2的31次方字节即2GB
缓冲字节输入流:BufferedInputStream

将输入流用缓冲字节输入流包装,能够加快读入速度

 

文件输出流:FileOutputStream

write(int b) 写出一个字节 这里为什么参数是int型数据呢,因为其实写出的是一个ASCLL码

例如write(97) 那么用记事本打开文件看到的是一个a

fos.write(-42);
fos.write(-48);

那其实写出的是 “中字”(汉字的ASCLL码是负数,且一个汉字占两字节)

write(byte[] b)  写出一个字节数组

需要注意的是在write方法后一再调用输出流的flush();方法

 因为内存的读写速度远远大于硬盘的读写速度,
 所以可能会有残留在内存缓存中的数据没有写到硬盘中去,
所以要推送缓存数据到硬盘。

缓冲字节输出流
BufferedOutputStream

将输出流用缓冲字节输入流包装,能够加快读入速度

package date0523_文件操作;  
  
/**  
 * 该程序用字节输入输出流实现了文字复制功能  
 */  
import java.io.BufferedInputStream;  
import java.io.BufferedOutputStream;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileNotFoundException;  
import java.io.FileOutputStream;  
import java.util.Date;  
  
public class Project {  
    public static void main(String[] args) {  
        long start=System.currentTimeMillis();  
        if(copyFile("abc.txt","bb.txt"))  
            System.out.println("复制成功");  
        long end=System.currentTimeMillis();  
        System.out.println("所用时间:"+(end-start)+"ms");  
    }  
    /**  
     * 实现文件复制功能  
     * @param sPath 源文件地址  
     * @param dPath 拷贝文件地址  
     * @return 是否复制成功  
     */  
    public static boolean copyFile(String sPath,String dPath)  
    {  
        File sFile=new File(sPath);  
        File dFile=new File(dPath);  
        FileInputStream fis;  
        try {  
            fis = new FileInputStream(sFile);  
            System.out.println(sFile.length());  
            BufferedInputStream bis=new BufferedInputStream(fis);  
            FileOutputStream fos=new FileOutputStream(dFile);  
            BufferedOutputStream bos=new BufferedOutputStream(fos);  
            int t=bis.read();  
            while(t!=-1)  
            {  
                byte b=(byte)t;  
                bos.write(b);  
                t=bis.read();  
            }  
            bos.flush();  
            return true;  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
          
        return false;  
    }  
  
}


 


© 著作权归作者所有

上一篇: 序列化
微尘鉴
粉丝 8
博文 80
码字总数 30075
作品 0
海淀
高级程序员
私信 提问
PHP与Java进行通信的实现方法

PHP与Java进行通信的实现方法缘起: 最近做了一个电商平台与网银整合的小东西,程序是开源的 Ecmall的,网银的接口也很规范,给出的文档很全,唯一的小问题是,网银使用的签名和验签的lib是只...

Yomut
2018/07/03
64
1
Java sun.misc.Unsafe详解

Unsafe类在jdk 源码的多个类中用到,这个类的提供了一些绕开JVM的更底层功能,基于它的实现可以提高效率。但是,它是一把双刃剑:正如它的名字所预示的那样,它是Unsafe的,它所分配的内存需...

hutaishi
01/14
80
0
GrapeCity Documents for Excel 文档 API 组件 V2.2 版本发布

GrapeCity Documents for Excel 文档 API 组件 V2.2 正式发布,本次新版本包含诸多重量级产品功能,如:将带有形状的电子表格导出为 PDF、控制分页和电子表格内容、将 Excel 电子表格的特定页...

葡萄城技术团队
07/16
554
0
android -------- java虚拟机和Dalvik虚拟机

java虚拟机 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java虚...

切切歆语
2018/04/29
53
0
说说在 Spring AOP 中如何实现类加载期织入(LTW)

我们可以在类加载期通过字节码编辑技术将切面织入目标类,这种方式叫做 LTW(Load Time Weaving)。 AspectJ LTW 使用 Java 5.0 提供的代理功能实现织入工作 。JDK 的代理功能能够让代理器访...

deniro
2018/08/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
149
4
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
5
0
Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
8
0
用最通俗的方法讲spring [一] ──── AOP

@[TOC](用最通俗的方法讲spring [一] ──── AOP) 写这个系列的目的(可以跳过不看) 自己写这个系列的目的,是因为自己是个比较笨的人,我曾一度怀疑自己的智商不适合干编程这个行业.因为在我...

小贼贼子
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部