IO_File类使用:字符串流与管道流

/** 
 *  字符串流:以一个字符串为数据源,来构造一个字符流
 *  作用:在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();
        }  
        
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_34342207/article/details/87073971