api进阶Day3使用文件流对文件进行复制、使用块读写一组字节,使用byte数组提高读写的效率、返回当前时间。

使用文件流对文件进行复制:

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次调用:d = fis.read();
     11001100 00110011 11110000 00001111 10101010 01010101 ...

     ^^^^^^^^
     读取的字节
     d的2进制:00000000 00000000 00000000 11001100

     fos.write(d);
     d:00000000 00000000 00000000 11001100
                                  ^^^^^^^^
                                  写出的字节
     image_cp.jpg文件数据:
     11001100
  */
 int d;//记录每次读取的字节内容
 long start = System.currentTimeMillis();//获取当前系统时间的毫秒值
 while(  (d = fis.read()) != -1    ) {//若读取到了-1则应当停止循环,没有读取到-1则应当抄
     fos.write(d);
 }
 long end = System.currentTimeMillis();//获取当前系统时间的毫秒值

 System.out.println("复制完毕,耗时:"+(end-start)+"ms");
 fos.close();
 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则表示读取到了流的末尾。
     文件内容(6字节):
     11001100 00110011 11110000 00001111 10101010 01010101

     byte[] data = new byte[4];//4字节长的数组
     int len = 0;//记录每次实际读取的字节数

     第一次调用len = fis.read(data);
     一次性尝试从文件中读取data数组长度的字节量(本案例:4个字节)
     11001100 00110011 11110000 00001111 10101010 01010101
     ^^^^^^^^ ^^^^^^^^ ^^^^^^^^ ^^^^^^^^
     data:{11001100 00110011 11110000 00001111} 数组中存放的是本次读取的4字节内容
     len:4 这里的4是表达本次实际读取到了4个字节

     第二次调用len = fis.read(data);
     一次性尝试从文件中读取data数组长度的字节量(本案例:4个字节)
     11001100 00110011 11110000 00001111 10101010 01010101 文件末尾
                                         ^^^^^^^^ ^^^^^^^^ ^^^^^^^^ ^^^^^^^^
                                         本次实际仅读取到了2个字节
     data:{10101010 01010101 11110000 00001111}
           |--本次读取的字节--||---上次的旧数据---|
     len:2 本次实际仅读取到了2个字节

     第三次调用len = fis.read(data);
     11001100 00110011 11110000 00001111 10101010 01010101 文件末尾
                                                           ^^^^^^^^ ^^^^^^^^ ^^^^^^^^ ^^^^^^^^
     data:{10101010 01010101 11110000 00001111}
           |--------没有变化,都是旧数据--------|
     len:-1 表达文件末尾

     java.io.OutputStream超类上定义了块写操作
     void write(byte[] data)
     一次性将给定的字节数组中所有的字节写出

     byte[] data:{10101010 01010101 11110000 00001111}
     fos.write(data)
     文件数据:
     10101010 01010101 11110000 00001111

     void write(byte[] data,int offset,int len)
     一次性将给定的字节数组从下标offset处开始的连续len个字节写出
     byte[] data:{10101010 01010101 11110000 00001111}
                           ^^^^^^^^ ^^^^^^^^
     fos.write(data,1,2):将data数组中从下标1开始的连续2个字节一次性写出

     文件数据:
     01010101 11110000

  */
 //编译后:byte[] data = new byte[10240];
 byte[] data = new byte[1024*10];//10kb
 int len = 0;//记录每次实际读取的字节数

 long start = System.currentTimeMillis();
 while( (len = fis.read(data)) != -1  ){
     fos.write(data,0,len);
 }
 long end = System.currentTimeMillis();
 System.out.println("复制完毕,耗时"+(end-start)+"ms");

 fis.close();
 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));

