打算做一个系列,前面讲了基本的字符流的用法,这篇博客介绍一下字节流的基本用法:

一、基本使用:

基本字节流:

FileInputStream   FileOutputStream

BufferedInputStream  BufferedOutputStream

注意点,字节流和字符流的使用方式基本类似,有一点区别是使用字节流来读写文件是不需要使用flush函数的,原因:

1、字符流需要使用到flush函数将写在缓冲区的字符冲到文件,因为字符流=编码字典+字节流,事实上字符流读取的还是字节,但是读完一个字节之后它会根据字符集去查找相应的字符;

2、字节流直接操作的就是字节,所以它进行写入的时候直接就写入到文件中了,不需要再进行flush;

3、FileInputStream   FileOutputStream是由继承flush方法的,但是这个方法什么也没有做。在FileOutputStream中flush源码是这样子的:

    public void flush() throws IOException {
}

  之所以还需要这个函数是子类可能是需要用到的。

下面是基本使演示用代码:

两个全局变量分别是:

1、LINE_SEPARATE:当前系统环境的换行符;

2、ROOT_DIR:当前项目的运行目录(我们创建的文件如果没有特殊指定就是在这个目录下);

    private final static String LINE_SEPARATE = System.getProperty("line.separator");
private final static String ROOT_DIR=System.getProperty("user.dir");
public static void main(String[] args) throws IOException { System.out.println(ROOT_DIR); try (OutputStream out = new FileOutputStream("in.txt")) {
out.write("湖畔".getBytes());
out.write(LINE_SEPARATE.getBytes());
out.write("123456".getBytes());
out.write(LINE_SEPARATE.getBytes());
} try (InputStream in = new FileInputStream("in.txt")) { byte[] contentArray = new byte[512];
int length = in.read(contentArray); try (OutputStream out = new FileOutputStream("newIn.txt")) {
out.write(contentArray, 0, length);
System.out.println(new String(contentArray, 0, length));
}
}
}

 注意;我上面写入的内容很短,读一次512比特的数组肯定都能够全部读取出来,所以就不使用while循环了。

下面是输出结果:

E:\EXE\eke.test.first
湖畔
123456

二、使用带有缓冲区的BufferedInputStream和BufferedOutputStream并使用不同的方法复制一个文件比较效率:

(这些方法的比较是看传智播客视频后写的)

直接上代码:

public static void main(String[] args) throws IOException {
    long copy_2_start_time = System.currentTimeMillis();
copy_2();
long copy_2_end_time = System.currentTimeMillis();
System.out.println("copy_2 运行耗时:" + (copy_2_end_time - copy_2_start_time) + " 毫秒"); long copy_1_start_time = System.currentTimeMillis();
copy_1();
long copy_1_end_time = System.currentTimeMillis();
System.out.println("copy_1 运行耗时:" + (copy_1_end_time - copy_1_start_time) + " 毫秒"); long copy_0_start_time = System.currentTimeMillis();
copy_0();
long copy_0_end_time = System.currentTimeMillis();
System.out.println("copy_0 运行耗时:" + (copy_0_end_time - copy_0_start_time) + " 毫秒"); } private static void copy_1() throws IOException {
try (FileInputStream in = new FileInputStream("环保小视频.mp4")) {
try (BufferedInputStream bufin = new BufferedInputStream(in, 102400)) {
int content;
try (FileOutputStream out = new FileOutputStream("copy_1.mp4")) {
try (BufferedOutputStream bufout = new BufferedOutputStream(out, 102400)) {
while ((content = in.read()) != -1) {
bufout.write(content);
}
}
}
}
}
} private static void copy_0() throws IOException {
try (FileInputStream in = new FileInputStream("环保小视频.mp4")) {
try (FileOutputStream out = new FileOutputStream("copy_0.mp4")) {
byte[] contentArray = new byte[102400];
int length = 0;
while ((length = in.read(contentArray)) != -1) {
out.write(contentArray, 0, length);
}
}
}
} private static void copy_2() throws IOException {
try (FileInputStream in = new FileInputStream("环保小视频.mp4")) {
try (FileOutputStream out = new FileOutputStream("copy_2.mp4")) {
int ch;
while ((ch = in.read()) != -1) {
out.write(ch);
}
}
}
}

  输出结果:

Connected to the target VM, address: '127.0.0.1:53146', transport: 'socket'
copy_2 运行耗时:69494 毫秒
copy_1 运行耗时:9119 毫秒
copy_0 运行耗时:9 毫秒
Disconnected from the target VM, address: '127.0.0.1:53146', transport: 'socket'

 分析:

copy_2方法是使用FileOutputStream和FileInputStream,一个自己一个字节的读;速度慢的想死;

copy_1方法使用了带缓冲区的BufferedInputStream 和BufferedOutputStream,速度有了很大的提高,但是还是慢的一匹;

copy_0方法是使用了自己创建的缓冲区,每次读取102400个字节,竟然只需要9毫秒。

