Java基础之内存流

内存字节流

使用文件流,我们可以操作文件中的数据。使用内存流,我们可以操作内存中字节数组中的数据。

内存字节流,也称为字节数组流

  • java.io.ByteArrayOutputStream

    内存输出流,负责把数据写入到内存中的字节数组中

  • java.io.ByteArrayInputStream

    内存输入流,负责从内存中的字节数组中读取数据.

接下来,我们先来学习内存输出流,再学习内存输入流!

1)内存输出流

ByteArrayOutputStream源码分析:

package java.io;

public class ByteArrayOutputStream extends OutputStream {
    //存储数据的数组
    protected byte buf[];

    //存入字节数组的元素(字节)个数
    protected int count;

    //无参构造器创建的字节数组输出流,数组大小为32个字节
    public ByteArrayOutputStream() {
        this(32);
    }
    
    //关键方法:获取内存输出流中存储的数据,返回字节数组
    public synchronized byte toByteArray()[] {
        return Arrays.copyOf(buf, count);
    }
    
    //省略...
}

案例展示:

​ 小数组方式读取src/dir/a.txt文件中所有内容,写入到字节数组输出流中,然后从字节输出流中获取所有数据,最后转换成String字符串输出。

package com.briup.chap11.test;

public class Test024_ByteArrayOutput {
	public static void main(String[] args) throws IOException {
		//1.关联流对象和文件
		// 创建内存输出流对象[new byte[32]]
		InputStream is = new FileInputStream("src/dir/a.txt");
		ByteArrayOutputStream os = new ByteArrayOutputStream();
		
		//2.读取文件内容 然后写入到 内存输出流中
		byte[] arr = new byte[8];
		int len;
		while((len = is.read(arr)) != -1) {
			//写入 内存输出流
			os.write(arr, 0, len);
		}
		System.out.println("拷贝完成!");
		
		//3.关键方法:获取内存输出流中的数据
		byte[] byteArray = os.toByteArray();
		
		//4.将byte[] --> String 并输出
		System.out.println(new String(byteArray));
        
        //5.注意:内存流不需要close()释放资源
	}
}

运行结果:

在这里插入图片描述

注意:内存流使用完不需要close()去释放资源!

原因:内存流的底层数据源是内存中的字节数组,不需要进行资源释放或关闭操作。当使用完 ByteArrayXxxStream 后,可以选择不进行任何操作,它会自动被垃圾回收机制回收。

2)内存输入流

ByteArrayInputStream类源码:

package java.io;

public
class ByteArrayInputStream extends InputStream {
    protected byte buf[];

    protected int pos;

    protected int count;

    //关键构造器
    public ByteArrayInputStream(byte buf[]) {
        this.buf = buf;
        this.pos = 0;
        this.count = buf.length;
    }
 
    //省略...
}

案例展示:

​ 1.从键盘录入1行字符串,将其转换为byte[]数组

​ 2.由byte[]数组构建一个内存输入流对象

​ 3.从内存输入流中用小数组方式读取数据,并写入到src\dir\b.txt文件中

​ 4.关闭流、释放资源

package com.briup.chap11.test;

public class Test024_ByteArrayInput {
	public static void main(String[] args) throws Exception {
		//1.实例化sc对象 并录入一行字符串
		Scanner sc = new Scanner(System.in);
		System.out.println("input line:");
		String line = sc.nextLine();
		
		//2.将字符串转换成字节数组
		byte[] bytes = line.getBytes();
		//由 字节数组 构建 内存输入流对象
		InputStream is = new ByteArrayInputStream(bytes);
		//创建文件输出流对象
		OutputStream os = new FileOutputStream("src/dir/b.txt");
		
		//3.小数组方式读取内存流数据
		byte[] arr = new byte[5];
		int len;
		while((len = is.read(arr)) != -1) {
			//4.写入b.txt文件中
			os.write(arr, 0, len);
		}
		
		System.out.println("文件操作完成!");
		
		//5.关闭流、释放资源
		os.close();
		// 注意:内存流不需要关闭
	}
}

内存流总结:

  • 如果要操作文件,则需要使用文件流
  • 如果要操作内存中的数据,则可以选择内存流

内存字节流提供了一种在内存中进行数据读取和写入的便捷方式。内存流在实际开发中有专门的应用场景,我们使用不多,了解即可。

常见应用场景:

  1. 数据的临时存储:内存字节流可以将数据暂时存储在内存中的字节数组中,而不需要写入到磁盘或网络中。这在一些临时性的数据处理场景中非常有用,例如在内存中对数据进行加密、解密、压缩、解压缩等操作。
  2. 数据的转换:内存字节流可以用于将数据从一种格式转换为另一种格式。例如,可以将一个对象序列化为字节数组,然后再将字节数组反序列化为对象。这在一些需要将数据在内存中进行格式转换的场景中非常有用。
  3. 测试和调试:内存字节流可以用于测试和调试目的,例如模拟输入流或输出流的行为。通过将数据写入内存字节流,可以方便地检查数据的内容和格式,而无需依赖外部资源。
  4. 单元测试:内存字节流在单元测试中也非常有用。可以使用内存字节流模拟输入和输出流,以便在测试中验证代码的正确性和可靠性,而无需依赖外部文件或网络连接。

需要注意,由于内存字节流将数据存储在内存中的字节数组中,因此在处理大量数据时可能会占用较多的内存。在这种情况下,需要谨慎使用内存字节流,以避免内存溢出的问题。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值