一、字符串流
定义:字符串流(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
通过一些其它线程。 -
不建议尝试从单个线程使用这两个对象,因为它可能会使线程死锁。
管道输出流:
PipedOutputStream:
-
管道输出流可以连接到管道输入流以创建通信管道。 管道输出流是管道的发送端。
-
典型地,数据被写入到一个
PipedOutputStream
由一个线程对象和数据被从连接读取PipedInputStream
通过一些其它线程。
代码示例:
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(); } } }