Java中的IO流(一)字节流的常用操作

本文详细介绍了Java中的字节流,包括基础概念、输入输出流的区别、各种字节流的用法,如节点流、处理流、缓冲流、转换流、数据流、对象流和打印流等。同时讲解了流的关闭和使用步骤,以及字节流在文件、字节数组、缓冲、转换和数据操作等方面的具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

今天带来的是JAVA的IO流中的字节流,InputStream和OutputStram子类流的用法。

基础概念

流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出。

IO流分类导向图

IO分类导向图

何为输入流和输出流?

其实输入(InputStream,Reader)和输出(OutputStream,Writer)是相对于程序来讲,例如一个文件的数据要想在程序中被操作,那么就得输入到程序,这就是输入,操作完成之后又想保存到文件里面,从程序输出数据到文件的过程就是输出。

各种字节流的用法

①节点流

概念:可以从或向一个特定的地方(节点)读写数据。

  1. 文 件 FileInputStream,FileOutputStream 文件进行处理的节点流。
  2. 数 组 ByteArrayInputStream,ByteArrayOutputStream 将数据与字节数组的互转的节点流。
②处理流

概念:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接

  1. 缓冲流(装饰流,装饰模式的其中之一):BufferedInputStream,BufferedOutputStream —增加缓冲功能,避免频繁读写硬盘。
  2. 转换流:InputStreamReader, OutputStreamReader实现字节流和字符流之间的转换。
  3. 数据流:DataInputStream, DataOutputStream 提供将基础数据类型写入到文件中,或者读取出来.
  4. 对象流:ObjectInputStream, ObjectOutputStream对象流可以将一个对象写出,或者读取一个对象到程序中,也就是执行了序列化和反序列化的操作。

序列化的概念:
将一个对象存放到某种类型的永久存储器上称为保持。如果一个对象可以被存放到磁盘或磁带上,或者可以发送到另外一台机器并存放到存储器或磁盘上,那么这个对象就被称为可保持的。(在Java中,序列化、持久化、串行化是一个概念。)

③流的使用一般步骤
  1. 选择源,即是选择要操作的文件或者数据。
  2. 选择流,想要实现何种流的操作。
  3. 流的操作。
  4. 释放资源。
④流的关闭

遵循先开后闭的原则,有多种流的使用时,最先创建的流对象最后关闭。(字节数组流可以不用关闭)

流的对象的创建
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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值