Java : java基础(3) IO流
流按操作类型分为两种,字节流,字符流,按流向分为输入流,输出流,输入流的抽象父类InputStream,输出流抽象父类OutputStream,字符流的抽象父类是Reader和Writer
一般用字节流copy文件可以用小数组的方式分批拷进去,实例代码如下:
FileInputStream fis = new FileInputStream("111.png");
FileOutputStream fos = new FileOutputStream("222.png");
byte[] a = new byte[ * ];
int length;
// 返回值length是读出的字节个数, fis.read(a)是读取最多a.length大小的字节数据,存入a里面
while ((length = fis.read(a)) != -) {
// 把数据从a中写出,数组偏移量为0,即从a[0]开始,写出length字节大小的数据
fos.write(a, , length);
}
fis.close();
fos.close();
还有一种方式,用输入输出缓冲区包装类,缓冲区类一次从文件中取出8192个字节,存储在缓冲区数组里,然后一个一个存入输出缓冲区类的缓冲区数组里,满了之后一次性存到硬盘文件中大大减少IO时间:
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("部署.png"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("222.png"));
int a;
while ((a = bis.read()) != -) {
bos.write(a);
}
bis.close();
bos.close();
flush()方法可以刷新缓冲区,把缓冲区的数据写入文件中.而close()方法在关闭输出之前,也会把缓冲区的数据写入文件中,因为缓冲区的数据是存满8192字节才写入文件中,如果最后还剩下不到8192字节的数据在缓冲区中,不刷新缓冲区的话,里面的数据是不会写入文件中去的,会造成数据丢失,所以输出流一定要关闭.
如果不想自己调用close()方法的话,可以把可关闭的流的声明和赋值放到try()代码里面(小括号里面叫ARM块):
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("部署.png"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("222.png"))) {
int a;
while ((a = bis.read()) != -) {
bos.write(a);
}
}
---------------------------------------------------------------------------------------------
字符流,读的时候把字节转换为字符,写的时候把字符转换为字节写入,可以通过项目默认的编码一次读取一个字符(如果是中文,就一次读取两个字节)
字符流 基础父类Reader-InputStreamReader-FileReader,一般用FileReader,Writer类也一样.
字符流Reader和Writer类默认都带2k的缓冲区,BufferedReader和BufferedWriter是带缓冲区(16k)的字符流类,直接父类Reader和Writer,BufferedReader的readLine()方法可以读一行(没有数据返回null),BufferedWriter的newLine()方法可以写出一个换行符(根据系统写出不同的换行符).
LineNumberReader是BufferedReader的子类,多了可以记住当前行号和设置当前行号的功能.
InputStreamReader可以指定用什么码表读取字符流,创建对象需要包装一个InputStream对象,OutputStreamWriter也一样,一般搭配BufferedReader或者BufferedWriter来高效的读取与写入,如:
new BufferedReader(new InputStreamReader(new FileInputStream("xxx.txt"),"utf-8"))
new String("bytes", "UTF-8")是按UTF-8码表把字节解码成字符,如果解码时有字节找不到对应码表中的字符,那么会以?代替. (解码:字节数据 --> 字符串)
getBytes("UTF-8")的意思是将(字符)数据按照UTF-8码表来编码成字节数组(此时字节数组的编码格式为UTF-8,如果没有指定那么会采用系统默认编码格式). (编码:字符串 --> 字节数据)
关于解码和编码: https://blog.csdn.net/mdreamlove/article/details/78468864
平时推荐使用 InputStreamReader 和 OutputStreamWriter 因为这两个可以显示指定解码编码字符集.
----------------------------------------------------------------------------------------------
其他流:
SequenceInputStream : 序列化输入流,可以吧多个InputStream放到里面,依次接收流数据.它从一个有序的输入流集合开始,从第一个读取到文件的结尾,然后从第二个文件读取,依此类推,直到最后一个输入流达到文件的结尾。 构造可以传入一个Enumeration对象
ByteArrayOutputStream : 内存中会创建一个缓冲区.输出的数据会写入这个缓冲区.缓冲区自动增长,可以用toByteArray和toString获取里面的数据.这个流不会造成IO异常,而且close方法没有任何效果
RandomAccessFile: 读取和写入随机访问文件,有一种游标,或索引到隐含的数组,称为文件指针 ; 输入操作读取从文件指针开始的字节,并使文件指针超过读取的字节。 如果在读/写模式下创建随机访问文件,则输出操作也可用; 输出操作从文件指针开始写入字节,并将文件指针提前到写入的字节。 (适合用来多线程大文件拷贝或下载)
DataInputStream DataOutputStream: 数据输入输出流,可以直接写出或读入比如int long类型的数据.
ObjectInputStream : 对象输入流,.使用readObject可以读取一个被序列化存储的对象.
ObjectOutputStream : 对象输出流,可以把一个实现了Serializable接口的对象序列化存储到文件中或者是进行传输.使用
writeObject方法.
提示:如果有个对象需要序列化存储,那么最好加上一个版本id: private static final long serialVersionUID = 1L;
如果这个类修改过了,那么反序列化的时候会报异常,可以根据异常的版本号来判断是哪次修改出了问题.
PrintStream : 打印字节流,可以将对象的toString方法的结果输出,System.out返回的就是一个PrintStream
print类的方法会先用toString转换为字符串并打印,而write方法会直接根据码表查找字符打印.
PrintWriter : 打印字符流,具体使用方法与一般输出字符流差不多.
标准输入输出流: System.in System.out 默认标准输入流是键盘,标准输出流为控制台. 可以用System.setIn setOut的方法改变标准流
Properties 类是Hashtable的子类,可以用load方法读取一个配置文件,如新建一个a.properties文件里面写入name=xxx,那么可以用
properties.load(new FileInputStream("a.properties")); 读取文件,然后用properties.getProperty("name", "yyy") 获取值.第二个参数是默认值,如果没有这个属性那么就会使用默认值.同样也可以用properties.setProperty("name2", "22222222");添加新属性,用
properties.store(new FileOutputStream("a.properties"), "描述");保存配置文件
Java : java基础(3) IO流的更多相关文章
- java基础之IO流(二)之字符流
java基础之IO流(二)之字符流 字符流,顾名思义,它是以字符为数据处理单元的流对象,那么字符流和字节流之间的关系又是如何呢? 字符流可以理解为是字节流+字符编码集额一种封装与抽象,专门设计用来读写 ...
- java基础之IO流(一)字节流
java基础之IO流(一)之字节流 IO流体系太大,涉及到的各种流对象,我觉得很有必要总结一下. 那什么是IO流,IO代表Input.Output,而流就是原始数据源与目标媒介的数据传输的一种抽象.典 ...
- Java基础之IO流整理
Java基础之IO流 Java IO流使用装饰器设计模式,因此如果不能理清其中的关系的话很容易把各种流搞混,此文将简单的几个流进行梳理,后序遇见新的流会继续更新(本文下方还附有xmind文件链接) 抽 ...
- Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)
声明:该博文以socket中,关闭输出流为例进行说明. 为了方便讲解,我们把DataOutputstream dout = new DataOutputStream(new BufferedOutpu ...
- Hadoop基础-通过IO流操作HDFS
Hadoop基础-通过IO流操作HDFS 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.上传文件 /* @author :yinzhengjie Blog:http://www ...
- 【java基础】]IO流
IO流 概念: 流的概念源于unix中管道(pipe)的概念,在unix中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备,外部文件等 一个流,一定能够会有源和去向(目的地),他 ...
- java基础之 IO流
javaIO流 IO流 : (input output) 输入输出流 :输入 :将文件读到内存中 输出:将文件从内存输出到其他地方. IO技术的作用:主要就是解决设备和设备之间的数据传输问题 ...
- java基础44 IO流技术(输出字节流/缓冲输出字节流)和异常处理
一.输出字节流 输出字节流的体系: -------| OutputStream:所有输出字节流的基类(抽象类) ----------| FileOutputStream:向文件输出数据的输出字节流(把 ...
- java基础之io流总结一:io流概述
IO流概念: 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.io流是实现输入和输出的基础,可以方便的实现数据的输入和输出操作. IO流的分类: 根据处理数据类型的不同分为:字符流 ...
- 乐字节Java之file、IO流基础知识和操作步骤
嗨喽,小乐又来了,今天要给大家送上的技术文章是Java重点知识-IO流. 先来看看IO流的思维导图吧. 一. File 在Java中,Everything is Object!所以在文件中,也不例外! ...
随机推荐
- linux漏洞分析入门笔记-bypass_PIE
ubuntu 16.04 IDA 7.0 docker 0x00:漏洞分析 1.ASLR的是操作系统的功能选项,作用于executable(ELF)装入内存运行时,因而只能随机化stack.heap. ...
- 破解Power Designer 12.5
PowerDesigner15.1破解补丁链接: https://pan.baidu.com/s/1boJoT6B 密码: 9x77 解压,将文件 pdflm15.dll替换安装目录的同名文件即可.
- 使用 yield生成迭代对象函数
https://www.cnblogs.com/python-life/articles/4549996.html https://www.liaoxuefeng.com/wiki/001431608 ...
- Hive的UDF(用户自定义函数)开发
当 Hive 提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数(UDF:user-defined function). 测试各种内置函数的快捷方法: 创建一个 dual 表 ...
- February 26 2017 Week 9 Sunday
There is only one happiness in life, to love and be loved. 生命中只有一种幸福,爱与被爱. Some one told me that hea ...
- 站在巨人肩膀上的牛顿:Kubernetes和SAP Kyma
这周Jerry在SAP上海研究院参加了一个为期4天的Kubernetes培训,度过了忙碌而又充实的4天.Jason,Benny和Peng三位大神的培训干货满满,借此机会,Jerry和过去的两位老领导P ...
- OC static 和变量
#include <stdio.h> // 如果在不同源文件出现了同名的内部变量,那么这些变量将互不干扰 static int b; // 用static修饰的全部变量,可以称为内部变量 ...
- MHA 一主一从搭建
安装基本环境介绍 一主一从 MHA manager & slave node2 192.168.56.27 Master机器 node1 192.168.56.26 VIP 19 ...
- “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法
“标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法.大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<T> 接口或 IQueryable& ...
- linux自动备份文件 并上传到远程服务器 脚本实现
(1)在服务器上创建备份目录,并赋予权限 mkdir -p /backup/bakdata #新建数据备份目录(2)完成备份脚本操作新建脚本文件 vi bakdata.sh添加 ...