Java-IO 字节流的使用和效率比较
打算做一个系列,前面讲了基本的字符流的用法,这篇博客介绍一下字节流的基本用法:
一、基本使用:
基本字节流:
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 字节流的使用和效率比较的更多相关文章
- Java IO 字节流与字符流 (三)
概述 IO流用来处理设备之间的数据传输 Java对数据的操作时通过流的方式 Java用于操作流的对象都在IO包中 流按操作的数据分为:字节流和字符流 流按流向不同分为:输入流和输出流 IO流常用基类 ...
- Java IO 字节流与字符流 (二)
1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...
- JAVA IO 字节流与字符流
文章出自:听云博客 题主将以三个章节的篇幅来讲解JAVA IO的内容 . 第一节JAVA IO包的框架体系和源码分析,第二节,序列化反序列化和IO的设计模块,第三节异步IO. 本文是第一节. ...
- Java: IO 字节流
FileReader是InputStreamReader的子类,InputStreamReader是Reader的子类.Reader系列是输入字符流. 1.一个字符一个字符的读取 import jav ...
- Java IO 字节流与字符流 (五)
Java的IO流分为字符流(Reader,Writer)和字节流(InputStream,OutputStream),字节流顾名思义字节流就是将文件的内容读取到字节数组,然后再输出到另一个文件中.而字 ...
- java IO字节流
字节流可以读取 复制 各种类型 的文件. 写文件 第一种:读文件,每次读取1024字节的内容,读取太大文件不会导致内存溢出 第二种:读文件,更简单 思考?如果复制一个电影 或 1G 以上的文件,会出现 ...
- Java IO教程
1 Java IO 教程 2 Java IO 概述 3 Java IO: 文件 4 Java IO: 管道 5 Java IO: 网络 6 Java IO: 字节和字符数组 7 Java IO: S ...
- Java Io(数据输入输出流)
Java Io 字节流中的DataInputStream 和 DataOutputStream,使用流更加方便,是流的一个扩展,更方便读取int, long,字符等类型数据. 事例代码如下: pack ...
- Java IO 学习总结 学习手册总结
Java IO 是一套Java用来读写数据(输入和输出)的API.大部分程序都要处理一些输入,并由输入产生一些输出.Java为此提供了java.io包. 代码 github地址:https://git ...
- java IO流 之 字节流
一.file类的常用操作 File file=new File("E:\\test\\javaIo"); System.out.println(file.isDirectory() ...
随机推荐
- gojs常用API-画布定义
持续更新中 基础画布定义API画布初始位置 initialContentAlignment: go.Spot.Center,画布位置,定义后就不能拖动画布了,画布位置交由gojs管理 contentA ...
- RocketMq发送消息出现com.alibaba.rocketmq.client.exception.MQBrokerException: CODE: 2 DESC: [TIMEOUT_CLEAN_QUEUE]broker busy, start flow control for a while, period in queue: 201ms, size of queue: 1
最近对系统进行压测,发现发送消息到消息队列的时候出现如下错误: com.alibaba.rocketmq.client.exception.MQBrokerException: CODE: 2 DE ...
- sql 常见错误总结
1.根据一张表更新另一张表的数据. . 写法轻松,更新效率高: update table1 set field1=table2.field1, field2=table2.field2 from ta ...
- Java编程思想(后)
Java编程思想(后) 持有对象 如果一个程序只包含固定数量的且其生命期都是已知的对象,那么这是一个非常简单的程序. Java中的库基本类型: List, Set, Queue和Map --- 称为集 ...
- proxy ubunta
/etc/environment : Is the correct place to specify system-wide environment variables that should be ...
- iView -- TimePicker 自定义修改时间选择器选择时间面板样式
iView官方组件展示效果: 期望的最终效果: 为什么要修改期望效果? 项目需要只选择小时,分钟跟秒的不需要,而官方并没有直接相关的小时组件或者是设置显示成小时或分钟或秒的时间选择器,因为自己直接修改 ...
- mysql-视图、触发器、事务、存储过程、流程控制
目录 视图 触发器 事务 存储过程 流程控制 一.视图 视图是由查询结果构成的一张虚拟表,和真实的表一样,带有名称的列和行数据 强调:视图是永久存储的,但是视图存储的不是数据,只是一条sql语句 视图 ...
- 修改Maven仓库路径
我自己新建的地址:D:\apache-maven-3.6.0\repository 找到:localRepository,修改为自定义的位置 在IDEA里面进行配置 这样项目的maven仓库地址就修改 ...
- vscode插件解析-BookMark
BookMark (书签):在编辑器中标记行并轻松跳转到它们. commands 书签:Toggle 标记/取消标记带书签的行 书签:Jump to Next 将光标向前移动到下面的书签 书签: ...
- crontab和at任务
crontab周期任务 名称解释: cron来源于希腊语 chronos(χρόνος),原意是时间.(引用自维基百科) tab全称是table,表 常用参数: -e 编辑crontab文件 -l 显 ...