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();
            }
        }
    }
posted @ 2019-12-08 23:12  Mr.落魄书生  阅读(...)  评论(...编辑  收藏