资讯专栏INFORMATION COLUMN

Java IO学习笔记四

oliverhuang / 864人阅读

摘要:此类中的方法在关闭此流后仍可被调用,而不会产生任何。主要的功能是从缓冲区读取字节构造函数创建一个,使用作为其缓冲区数组。缓冲区会随着数据的不断写入而自动增长。

内存操作流

之前的所有的流操作都是针对文件的,但是有时候只是想要实现数据间转换,此时如果我们想要创建一个文件然后再删除文件,那样显得有点麻烦,因此此时的内存操作流就显得很适合这类的操作,因为它只是在内存中存储,并不会真正的创建文件,内存操作流涉及的两个类是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
陈加兵";
        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());   //利用输出流输出转换后的字符串,即是去取出内存中的数据


    }

}
参考文章

http://blog.csdn.net/yyyandro...

http://www.cnblogs.com/lich/a...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67121.html

相关文章

  • 年来Android面试大纲,作为一个Android程序员

    摘要:再附一部分架构面试视频讲解本文已被开源项目学习笔记总结移动架构视频大厂面试真题项目实战源码收录 Java反射(一)Java反射(二)Java反射(三)Java注解Java IO(一)Java IO(二)RandomAccessFileJava NIOJava异常详解Java抽象类和接口的区别Java深拷贝和浅拷...

    不知名网友 评论0 收藏0
  • Spring Boot学习笔记)构建RESTful API标准工程实例

    摘要:总结基于构建相对来说还是比较便捷的,其中注解使得代码更加简洁,本次用到注解再汇总下,有时间的话可以深入理解下其背后的原理申明让自动给程序进行必要的配置。风格的控制器提供路由信息,负责到中的具体函数的映射一般用于修饰层的组件自动导入依赖的 本文主要记录搭建RESTful API标准工程,包含比较推荐的工程结构,掌握一些基本注解,并引入Swagger 新建一个项目 通过Spring Ini...

    firim 评论0 收藏0
  • 多线程学习笔记(2):多线程基础

    摘要:和方法用来设置线程是否成为守护线程和判断线程是否是守护线程。守护线程依赖于创建它的线程,随它的消亡而消亡。使用提供的方法,提醒线程终止,但是否真正终止由线程自己决定。参考实战高并发程序设计多线程干货系列一多线程基础 一、如何创建多线程 1、继承Thread类 public class MyThread extends Thread { @Override public ...

    HelKyle 评论0 收藏0
  • Java进阶之路

    摘要:探索专为而设计的将探讨进行了何种改进,以及这些改进背后的原因。关于最友好的文章进阶前言之前就写过一篇关于最友好的文章反响很不错,由于那篇文章的定位就是简单友好,因此尽可能的摒弃复杂的概念,只抓住关键的东西来讲,以保证大家都能看懂。 周月切换日历 一个可以进行周月切换的日历,左右滑动的切换月份,上下滑动可以进行周,月不同的视图切换,可以进行事件的标记,以及节假日的显示,功能丰富 Andr...

    sushi 评论0 收藏0
  • Java IO学习笔记

    摘要:学习笔记二流的概念在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。主要功能是向文件中写入内容构造函数根据给定的对象构造一个对象。 Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来...

    ideaa 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<