api进阶Day3使用文件流对文件进行复制、使用块读写一组字节,使用byte数组 ...

打印 上一主题 下一主题

主题 893|帖子 893|积分 2679

使用文件流对文件进行复制:
package io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**

  • 使用文件流完成文件的复制操作
    /
    public class CopyDemo {
    public static void main(String[] args) throws IOException {
    //        FileInputStream fis = new FileInputStream("image.jpg");
    //        FileOutputStream fos = new FileOutputStream("image_cp.jpg");
    FileInputStream fis = new FileInputStream("01.rmvb");
    FileOutputStream fos = new FileOutputStream("01_cp.rmvb");
    /

    image.jpg文件内容
    11001100 00110011 11110000 00001111 10101010 01010101 ...
    1.      第1次调用:d = fis.read();
    2.      11001100 00110011 11110000 00001111 10101010 01010101 ...
    3.      ^^^^^^^^
    4.      读取的字节
    5.      d的2进制:00000000 00000000 00000000 11001100
    6.      fos.write(d);
    7.      d:00000000 00000000 00000000 11001100
    8.                                   ^^^^^^^^
    9.                                   写出的字节
    10.      image_cp.jpg文件数据:
    11.      11001100
    12.   */
    13. int d;//记录每次读取的字节内容
    14. long start = System.currentTimeMillis();//获取当前系统时间的毫秒值
    15. while(  (d = fis.read()) != -1    ) {//若读取到了-1则应当停止循环,没有读取到-1则应当抄
    16.      fos.write(d);
    17. }
    18. long end = System.currentTimeMillis();//获取当前系统时间的毫秒值
    19. System.out.println("复制完毕,耗时:"+(end-start)+"ms");
    20. fos.close();
    21. fis.close();
    复制代码
    }
    }
使用块读写一组字节,使用byte数组提高读写的效率:
package io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**

  • 提高每次读写的数据量减少实际读写的次数可以提高读写效率

  • 块读写:一次读写一组字节
    /
    public class CopyDemo2 {
    public static void main(String[] args) throws IOException {
    FileInputStream fis = new FileInputStream("01.rmvb");
    FileOutputStream fos = new FileOutputStream("01_cp.rmvb");
    /

    java.io.InputStream超类上定义了块读字节的操作:
    int read(byte[] data)
    一次性读取给定字节数组data总长度的字节量并将读取到的所有字节存入到该数组中。
    返回值表达本次实际读取的字节数量。如果返回值为整数-1则表示读取到了流的末尾。
    1.      文件内容(6字节):
    2.      11001100 00110011 11110000 00001111 10101010 01010101
    3.      byte[] data = new byte[4];//4字节长的数组
    4.      int len = 0;//记录每次实际读取的字节数
    5.      第一次调用len = fis.read(data);
    6.      一次性尝试从文件中读取data数组长度的字节量(本案例:4个字节)
    7.      11001100 00110011 11110000 00001111 10101010 01010101
    8.      ^^^^^^^^ ^^^^^^^^ ^^^^^^^^ ^^^^^^^^
    9.      data:{11001100 00110011 11110000 00001111} 数组中存放的是本次读取的4字节内容
    10.      len:4 这里的4是表达本次实际读取到了4个字节
    11.      第二次调用len = fis.read(data);
    12.      一次性尝试从文件中读取data数组长度的字节量(本案例:4个字节)
    13.      11001100 00110011 11110000 00001111 10101010 01010101 文件末尾
    14.                                          ^^^^^^^^ ^^^^^^^^ ^^^^^^^^ ^^^^^^^^
    15.                                          本次实际仅读取到了2个字节
    16.      data:{10101010 01010101 11110000 00001111}
    17.            |--本次读取的字节--||---上次的旧数据---|
    18.      len:2 本次实际仅读取到了2个字节
    19.      第三次调用len = fis.read(data);
    20.      11001100 00110011 11110000 00001111 10101010 01010101 文件末尾
    21.                                                            ^^^^^^^^ ^^^^^^^^ ^^^^^^^^ ^^^^^^^^
    22.      data:{10101010 01010101 11110000 00001111}
    23.            |--------没有变化,都是旧数据--------|
    24.      len:-1 表达文件末尾
    25.      java.io.OutputStream超类上定义了块写操作
    26.      void write(byte[] data)
    27.      一次性将给定的字节数组中所有的字节写出
    28.      byte[] data:{10101010 01010101 11110000 00001111}
    29.      fos.write(data)
    30.      文件数据:
    31.      10101010 01010101 11110000 00001111
    32.      void write(byte[] data,int offset,int len)
    33.      一次性将给定的字节数组从下标offset处开始的连续len个字节写出
    34.      byte[] data:{10101010 01010101 11110000 00001111}
    35.                            ^^^^^^^^ ^^^^^^^^
    36.      fos.write(data,1,2):将data数组中从下标1开始的连续2个字节一次性写出
    37.      文件数据:
    38.      01010101 11110000
    39.   */
    40. //编译后:byte[] data = new byte[10240];
    41. byte[] data = new byte[1024*10];//10kb
    42. int len = 0;//记录每次实际读取的字节数
    43. long start = System.currentTimeMillis();
    44. while( (len = fis.read(data)) != -1  ){
    45.      fos.write(data,0,len);
    46. }
    47. long end = System.currentTimeMillis();
    48. System.out.println("复制完毕,耗时"+(end-start)+"ms");
    49. fis.close();
    50. fos.close();
    复制代码
    }
    }
返回当前时间:
package io;
public class CurrentTimeDemo {
public static void main(String[] args) {
//返回的UTC时间,1970年1月1日 00:00:00到当前系统时间之间经过的毫秒
long ms = System.currentTimeMillis();
System.out.println(ms);
long max = Long.MAX_VALUE;
System.out.println("公元:"+(max/1000/60/60/24/365+1970));
  1. }
复制代码
}

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

欢乐狗

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表