文章目录
前言
今天带来的是JAVA的IO流中的字节流,InputStream和OutputStram子类流的用法。
基础概念
流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出。
IO流分类导向图
何为输入流和输出流?
其实输入(InputStream,Reader)和输出(OutputStream,Writer)是相对于程序来讲,例如一个文件的数据要想在程序中被操作,那么就得输入到程序,这就是输入,操作完成之后又想保存到文件里面,从程序输出数据到文件的过程就是输出。
各种字节流的用法
①节点流
概念:可以从或向一个特定的地方(节点)读写数据。
- 文 件 FileInputStream,FileOutputStream 文件进行处理的节点流。
- 数 组 ByteArrayInputStream,ByteArrayOutputStream 将数据与字节数组的互转的节点流。
②处理流
概念:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接
- 缓冲流(装饰流,装饰模式的其中之一):BufferedInputStream,BufferedOutputStream —增加缓冲功能,避免频繁读写硬盘。
- 转换流:InputStreamReader, OutputStreamReader实现字节流和字符流之间的转换。
- 数据流:DataInputStream, DataOutputStream 提供将基础数据类型写入到文件中,或者读取出来.
- 对象流:ObjectInputStream, ObjectOutputStream对象流可以将一个对象写出,或者读取一个对象到程序中,也就是执行了序列化和反序列化的操作。
序列化的概念:
将一个对象存放到某种类型的永久存储器上称为保持。如果一个对象可以被存放到磁盘或磁带上,或者可以发送到另外一台机器并存放到存储器或磁盘上,那么这个对象就被称为可保持的。(在Java中,序列化、持久化、串行化是一个概念。)
③流的使用一般步骤
- 选择源,即是选择要操作的文件或者数据。
- 选择流,想要实现何种流的操作。
- 流的操作。
- 释放资源。
④流的关闭
遵循先开后闭的原则,有多种流的使用时,最先创建的流对象最后关闭。(字节数组流可以不用关闭)
流的对象的创建
try{
流的操作
}catch (IOException e) {
异常处理
}finally{
流的释放
}
Java7提供了try-with-resources机制,其类似Python中的with语句,将实现了 java.lang.AutoCloseable 接口的资源定义在 try 后面的小括号中,不管 try 块是正常结束还是异常结束,这个资源都会被自动关闭。 try 小括号里面的部分称为 try-with-resources 块。
try(流对象的创建){
流的操作
}catch (IOException e) {
异常处理
}
具体用法
Ⅰ文件流
将文件abc1.txt的copy到abc2.txt
InputStream is = null;
OutputStream os = null;
try {
InputStream is = new FileInputStream("abc1.txt");//参数可以为File对象
OutputStream os = new FileOutputStream("abc2.txt");//参数可以为File对象
byte[] flush = new byte[1024]; //缓冲容器
int len = -1; //接收长度
while((len=is.read(flush))!=-1) {
os.write(flush,0,len); //分段写出
}
} catch (IOException e) {
e.printStackTrace();
}finally{
//先开后闭
try {
if (null != os) {
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if(null!=is) {
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
Ⅱ字节数组流
简单demo将图片用字节数组流和文件流进行复制。
public class Test {
public static void main(String[] args) {
byte[] datas = fileToByteArray("p.png");
System.out.println(datas.length);
byteArrayToFile(datas,"p-byte.png");
}
/**
* 1、图片读取到字节数组
* 1)、图片到程序 FileInputStream
* 2)、程序到字节数组 ByteArrayOutputStream
*/
public static byte[] fileToByteArray(String filePath) {
//1、创建源
File src = new File(filePath);
byte[] dest =null;
//2、选择流
InputStream is =null;
ByteArrayOutputStream baos =null;
try {
is =new FileInputStream(src);
baos = new ByteArrayOutputStream();
//3、操作 (分段读取)
byte[] flush = new byte[1024*10]; //缓冲容器
int len = -1; //接收长度
while((len=is.read(flush))!=-1) {
baos.write(flush,0,len); //写出到字节数组中
}
baos.flush(