运用内存操作流实现IO操作 | 带你学《Java语言高级特性》之六十一

简介: 文件操作流能够实现对文件内容的读写操作,若是碰到了不希望产生文件的IO操作,显然是不能实现的,此时就需要用到内存操作流程。本节将为读者介绍内存操作流的相关知识。

上一篇:教你用不同的编码标准解码字符 | 带你学《Java语言高级特性》之六十
文件操作流能够实现对文件内容的读写操作,若是碰到了不希望产生文件的IO操作,显然是不能实现的,此时就需要用到内存操作流程。本节将为读者介绍内存操作流的相关知识。

【本节目标】
通过阅读本节内容,你将进一步了解到IO流操作的过程,了解到内存操作流相关类的继承体系,并能够借助这些类实现以内存为终端的IO操作。

内存操作流

在之前使用的全部都是文件操作流,文件操作流的特点:程序利用InputStream读取文件内容,而后程序利用OutputStream向文件输出内容,所有的操作都是以文件为终端的。

image.png
文件流

假设说现在需要实现IO操作,可是又不希望产生文件(临时文件),则就可以以内存为终端进行处理,这个时候的流程为:

image.png内存流

在Java里面提供有两类的内存操作流:

  • 字节内存操作流:ByteArrayOutputStream、ByteArrayInputStream
  • 字符内存操作流:CharArrayWriter、CharArrayReader

image.png
ByteArrayOutputStream

image.png
ByteArrayInputStream

image.png
CharArrayWriter

image.png
CharArrayReader

下面以ByteArrayOutputStream和ByteArrayInputStream类为主进行内存的使用分析,首先分析各自的构造方法:

ByteArrayInputStream构造:public ByteArrayInputStream(byte[] buf);
ByteArrayOutputStream构造:public ByteArrayOutputStream();

在ByteArrayOutputStream类里面有两个重要的方法,这些方法可以获取全部保存在内存流中的数据信息,该方法为:

获取数据:public byte[] toByteArray();
使用字符串的形式获取:public String toString();

范例:利用内存流实现一个小写字母转大写字母的操作

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.ByteArrayInputStream;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        String str="www.mldn.cn";   //小写字母
        InputStream input=new ByteArrayInputStream(str.getBytes());   //将数据保存到内存流
        OutputStream output=new ByteArrayOutputStream();//读取内存中的数据
        int data = 0;
        while ((data = input.read())!= -1){   //每次读取一个字节
            output.write(Character.toUpperCase((char)data));  //保存数据
        }
        System.out.println(output);  //WWW.MLDN.CN
        input.close();
        output.close();
    }
}

如果不希望只是以字符串的形式返回,因为可能存放的是其它二进制的数据,那么此时就可以利用ByteArrayOutputStream子类的扩展功能获取全部字节数据。

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.ByteArrayInputStream;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        String str="www.mldn.cn";
        InputStream input=new ByteArrayInputStream(str.getBytes());//将数据保存在内存流
        //必须使用子类来调用子类自己的扩展方法
        ByteArrayOutputStream output=new ByteArrayOutputStream();//读取内存中的数据
        int data=0;
        while ((data=input.read())!= -1){//每次读取一个字节
            output.write(Character.toUpperCase((char)data));//保存数据
        }
        byte result []=output.toByteArray(); //获取全部数据
        System.out.println(new String(result));   //自己处理字节数据,结果:WWW.MLDN.CN
        input.close();
        output.close();
    }
}

在最初的时候,可以利用ByteArrayOutputStream实现大规模文本文件读取。

想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:使用管道流构建线程信息通道 | 带你学《Java语言高级特性》之六十二
更多Java面向对象编程文章查看此处

相关文章
|
20天前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
47 2
|
3月前
|
存储 Java 开发工具
【Azure 存储服务】Azure Blob上传大文件(600MB)出现内存溢出情况(Java SDK)
【Azure 存储服务】Azure Blob上传大文件(600MB)出现内存溢出情况(Java SDK)
|
30天前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
65 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
12天前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
181 1
|
18天前
|
存储 Java API
优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。
【10月更文挑战第19天】本文介绍了如何优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。内容包括Map的初始化、使用Stream API处理Map、利用merge方法、使用ComputeIfAbsent和ComputeIfPresent,以及Map的默认方法。这些技巧不仅提高了代码的可读性和维护性,还提升了开发效率。
39 3
|
18天前
|
存储 安全 Java
Java Map新玩法:深入探讨HashMap和TreeMap的高级特性
【10月更文挑战第19天】Java Map新玩法:深入探讨HashMap和TreeMap的高级特性,包括初始容量与加载因子的优化、高效的遍历方法、线程安全性处理以及TreeMap的自然排序、自定义排序、范围查询等功能,助你提升代码性能与灵活性。
23 2
|
1月前
|
消息中间件 分布式计算 Java
大数据-73 Kafka 高级特性 稳定性-事务 相关配置 事务操作Java 幂等性 仅一次发送
大数据-73 Kafka 高级特性 稳定性-事务 相关配置 事务操作Java 幂等性 仅一次发送
27 2
|
1月前
|
消息中间件 存储 Java
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
41 3
|
1月前
|
Java 数据处理 开发者
揭秘Java IO流:字节流与字符流的神秘面纱!
揭秘Java IO流:字节流与字符流的神秘面纱!
32 1
|
1月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
Java IO流全解析:字节流和字符流的区别与联系!
70 1
下一篇
无影云桌面