返回顶部
首页 > 资讯 > 后端开发 > Python >Java基础知识之StringReader流的使用
  • 320
分享到

Java基础知识之StringReader流的使用

2024-04-02 19:04:59 320人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录Java StringReader流的使用一、StringReader流定义二、StringReader的实例域三、StringReader流构造函数四、StringReader

Java StringReader流的使用

一、StringReader流定义

API说明:字符串输入流、其本质就是字符串

二、StringReader的实例域


    //流对象
    private String str;
    
    //流的长度
    private int length;
    
    //流的当前位置,下个字符的索引
    private int next = 0;
    
    //流的标记位置
    private int mark = 0;

三、StringReader流构造函数


    
    public StringReader(String s) {
        this.str = s;
        this.length = s.length();
    }

四、StringReader流的API

1)read():从流中读取单个字符,若到文件末尾则返回-1


    
    public int read() throws IOException {
        synchronized (lock) {
            ensureOpen();
            if (next >= length)
                return -1;
            return str.charAt(next++);
        }
    }

2)read(char cbuf[], int off, int len):读取最多len个字节到目标数组中,从目标数组的下标off开始存储,返回实际读取的字节数


 
    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;
            }
            if (next >= length)
                return -1;
            int n = Math.min(length - next, len);
            str.getChars(next, next + n, cbuf, off);
            next += n;
            return n;
        }
    }

3)close():关闭流无效,关闭后调用该类其它方法会报异常


 
    
    public void close() {
        str = null;
    }

五、StringReader流的作用

暂未使用故未知晓,故先了解功能

StringReader分析

IO流分类图

在这里插入图片描述

访问字符串

  • StringReader是字符输入流,Reader的子类,从一个String中读取,所以需要一个String ,通过构造方法传递
  • StringWriter是字符输出流,Writer的子类,写入到一个String中去,所以它内部提供了一个StringBuffer中用来保存数据

StringReader

1. 属性和构造方法


    private String str;
    private int length;
    private int next = 0;
    private int mark = 0;
    
    public StringReader(String s) {      //传入字符串
        this.str = s;
        this.length = s.length();
    }
    
    str    :指向这个字符串
    length :为字符串长度
    next   :为读取元素的下标索引
    mark   :为标记点
    

2. 基本方法

read()方法


    //读取一个字符
    public int read() throws IOException {
        synchronized (lock) {
            ensureOpen();
            if (next >= length)
                return -1;
            return str.charAt(next++);
        }
    }

注::从中可看出StringReader 将String字符串操作 适配成 Reader字符操作 对外提供服务 —> StringReader是一个适配器类


//批量读取
 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;
            }
            if (next >= length)
                return -1;
            int n = Math.min(length - next, len);
            str.getChars(next, next + n, cbuf, off);
            next += n;
            return n;
        }
    }

标记相关方法


	//判断是否支持标记
    public boolean markSupported() {
        return true;
    }

注: FileInputStream 和 FileReader 都不支持标记


 //标记
    public void mark(int readAheadLimit) throws IOException {
        if (readAheadLimit < 0){
            throw new IllegalArgumentException("Read-ahead limit < 0");
        }
        synchronized (lock) {
            ensureOpen();
            mark = next;
        }
    }

注: mark的使用并不相当于指针,需要和reset()方法一起使用 --> 和RandoMaccessFile的seek操作不是一个性质


 //重置指针
 public void reset() throws IOException {
      synchronized (lock) {
          ensureOpen();
          next = mark;
      }
  }

注: 将mark标记赋给next,reset()和mark()两个方法配合使用


//跳过流中指定数量的字符  返回跳过的字符数
    public long skip(long ns) throws IOException {
        synchronized (lock) {
            ensureOpen();
            if (next >= length)
                return 0;
            // Bound skip by beginning and end of the source
            long n = Math.min(length - next, ns);
            n = Math.max(-next, n);
            next += n;
            return n;
        }
    }

注: 正数往前跳,负数往后跳

3. 测试代码


//访问字符串 StringReader
    import java.io.IOException;
    import java.io.StringReader;
    
public class StringReader_work {
    public static void StringReader() {
        String str = "今天外面真的冷啊果然应该点外的";
        try {
            //1. 构造方法  传入字符串
            StringReader stringReader = new StringReader(str);
            //2. int read() 读操作,读取一个字符   (将String字符串操作 适配成 Reader字符操作 对外提供服务)
//            int read=stringReader.read();
//            System.out.println((char) read);
            //int read(char cbuf[]) throws IOException   批量读
            char[] chars = new char[3];
            int read1=stringReader.read(chars);
            System.out.println(new String(chars,0,3));
            //int read(char cbuf[], int off, int len)   批量读
//            char[] chars1 = new char[3];
//            int read2=stringReader.read(chars1,0,3);
//            System.out.println(new String(chars1,0,3));
            // boolean ready()  判断数据源是否存在
            stringReader.ready();
            //3. markSupported()  是否支持标记    FileInputStream和FileReader 都不支持
            System.out.println("是否支持标记:"+stringReader.markSupported());
            // void mark(int readAheadLimit) throws IOException  标记
   //TODO: 测试发现并未从标记位置读,依旧是接着原先next所指位置读数据
            stringReader.mark(5);
            char[] chars2=new char[3];
            int read3 = stringReader.read(chars2,0,3);
            System.out.println("mark标记后读三个数:"+new String(chars2,0,3));
            //TODO:mark使用并不相当于指针 --> 和RandomAccessFile的seek操作不是一个性质
            // void reset() throws IOException   重置指针
            // 单独使用 reset() 方法
            stringReader.reset();
            char[] chars3=new char[3];
            int read4 = stringReader.read(chars3,0,3);
            System.out.println("单独使用reset()方法:"+new String(chars3,0,3));
            // mark()方法 与 reset()方法 结合使用
            stringReader.mark(2);
            stringReader.reset();
            char[] chars4=new char[3];
            int read5 = stringReader.read(chars4,0,3);
            System.out.println("mark()与reset()结合使用:"+new String(chars4,0,3));
          
            // long skip(long ns) throws IOException   跳过流中指定数量的字符 返回跳过的字符数
            stringReader.skip(2);     //正数往前跳
//            stringReader.skip(-2);    //负数往后跳
            char[] chars5=new char[3];
            int read6 = stringReader.read(chars5,0,3);
            System.out.println("向前跳两个字符:"+new String(chars5,0,3));
            //关闭流
            stringReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        StringReader();
    }
}

运行结果

读取前三个字符:今天外
是否支持标记:true
mark标记后读三个数:面真的
单独使用reset()方法:面真的
mark()与reset()结合使用:冷啊果
向前跳两个字符:该点外

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Java基础知识之StringReader流的使用

本文链接: https://lsjlt.com/news/159565.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java基础知识之StringReader流的使用
    目录Java StringReader流的使用一、StringReader流定义二、StringReader的实例域三、StringReader流构造函数四、StringReader...
    99+
    2024-04-02
  • Java基础知识之BufferedReader流的使用
    目录一、BufferedReader类概念二、BufferedReader类实例域三、BufferedReader类构造函数四、BufferedReader类API五、Buffere...
    99+
    2024-04-02
  • Java基础知识之CharArrayReader流的使用
    目录Java CharArrayReader流一、CharArrayReader流定义二、CharArrayReader流的构造函数三、CharArrayReader流的实例域四、C...
    99+
    2024-04-02
  • Java基础知识之CharArrayWriter流的使用
    目录Java CharArrayWriter流一、CharArrayWriter流定义二、CharArrayWriter流构造函数三、CharArrayWriter流实例域四、Cha...
    99+
    2024-04-02
  • Java基础知识之ByteArrayInputStream流的使用
    目录Java ByteArrayInputStream流一、ByteArrayInputStream流定义二、ByteArrayInputStream流实例域三、ByteArrayI...
    99+
    2024-04-02
  • java基础知识之FileInputStream流的使用
    目录一、File流概念二、FileInputStream1)FileInputStream概念2)构造方法3)FileInputStream常用API三、三种read方法效率比较一、...
    99+
    2024-04-02
  • Java基础知识之StringWriter流的使用
    目录Java StringWriter流的使用一、StringWriter流定义二、StringWriter流实例域三、StringWriter流构造函数四、StringWriter...
    99+
    2024-04-02
  • Java基础知识之ByteArrayOutputStream流的使用
    目录Java ByteArrayOutputStream流的使用一、ByteArrayOutputStream流定义二、ByteArrayOutputStream流实例域三、Byte...
    99+
    2024-04-02
  • Android 基础知识之 VelocityTracker使用
    VelocityTracker是Android中用于追踪触摸事件速度的工具。它可以用于计算触摸事件的速度和加速度,从而用于实现一些手...
    99+
    2023-09-14
    Android
  • java基础之String知识总结
    目录一、概念二、特点三、三种构造方式:四、字符串常量池一、概念 String代表字符串,java语言中所有双引号的字符串都是String的对象,不管是否是new出来的对象。 二、特点...
    99+
    2024-04-02
  • 浅谈Java基础知识之BigDecimal
    目录一、基本使用二、舍入模式三、注意事项四、异常处理 ArithmeticException异常一、基本使用 使用示例: // 初始化 BigDecimal bd1=new Bi...
    99+
    2024-04-02
  • SAP SD基础知识之流程概览
    SAP SD基础知识之流程概览  销售流程 销售流程从建立客户关系开始,至开出销售发票终止。售前活动Pre-Sales Activities(客户询、报价)--> 销售订单处理sales ord...
    99+
    2023-06-05
  • python之基础知识
    1、变量: 2、字符串:用   “  ” 或 ' ' 标注的。 3、列表:[  ] 4、del 和 pop 的区别: 判断何时使用:当从列表中删除元素后不再使用,则del,若后续还使用则pop() 例: #del name =["lele...
    99+
    2023-01-30
    基础知识 python
  • Java基础知识中ByteArrayOutputStream流的使用方法是什么
    Java基础知识中ByteArrayOutputStream流的使用方法是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java ByteArrayOutputStream...
    99+
    2023-06-22
  • Java基础知识中StringWriter流的使用方法是什么
    本篇文章为大家展示了Java基础知识中StringWriter流的使用方法是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java StringWriter流的使用一、StringWriter流...
    99+
    2023-06-22
  • Java基础知识总结之继承
    目录一、继承的基本概念二、继承的好处和弊端三、继承中变量访问的特点四、super关键字五、继承中构造方法的访问特点六、继承中成员方法的访问特点七、方法重写八、包九、修饰符十、stat...
    99+
    2024-04-02
  • Java基础之引用相关知识总结
    目录一、引用的定义二、问题三、引用的分类四、应用场景五、源码六、总结一、引用的定义 在JDK 1.2以前,Java中的引用定义很传统:如果reference类型的数据存储的数值代表的...
    99+
    2024-04-02
  • Java基础知识精通数组的使用
    目录1.数组2.数组定义格式3.访问数组4.遍历数组前言:本文章正式踏入数组部分,今天来讲一下数组。 1.数组 数组是一组数据结构,用来储存一组相同类型值的集合。 数组就是一个容器。...
    99+
    2024-04-02
  • Java基础知识之I/O流和File类文件操作
    目录♒I/O流原理及流的分类I/O原理I/O流的分类️文件(File)概念✍️常用操作(File类)总结♒I/O流原理及流的分类 I/O原理 I/O是Input和Output的缩写,...
    99+
    2024-04-02
  • Java IO流之StringWriter和StringReader用法分析
    简介 StringWriter和StringReader分别继承自Writer和Reader抽象类,作用就是将字符串String类型适配到StringWriter和StringRea...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作