/**
* 字符串流:以一个字符串为数据源,来构造一个字符流
* 作用:在web开发中,经常要从和服务器上获取数据,数据的返回格式通常是一个字符串(xml,json),我们需要把这个字符串构造成一个字符流
* 然后再用第三方的数据解析器来解析数据。
*/
import java.io.IOException;
import java.io.StreamTokenizer;
import java.io.StringReader;
import java.io.StringWriter;
public class StringStreamDemo {
public static void main(String[] args) {
stringReadr();
stringWriter();
}
public static void stringReadr() {
String info = "good good study day day up";
StringReader sr = new StringReader(info);
//流标记器
StreamTokenizer st = new StreamTokenizer(sr);
int count = 0;
while(st.ttype!=StreamTokenizer.TT_EOF) { //ttype表示流标记器里的某一个类型;TT_EOF表示某一个类型的结束的标记位置
try {
if(st.nextToken()==StreamTokenizer.TT_WORD) { //判断流标记器的下一个类型是否等于流标记器里的单词;TT_WORD表示类型是单词
count++;
}
} catch (IOException e) {
e.printStackTrace();
}
}
sr.close();
System.out.println("count="+count);
}
public static void stringWriter() {
StringWriter sw = new StringWriter();
sw.write("this is StringWriter test...");
String info = sw.toString();
System.out.println(info);
}
}
管道流
管道流:
管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。通常,数据由某个线程从PipedInputStream对象读取,并由其他线程将其写入到相应的PipedOutputStream,不建议对这两个对象尝试使用单个线程,因为
这样可能死锁线程。管道输入流包含一个缓冲区,可在缓冲区限定的范围内将读操作和写操作分离开。如果想连接管道输出流提
供数据字节的线程不再存在,则认为该管道已损坏。
/**
* 管道流:一个线程写入,一个线程读取
* 作用,用于线程之间的数据通讯
*
*/
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
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();
}
ReadThread readTh = new ReadThread(pin);
WriteThread writeTh = new WriteThread(pout);
new Thread(readTh).start(); //启动线程,要先启动读入的线程;
new Thread(writeTh).start(); //再启动写入的线程
}
}
//读取数据的线程
class ReadThread implements Runnable {
private PipedInputStream pin; //输入管道
ReadThread(PipedInputStream pin){
this.pin=pin;
}
public void run() {
byte[] buf = new byte[1024];
int len;
try {
len = pin.read(buf); //read阻塞
String s = new String(buf,0,len);
System.out.println("读到:"+s);
pin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//写入数据的线程
class WriteThread implements Runnable{
private PipedOutputStream pout; //输出管道
WriteThread(PipedOutputStream pout){
this.pout=pout;
}
public void run() {
try {
pout.write("一个美女...".getBytes()); //管道输出流
pout.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}