其中copy_1和copy_0的区别是在读取和写入的时候都是从各自的缓冲区取,但是copy_1没有使用数组,一次还是只读取一个字节,所以速度上被copy_0给抛下了。

Java-IO 字节流的使用和效率比较的更多相关文章

  1. Java IO 字节流与字符流 (三)

    概述 IO流用来处理设备之间的数据传输 Java对数据的操作时通过流的方式 Java用于操作流的对象都在IO包中 流按操作的数据分为:字节流和字符流 流按流向不同分为:输入流和输出流 IO流常用基类 ...

  2. Java IO 字节流与字符流 (二)

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...

  3. JAVA IO 字节流与字符流

    文章出自:听云博客 题主将以三个章节的篇幅来讲解JAVA IO的内容 . 第一节JAVA IO包的框架体系和源码分析,第二节,序列化反序列化和IO的设计模块,第三节异步IO. 本文是第一节.     ...

  4. Java: IO 字节流

    FileReader是InputStreamReader的子类,InputStreamReader是Reader的子类.Reader系列是输入字符流. 1.一个字符一个字符的读取 import jav ...

  5. Java IO 字节流与字符流 (五)

    Java的IO流分为字符流(Reader,Writer)和字节流(InputStream,OutputStream),字节流顾名思义字节流就是将文件的内容读取到字节数组,然后再输出到另一个文件中.而字 ...

  6. java IO字节流

    字节流可以读取 复制 各种类型 的文件. 写文件 第一种:读文件,每次读取1024字节的内容,读取太大文件不会导致内存溢出 第二种:读文件,更简单 思考?如果复制一个电影 或 1G 以上的文件,会出现 ...

  7. Java IO教程

    1  Java IO 教程 2 Java IO 概述 3 Java IO: 文件 4 Java IO: 管道 5 Java IO: 网络 6 Java IO: 字节和字符数组 7 Java IO: S ...

  8. Java Io(数据输入输出流)

    Java Io 字节流中的DataInputStream 和 DataOutputStream,使用流更加方便,是流的一个扩展,更方便读取int, long,字符等类型数据. 事例代码如下: pack ...

  9. Java IO 学习总结 学习手册总结

    Java IO 是一套Java用来读写数据(输入和输出)的API.大部分程序都要处理一些输入,并由输入产生一些输出.Java为此提供了java.io包. 代码 github地址:https://git ...

  10. java IO流 之 字节流

    一.file类的常用操作 File file=new File("E:\\test\\javaIo"); System.out.println(file.isDirectory() ...

随机推荐

  1. vue 中的translation操作----动态值

    在vue中,也会遇见translate的情况,这里顺带也可以带上如何查找页面中的元素的案例. 1.在加载过程中,有会遇见加载顺序先后的问题,然后查找页面元素null的情况,所以在mounted的钩子函 ...

  2. 《NFC开发实战详解》笔记

    地点:30教 5楼 男厕对面 * 时间:下午三点 * 天气:中雨 * 状态:3    * ******************************************************* ...

  3. [经验交流] CentOS7 docker 使用 overlay 存储

    关于 docker overlay 存储相比 device mapper 的优势,可以在 google 上搜索相关资料.在 ubuntu 16.04.2 上可以直接使用 overlay 存储,而在 C ...

  4. Python字符串的两种方式——百分号方式,format的方式

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  5. 总结fiddle

    fiddler重新发送请求   模拟限速 http://caibaojian.com/fiddler.html fiddler模拟限速的原理 我们可以通过fiddler来模拟限速,因为fiddler本 ...

  6. Java_面向对象

    目录 一.封装 二.继承 三.多态 四.重载与重写 五.接口与抽象类 六.继承与组合 七.初始化块 面向对象的三大特征:封装.继承.多态. 一.封装 是指将对象的状态信息都隐藏在对象内部,不允许外部程 ...

  7. ELK搭建<一>:搭建ES集群

    1.首先进入官网下载ES,如果下载最新之前的版本 点击past releases就行了. 2.解压后进入config修改配置文件elasticsearch.yml #集群名称 cluster.name ...

  8. 关于父窗口获取跨域iframe子窗口中的元素

    这几天在项目中遇到,一个难点, 就是需要异步加载一个pdf插件, 同时又需要获取这个插件中的点击事件来生成用户的下载记录. 刚开始也是想了很多方法,网上搜的 格式1:$("#iframe的I ...

  9. Linux 下 MySQL-5.6.16 安装

    转载请注明出处!!!! 卸载mysql 1 查找以前是否装有 mysql 命令:rpm -qa|grep -i mysql 2 将所有包删除 删除命令:rpm -e --nodeps  包名 3 删除 ...

  10. IntelliJ IDEA 如何设置类头注释和方法注释

    从VS转过来的,ide的差距很大的,所以...特意折腾了很久,结果还是没有VS的 '///' 好用 一.类头注释 打开file -> setting -> Editor -> Fil ...