Java(四)

下面的代码可以实现以字节为单位复制文件的功能,适合复制非文本类型的文件,为了更清楚的观测运行速率,我加入了程序计时器,代码如下:

 1 import java.io.FileInputStream;
 2 import java.io.FileOutputStream;
 3 import java.io.IOException;
 4
 5 public class Yuan {
 6     /**
 7      * @param args
 8      */
 9     public static void main(String[] args) {
10         long startMili=System.currentTimeMillis();
11         try {
12             FileInputStream fis = new FileInputStream ("a.mp3");
13             FileOutputStream fos = new FileOutputStream ("temp.mp3");
14             int read = fis.read();
15             while ( read != -1 ) {
16                 fos.write(read);
17                 read = fis.read();
18             }
19             fis.close();
20             fos.close();
21         } catch (IOException e) {
22             e.printStackTrace();
23         }
24         long endMili=System.currentTimeMillis();
25         System.out.println("总耗时为:"+(endMili-startMili)+"毫秒");
26     }
27 }

运行效果:

但是,这段代码在复制如mp3等大文件时,运行效率很低,课后我对以上代码进行了改进:

 1 import java.io.FileInputStream;
 2 import java.io.FileOutputStream;
 3 import java.io.IOException;
 4
 5 public class Copys {
 6     /**
 7      * @param args
 8      */
 9     public static void main(String[] args) {
10         long startMili=System.currentTimeMillis();
11         try {
12             FileInputStream fis = new FileInputStream ("a.mp3");
13             FileOutputStream fos = new FileOutputStream ("temp.mp3");
14             byte[] bys = new byte[1024];
15             int len = 0;
16             while ((len = fis.read(bys)) != -1) {
17                 fos.write(bys, 0, len);
18             }
19             fis.close();
20             fos.close();
21         } catch (IOException e) {
22             e.printStackTrace();
23         }
24         long endMili=System.currentTimeMillis();
25         System.out.println("总耗时为:"+(endMili-startMili)+"毫秒");
26     }
27 }

注:红色代码为改进前后的代码对比

运行效果:



总结:

1. 字节流拷贝文件步骤如下:

①.构造文件字节输入输出流

②.创建一个字节数组,用来指定每次复制的字节大小

③.输入流从源文件读取字节,输出流将字节写入文件

2. fis.read(bys)的作用是从源文件最多读取bys.length字节的数据送给bys数组,返回的是读入的字节总数。

本例中bys.length的长度指定为1024000,当最后一次不足1024000,例如只剩下5000字节时,返回的就是5000,此时所有字节读取完毕。下一次读入时由于已到达文件末尾,返回-1。

fos.write(bys, 0, len)意思是将byte数组从偏移量0开始的n个字节写入文件输出流。

3. 程序结束后要关闭输入输出流。

时间: 2024-10-14 13:33:58

Java(四)的相关文章

Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); 1 2 3 4 5 6 7 new Thread(new

Java四种线程池

Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor 时间:2015-10-20 22:37:40      阅读:8762      评论:0      收藏:0      [点我收藏+] 介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异

Java四类八种基本数据类型

java四类八种基本数据类型 第一类:整型 byte short int long 第二类:浮点型 float double 第三类:逻辑型 boolean(它只有两个值可取true false) 第四类:字符型 char 字节:boolean 布尔型              1/8 byte 字节类型                1char 字符型                  2  一个字符能存储一个中文汉字short 短整型                 2int 整数类型   

java 四种内部类的学习

内部类 定义在外部类的内部, 编译后是独立存在的类 可以访问外部类的私有成员,且不破坏封装 成员内部类 用"外部类类名.this"访问外部类的当前对象 创建对象:先创建外部类对象,再通过"外部类对象.new 内部类类名"创建内部类对象 静态内部类 只能访问外部类的静态成员 创建对象:直接用"new 外部类类名.内部类类名()" 局部内部类 定义在外部类的方法内部 作用范围:从定义开始到所在的代码块结束 同局部变量 不仅可以访问外部类的成员,还可以

java四种数组排序

数组的四种排序 1.快速排序法Arrays.sort(); 用法1.sort(byte[] a) 对指定的 byte 型数组按数字升序进行排序. sort(byte[] a, int fromIndex, int toIndex) 对指定 byte 型数组的指定范围按数字升序进行排序. sort(char[] a) 对指定的 char 型数组按数字升序进行排序. sort(char[] a, int fromIndex, int toIndex) 对指定 char 型数组的指定范围按数字升序进行

Pascal、VB、C#、Java四种语法对照表

因为工作原因,自学会了vb后陆续接触了其它语言,在工作中经常需要与各家使用不同语言公司的开发人员做程序对接,初期特别需要一个各种语法的对照比,翻看了网络上已有高人做了整理,自己在他基础上也整理了一下,摘抄如下(最后附上原作,网上也可以找到): 类别 Vb6 & Vb.Net Delphi C# 语法 不区分大小写 不区分大小写 区分大小写 数据类型 数据     关键字    占用字节      类型符 整型          integer 长整型        long 单精度型     

Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

原文:http://www.cnblogs.com/zhujiabin/p/5404771.html 介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stu

【自学java四年,分享学习资料】

[本人现任职于上海,大专学历,工作经验三年多,学习java四年多.] 因为学历不高,所以在上海这个地方也是一路摸爬滚打过来的. 一开始学校里都是靠着看马士兵的视频入的门,因此后来就一直有看视频的习惯. 这么多年不断的积累学习的视频,都是一些自己看过的.从基础到有点难度的,都学过. 趁着这个端午节放假,工作任务完成了,给大家免费分享自己的三百个g的基础视频. 其实我知道java自学是很难的,不是java学习的难度,而是坚持不懈的难度. 注意我说的是自学,所以可能会走弯路,我把一些以后工作可能会用到

线程池是什么?Java四种线程池的使用介绍

使用线程池的好处有很多,比如节省系统资源的开销,节省创建和销毁线程的时间等,当我们需要处理的任务较多时,就可以使用线程池,可能还有很多用户不知道Java线程池如何使用?下面小编给大家分享Java四种线程池的使用方法. 线程池介绍: 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池线程都是后台线程.每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中.如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使

Java四种引用包括强引用,软引用,弱引用,虚引用

Java四种引用包括强引用,软引用,弱引用,虚引用. 强引用: 只要引用存在,垃圾回收器永远不会回收Object obj = new Object();//可直接通过obj取得对应的对象 如obj.equels(new Object());而这样 obj对象对后面new Object的一个强引用,只有当obj这个引用被释放之后,对象才会被释放掉,这也是我们经常所用到的编码形式. 软引用: 非必须引用,内存溢出之前进行回收,可以通过以下代码实现Object obj = new Object();S