Java IO学习笔记四
内存操作流
之前的所有的流操作都是针对文件的,但是有时候只是想要实现数据间转换,此时如果我们想要创建一个文件然后再删除文件,那样显得有点麻烦,因此此时的内存操作流就显得很适合这类的操作,因为它只是在内存中存储,并不会真正的创建文件,内存操作流涉及的两个类是
ByteArrayInputStream,ByteArrayOutputStream.
ByteArrayInputStream
ByteArrayInputStream包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪read方法要提供的下一个字节。- 关闭
ByteArrayInputStream无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何IOException。- 主要的功能是从缓冲区读取字节
构造函数
ByteArrayInputStream(byte[] buf)创建一个ByteArrayInputStream,使用buf作为其缓冲区数组。ByteArrayInputStream(byte[] buf, int offset, int length)创建ByteArrayInputStream,使用 buf 作为其缓冲区数组。
常用的方法
close()不过对这个无效,因为关闭之后仍然可以使用函数读取而不报错int read()从缓冲区中读取一个字节int read(byte[] bytes)将缓冲区中的内容读取到数组中int read(byte[] bytes,int off,int len)将最多len个数据字节从此输入流读入byte数组。long skip(long n)从此输入流中跳过n个输入字节。void reset()将此 byte 数组输出流的 count 字段重置为零,从而丢弃输出流中目前已累积的所有输出(清除缓冲区)
实例
public class demo8 {
public static void main(String args[]) {
String str = "chenjiabing\n陈加兵";
byte[] bytes = str.getBytes(); //创建一个数组
ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes); //使用bytes作为缓冲区数组
int temp = 0;
/*第一种方法读取缓冲区中的数据,这个和文件的操作不一样,这个可以直接冲缓冲区中读取数据字节*/
while ((temp = inputStream.read()) != -1) {
System.out.print((char) temp);
}
/*创建数组用于存储读取的内容,下面是第二种读取数据的方法*/
byte[] b = new byte[bytes.length];
try {
int len = inputStream.read(b);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(new String(b));
}
}
ByteArrayOutputStream
- 此类实现了一个输出流,其中的数据被写入一个
byte数组。缓冲区会随着数据的不断写入而自动增长。可使用toByteArray()和 toString() 获取数据。
- 关闭
ByteArrayOutputStream无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何IOException。
构造函数
ByteArrayOutputStream()创建一个新的byte数组输出流。ByteArrayOutputStream(int size)创建一个新的byte数组输出流,它具有指定大小的缓冲区容量(以字节为单位)。
常用函数
int size()返回缓冲区的当前大小。
byte[] toByteArray()创建一个新分配的byte数组。
String toString()将缓冲区的字节转换成字符串
void write(byte[] b, int off, int len)将指定byte数组中从偏移量off开始的len个字节写入此byte数组输出流。
void write(int b)将指定的字节写入此byte数组输出流。
实例
public class demo8 {
public static void main(String args[]) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
String str = "chenjiabing";
try {
outputStream.write(str.getBytes()); //将字符串转换成数组然后写入缓冲区
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
outputStream.close(); //这里的关闭无效
} catch (IOException e) {
e.printStackTrace();
}
}
//将缓冲区的数据转换成字符串后输出,这里同样可以看出输出流的关闭根本不影响函数的调用
System.out.println(outputStream.size()); //输出缓冲区的大小
System.out.println(outputStream.toString()); //输出chenjiabing
outputStream.reset(); //清除缓冲区的内容,如果不清零那么原先写入的数据还是存在的,但是此时我们已经不需要前面的数据了
try {
outputStream.write("陈加兵".getBytes()); //继续向缓冲区写入数据
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(outputStream.size()); //这里的一个汉字占了三个字节
System.out.println(outputStream.toString());//输出陈加兵
}
}
综合
下面我们结合上面的两个类将字符串转换大小写
public class demo8 {
public static void main(String args[]) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
String str = "chenjiabing";
ByteArrayInputStream inputStream = new ByteArrayInputStream(str.getBytes()); //实例化输入流
int temp = 0;
while ((temp = inputStream.read()) != -1) //读取缓冲区的字节数据
{
char c = (char) temp; //将整数转换成字符,ascii码的转换
outputStream.write(Character.toUpperCase(c)); //转换成大写,然后写入输出流的缓冲区中
}
System.out.println(outputStream.toString()); //利用输出流输出转换后的字符串,即是去取出内存中的数据
}
}
参考文章
Java IO学习笔记四的更多相关文章
- Java IO学习笔记四:Socket基础
作者:Grey 原文地址:Java IO学习笔记四:Socket基础 准备两个Linux实例(安装好jdk1.8),我准备的两个实例的ip地址分别为: io1实例:192.168.205.138 io ...
- Java IO学习笔记:概念与原理
Java IO学习笔记:概念与原理 一.概念 Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了 ...
- Java IO学习笔记二
Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...
- 零拷贝详解 Java NIO学习笔记四(零拷贝详解)
转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...
- Java IO学习笔记七:多路复用从单线程到多线程
作者:Grey 原文地址:Java IO学习笔记七:多路复用从单线程到多线程 在前面提到的多路复用的服务端代码中, 我们在处理读数据的同时,也处理了写事件: public void readHandl ...
- Java IO学习笔记总结
Java IO学习笔记总结 前言 前面的八篇文章详细的讲述了Java IO的操作方法,文章列表如下 基本的文件操作 字符流和字节流的操作 InputStreamReader和OutputStreamW ...
- Java IO学习笔记三
Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...
- Java IO学习笔记一
Java IO学习笔记一 File File是文件和目录路径名的抽象表示形式,总的来说就是java创建删除文件目录的一个类库,但是作用不仅仅于此,详细见官方文档 构造函数 File(File pare ...
- Java IO学习笔记一:为什么带Buffer的比不带Buffer的快
作者:Grey 原文地址:Java IO学习笔记一:为什么带Buffer的比不带Buffer的快 Java中为什么BufferedReader,BufferedWriter要比FileReader 和 ...
随机推荐
- Python 与 C/C++ 交互的几种方式
python作为一门脚本语言,其好处是语法简单,很多东西都已经封装好了,直接拿过来用就行,所以实现同样一个功能,用Python写要比用C/C++代码量会少得多.但是优点也必然也伴随着缺点(这是肯定的, ...
- C#集合之列表
.NET Framework为动态列表List提供泛型类List<T>.这个类实现了IList,ICollection,IEnumerable,IList<T>,ICollec ...
- ThinkPHP3.2——基础
1.1.获取ThinkPHP 3.2 获取ThinkPHP的方式很多,官方网站(http://thinkphp.cn)是最好的下载和文档获取来源. 官网提供了稳定版本的下载:http://thinkp ...
- 使用 Mono.Cecil 辅助 Unity3D 手游进行性能测试
Unity3D 引擎在 UnityEngine 名字空间下,提供了 Profiler 类(Unity 5.6 开始似乎改变了这个名字空间),用于辅助对项目性能进行测试.以 Android 平台为例 ...
- [刷题]算法竞赛入门经典(第2版) 4-7/UVa509 - RAID!
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa509 - RAID! #include<iostream> ...
- Centos程序最小化后,窗口标签都消失找不到窗口的问题
我是用的centos版本是CentOs 7. 在“顶部面板”或者 “底部面板” 右击选择“添加组件”),如下图所示: 在搜索框里输入“窗口列表”(window list),选中“窗口列表”即可.如下图 ...
- React入门---基础知识-大纲-1
-----------------在慕课网学习react入门笔记-------------- ---------博主边学边记录,手把手进行学习及记录---------- --------------- ...
- java中多种写文件方式的效率对比实验
一.实验背景 最近在考虑一个问题:“如果快速地向文件中写入数据”,java提供了多种文件写入的方式,效率上各有异同,基本上可以分为如下三大类:字节流输出.字符流输出.内存文件映射输出.前两种又可以分为 ...
- wdc网站部署问题
最近公司新买了一个服务器,将项目迁移到新服务器上,按照wdcp安装方法,部署了lnamp环境,具体方法如下: 安装方法1 只安装wdcp面板看看wget http://down.wdlinux.cn/ ...
- MyBatis之级联——鉴别器
鉴别器(discriminator)是MyBatis为我们提供的第三个级联也是最后一个.基于之前两篇级联中的场景,现增加学生们去体检,但男女体检项目不一样,我们把男女体检表做成两张表,当然我想也可以设 ...