JAVA语言之IO流字符串输入输出流
小标 2019-01-09 来源 : 阅读 2445 评论 0

摘要:本文主要向大家介绍了JAVA语言之IO流字符串输入输出流,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言之IO流字符串输入输出流,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。


概述


StringReader 字符输入流 和CharArrayReader类似 都是节点流 内存流


和CharArrayReader不同的地方是直接读入字符串而不是字符数组


源码分析


成员变量


和CharArrayReader相似


字符串内容体

private String str;

流内容长度

private int length;

索引游标 下一个流读入位置 

private int next = 0;

在流中被标记的位置

private int mark = 0;

   

成员方法


构造方法 很简单 传入一个String参数s 初始化成员变量即可


public StringReader(String s) {

    this.str = s;

    this.length = s.length();

}

   

读取字符方法 如果下一个读入位置已经超过了流内容长度 则返回-1表示已读取完毕


否则返回对应索引位置的字符对应的整型数值 并移动索引游标


public int read() throws IOException {

    synchronized (lock) {

        ensureOpen();

        if (next >= length)

            return -1;

        return str.charAt(next++);

    }

}

   

读入字符 并写入到字符数组方法


入参为指定的要存储的内容的字符数组char cbuf[],数组存储起始的位置int off和终止位置int len


public int read(char cbuf[], int off, int len) throws IOException {

    synchronized (lock) {

        例行的安全检查 判断流是否开启 读入长度 起始终止位置是否越界

        ensureOpen();

        if ((off < 0) || (off > cbuf.length) || (len < 0) ||

            ((off + len) > cbuf.length) || ((off + len) < 0)) {

            throw new IndexOutOfBoundsException();

        } else if (len == 0) {

            return 0;

        }

        如果索引游标超过数组长度 读取完毕 返回-1

        if (next >= length)

            return -1;

        整形值int n,设置为length-next和len之间的较小值,因为一般情况下使用len即可,

        如果len长度超过了数据的总长度,那么就要使用length-next的值 以避免读入越界

        int n = Math.min(length - next, len);

        使用String类的getChars方法,将指定str从next到next+n位置的数据

        复制到传入的字符数组cbuf中,起始位置从off开始 

        str.getChars(next, next + n, cbuf, off);

        移动索引游标

        next += n;

        return n;

    }

}

   

跳过方法 指定跳过long ns个字符内容


public long skip(long ns) throws IOException {

    synchronized (lock) {

        ensureOpen();

        如果游标已经到尾部 则说明流已经读完 不能再跳过了

        if (next >= length)

            return 0;

        n为真正的跳过的字符大小 一般是ns的大小 但如果ns

        超过了数据的总长度,那么就要使用length-next的值 以避免越界

        long n = Math.min(length - next, ns);

        这里是处理ns为负数的情况 如果ns为负数 则n一定为ns

        Math.max(-next, n)计算保证了如果ns为负数且其绝对值大于next时

        倒回next大小,回到流起点 避免越界

        即只有当读取位置大于回退的数值大小时才可以回腿,所以最多之能回退到数据的起点位置

        n = Math.max(-next, n);

        next += n;

        return n;

    }

}

   

标记与重置


标记方法 在指定位置做标记,与reset方法连用,可以让流回退到标记位置 

public void mark(int readAheadLimit) throws IOException {

    if (readAheadLimit < 0){

        throw new IllegalArgumentException("Read-ahead limit < 0");

    }

    synchronized (lock) {

        ensureOpen();

        mark = next;

    }

}

重置方法 移动索引游标到标记位置 

public void reset() throws IOException {

    synchronized (lock) {

        ensureOpen();

        next = mark;

    }

}

   

关闭方法 可以看到 StringReader是内存流 不存在数据源 所以关闭就是置为空值


public void close() {

    synchronized (lock) {

        str = null;

    }

}

   

示例


读入


String str = "使用StringReader";

 

StringReader  reader = new StringReader(str);

 

int i=0;

reader.mark(0);

while((i=reader.read())!=-1)

{

    System.out.print((char)i);

}

 

reader.reset();

 

System.out.println();

reader.skip(2);

 

while((i=reader.read())!=-1)

{

    System.out.print((char)i);

}

   

输出结果


使用StringReader

StringReader

   

读入到字符数组


String str = "使用StringReader";

 

StringReader  reader = new StringReader(str);

 

char[] chars = new char[1024];

int len = 0;

while ( (len = reader.read(chars)) != -1 ) {

 

}

System.out.println( new String(chars, 0, chars.length-1) );

   

输出结果


使用StringReader

   

StringWriter


概述


StringWriter字符输入流 和CharArrayWriter类似 都是节点流 内存流


和CharArrayWriter不同的地方是直接写入字符串而不是字符数组


源码分析


成员变量 仅有一个StringBuffer,因为流的操作有数据改变的方法,所以简单的String类型并不能满足


private StringBuffer buf;

   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved