• Java基础IO类之字符串流(查字符串中的单词数量)与管道流


    一、字符串流

    定义:字符串流(StringReader),以一个字符为数据源,来构造一个字符流。

    作用:在Web开发中,我们经常要从服务器上获取数据,数据返回的格式通常一个字符串(XML、JSON),我们需要把这个字符串构造为一个字符流。然后再用第三方数据解析器来解析数据。

    代码示例:计算一个字符串有多少个单词

    package IODemo;
    
    import java.io.IOException;
    import java.io.StreamTokenizer;
    import java.io.StringReader;
    
    
    /** 
     * 注意 有可能是面试题目
     *
     */
    
    public class StringStreamDemo {
    
        private static void stringReader(){
    
            String str = "good good study day day up";
            StringReader sr = new StringReader(str);
            // 流的标记器(分析这个流里面的内容)  字符值用于查找字符的五个可能属性: 空格 , 字母 , 数字 , 字符串引号和注释字符 。 每个角色都可以有零个或多个这些属性。
            StreamTokenizer st = new StreamTokenizer(sr);
            int count = 0;
            // ttype 在读取后的这个标记类型等于结尾的话就要一直循环读
            while (st.ttype != StreamTokenizer.TT_EOF){
                try {
                    //如果 读了这个流里面的内容的是一个单词的话 就累加
                    if (st.nextToken() == StreamTokenizer.TT_WORD){
                        count++;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("count="+count);
            sr.close();
        }
    
    
    
        public static void main(String[] args) {
    
            stringReader();
        }
    }

    二、管道流 

    管道输入流:

    PipedInputStream:
    • 管道输入流应连接到管道输出流; 管道输入流然后提供写入管道输出流的任何数据字节。
    • 典型地,数据被从一个读PipedInputStream对象由一个线程并且数据被写入到对应的PipedOutputStream通过一些其它线程。
    • 不建议尝试从单个线程使用这两个对象,因为它可能会使线程死锁。
    • 管道输入流包含一个缓冲区,在读取操作中将读取操作与限制内的操作相分离的管道被认为是broken如果正在提供的数据字节到连接的管道输出流中的线程不再存活。

    管道输出流:

    PipedOutputStream:
    • 管道输出流可以连接到管道输入流以创建通信管道。 管道输出流是管道的发送端。
    • 典型地,数据被写入到一个PipedOutputStream由一个线程对象和数据被从连接读取PipedInputStream通过一些其它线程。
    • 不建议尝试从单个线程使用这两个对象,因为它可能会使线程死锁。 管被说成是broken如果从连接读取数据字节的螺纹管道输入流不再存活。

    代码示例:

    package IODemo;
    
    import java.io.IOException;
    import java.io.PipedInputStream;
    import java.io.PipedOutputStream;
    /**
     *
     * 管道输入流应连接到管道输出流; 管道输入流然后提供写入管道输出流的任何数据字节。
     * 典型地,数据被从一个读PipedInputStream对象由一个线程并且数据被写入到对应的PipedOutputStream通过一些其它线程。
     * 不建议尝试从单个线程使用这两个对象,因为它可能会使线程死锁。
     * 管道输入流包含一个缓冲区,在读取操作中将读取操作与限制内的操作相分离。 的管道被认为是broken如果正在提供的数据字节到连接的管道输出流中的线程不再存活。
     */
    public class PipedStreamDemo {
        public static void main(String[] args) {
            PipedInputStream pin = new PipedInputStream();
            PipedOutputStream pout = new PipedOutputStream();
    
            try {
                pin.connect(pout); //将两个管道进行连接  输入流与输出流进行连接
    
            } catch (IOException e) {
                e.printStackTrace();
            }
            Pipwriter pipwriter = new Pipwriter(pout);
            PipReader pipReader = new PipReader(pin);
            new Thread(pipReader).start();  //先启动读的,再启动写的,让读的先在哪里等待
            new Thread(pipwriter).start();
    
        }
    }
    
     class Pipwriter implements Runnable{
        private PipedOutputStream pout = new PipedOutputStream();
    
         public Pipwriter(PipedOutputStream pout) {
             this.pout = pout;
         }
         @Override
            public void run() {
             String str = "我是落魄书生!";
             try {
                 pout.write(str.getBytes());
                 pout.close();
             } catch (IOException e) {
                 e.printStackTrace();
             }
    
         }
        }
    
        class  PipReader implements Runnable{
            private PipedInputStream pin = new PipedInputStream();
    
            public PipReader(PipedInputStream pin) {
                this.pin = pin;
            }
            @Override
            public void run() {
                byte[] bytes = new byte[1024];
                try {
                    int len = pin.read(bytes);  //read 会阻塞  len实际的长度
                    String str = new String(bytes,0,len); // 通过使用平台的默认字符集解码指定的字节子阵列来构造新的 String
                    System.out.println("读到:"+str);
                    pin.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
  • 相关阅读:
    ssm集成--多模块
    ssm项目集成--单模块
    shiro的学习以及shiro集成spring
    RecyclerView的使用。
    RecyclerView 显示不全的问题.
    Android 中使用数据库作为存储,并随机发布的Demo。
    Fragment的两种加载方式。
    gradle生成的eclipse的web项目,在发布后,缺少jar包的情况。
    gradle 4,构建java web程序
    android 下载远程服务器文件。
  • 原文地址:https://www.cnblogs.com/lpss-75074038/p/12008584.html
Copyright © 2020-2023  润新知