Original: https://www.cnblogs.com/Bafanqwq/p/16599825.html
Author: 八幡qwq
Title: api进阶Day3使用文件流对文件进行复制、使用块读写一组字节,使用byte数组提高读写的效率、返回当前时间。

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/607655/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SpringBoot 多环境配置文件切换

    背景 很多时候,我们项目在开发环境和生成环境的环境配置是不一样的,例如,数据库配置,在开发的时候,我们一般用测试数据库,而在生产环境的时候,我们是用正式的数据,这时候,我们可以利用…

    Java 2023年6月5日
    077
  • 接口

    基本介绍:接口就是给出一些没有实现的方法,封装到以一起,到某个类要使用的时候再根据具体情况把 这些方法写出来。 语法: interface 接口名 { //属性 //方法(1.抽象…

    Java 2023年6月5日
    090
  • mysql

    10.Mysql 10.1 初识myaql 10.1.1 为什么学习数据库 岗位需求 现在的世界,大数据时代 被迫需求:村数据 数据库是所有软件体系中最核心的存在 10.1.2 什…

    Java 2023年6月7日
    081
  • SpringBoot中整合knife4j接口文档

    界面欣赏 1.首页 2.接口文档 3.调试 二、整合 knife4j 1、引入 maven 依赖 com.github.xiaoymin knife4j-spring-boot-s…

    Java 2023年6月6日
    067
  • Java SE 3、封装

    提供一个公共的(public)set方法,用于对属性判断并赋值 public void setXxx(类型 参数名){ //Xxx表示某个属性 ​ //加入数据验证的业务逻辑 ​ …

    Java 2023年6月7日
    098
  • 【Java分享客栈】SpringBoot线程池参数搜一堆资料还是不会配,我花一天测试换你此生明白。

    一、前言 首先说一句,如果比较忙顺路点进来的,可以先收藏,有时间或用到了再看也行;我相信很多人会有一个困惑,这个困惑和我之前一样,就是线程池这个玩意儿,感觉很高大上,用起来很fas…

    Java 2023年6月9日
    098
  • mysql安装my.cnf配置

    进入my.cnf文件//乱码修改 设置编码 //编码 //连接数据库执行操作 1.只有在普通用户的客户端连接时才能执行这个参数,超级用户或有连接管理权限的用户会跳过这个设置;2.一…

    Java 2023年6月16日
    098
  • main 方法可以继承吗?

    阿里二面:main 方法可以继承吗? 昨天,微信群里一位网友,在群里发了自己面试阿里的过程。其中一个面试,他在群里 PUA 其他网友。这道面试题就是: Java &#x4E…

    Java 2023年6月7日
    095
  • SpringBoot Bean指定初始化顺序详解

    转自:https://blog.csdn.net/zzhongcy/article/details/109504563 最近遇到SpringBoot容器外类初始化依赖容器内bean…

    Java 2023年5月30日
    0138
  • delete语句嵌套-mysql

    需求: 我需要从tableA之中找到name字段的Filter的记录,得到此记录的id,然后根据id删除tableA中的该条记录; — 但是我使用如下xql语句的时候delete…

    Java 2023年6月6日
    084
  • Mybatis源码5 StatementHandler ,ParameterHandler

    Mybatis5 StatementHandler ,ParameterHandler 一丶概述 前面我们总结了SqlSession—>CachingExecut…

    Java 2023年6月14日
    076
  • 【Spring源码分析】Bean加载流程概览(转)

    转载自:https://www.cnblogs.com/xrq730/p/6285358.html 代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入【Spring源码分析】这个板…

    Java 2023年5月29日
    083
  • Java8日期时间(LocalDate、LocalTime、LocalDateTime)

    在看题的时候发现了Java8中新加入的日期时间类,觉得这个小哥写的不错,自己也跟着练习下。原文地址:https://blog.csdn.net/yy139926/article/d…

    Java 2023年6月6日
    089
  • 第2课第7节_Java面向对象编程_内部类_P【学习笔记】

    摘要:韦东山android视频学习笔记 1、什么是内部类:在类的内部定义一个类,内部类可以访问类的私有属性 编译运行结果: 2、静态内部类可以不用先实例化类对象,在实例化内部类。需…

    Java 2023年5月29日
    059
  • iOS macOS 回到主线程的三种方式

    简单说将代码同步到主线程执行的三种方法如下:// 1.NSThread [self performSelectorOnMainThread:@selector(updateUI) …

    Java 2023年5月29日
    096
  • 求和算法

    给定一个数组,一个目标值,算出所有和等于目标值的组合,组合中会出现重复值,且每个重复值只能在每个组合出现一次。 包含小数。 java;gutter:true; import jav…

    Java 2023年6月9日
    080
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球