在Java 语言中 提供了各种各样的输入输出流(stream) 使我们能够很方便的对
数据进行 *** 作 其中
管道(pipe)流是一种特殊的流 用于在不同
线程(threads)间直接传送数据 一个线程发送数据到输出管道 另一个线程从输入管道中读数据 通过使用管道 实现不同线程间的通讯 无需求助于类似临时文件之类的东西 本文在简要介绍管道的基本概念后 将以一个具体的实例pipeapp加以详细说明 .管道的创建与使用Java提供了两个特殊的专门的类专门用于处理管道 它们就是pipedinputstream类和pipeoutputstream类 Pipedinputstream代表了数据在管道中的输出端 也就是线程向管道读数据的一端 pipeoutputstream代表了数据在管道中的输入端 也就是线程向管道写数据的一端 这两个类一起使用可以提供数据的管道流 为了创建一个管道流 我们必须首先创建一个pipeoutstream对象 然后 创建pipeinputstream对象 实例如下 pipeout= new pipedyoutstream()pipein= new pipedputsteam(pipepout)一旦创建了一个管道后 就可以象 *** 作文件一样对管道进行数据的读写 .演示程序 pipeapp应用程序由三个程序组成 主线程(pipeapp Java)及由主线程启动的两个二级线程(ythread Java和zthread Java) 它们使用管道来处理数据 程序从一个内容为一行一行 x 字母的 input txt 文件中读取数据 使用管道传输数据 第一次是利用线程ythread将数据 x 转换为 y 最后利用线程zthread将 y 转换为 z 之后 程序在屏幕上显示修改后的数据 主线程 (pipeapp Java)在main()方法中 程序首先创建一个应用对象 pipeapp pipeapp=new pipeapp()由于程序中流 *** 作都需要使用IOException异常处理 所以设置了一个try块 在try中 为了从源文件中读取数据 程序为 input txt 文件创建了一个输入流Xfileln :fileinputstream xfileln= new fileinputstream( input txt )新的输入流传递给changetoy()方法 让线程ythread能读取该文件 inputstream ylnpipe =pipeapp changetoy(xfileln)changetoy()方法创建将输入数据 x 改变到 y 的线程ythread 并返回该线程的输入管道 inputstream zlnpipe = pipeapp changetoz(ylnpipe)changetoz()方法启动将数据从 y 改变到 z 的线程zehread 主程序将使用从changetoz()返回的输入管道 得到以修改的数据 然后 程序将管道输入流定位到datainputstream对象 使程序能够使用readline()方法读取数据 datainputstream inputstream = new datainputstream(zlnpiepe)创建了输入流以后 程序就可以以行一行的读取数据病显示在屏幕上 String str= inputstream readline()While(str!=null){system out println(str) str=inputstream readline()} 显示完成之后 程序关闭输入流 inputstream close()changetoy()方法 changetoy()方法首先通过传递一个参数inputstream给datainputstream对象来定位资源的输入流 使程序能使用readline()方法从流中读取数据 datainputstream xfileln =new datainutstream(inputstream) 然后 changetoy()创建输出管道和输入管道 pipeoutstream pipeout = new pipeoutputstream()pipeinputstream pipeln = new pipedinputsteam(pipeout)为了能够使用println()方法输出修改的后的文本行到管道 程序将输出管道定位到printstream对象 printstream printstream = new printstream(pipeout)现在 程序可以创建将数据从x改变到y的线程 该线程是ythread类的一个对象 他传递两个参数 输入文件(xfileln)和输出管道(调用printstream) ythread ythread =new thread(xfileln printstream)之后 程序启动线程 changetoz()方法changetoz()方法与changetoy()方法很相似 他从changetoy()返回的输入流开始 datainputstream yfileln= new datainputstream(inputstream)程序创建一个新的管道 pipedoutstream pipeout = new pipedoutputstream()pipedinputstream pipeln = new pipedinputsream(pipeout )该线程通过这个新的管道发出修改后的数据(输入流pipeln )给主程序 源程序如下 ////pipeapp Java pipeapp的主应用程序//import Java io *class pipeapp{public static void main(string[] args){pipeapp pipeapp=new pipeapp()try{fileinputstream xfile =new fileinputstream( input txt )inputstream ylnpipe = pipeapp changetoy(xfileln)inputstream zlnpipe=pipeapp changetoz(ylnpipe)system out println()system out println( here are the results )system out pringln()datainputstream inputstream = nes datainputstream(zlnpipe)string str = inputstream readline()while (str!=null){system out println(str)str=inputstream readline()}inputstream close()}catch(exception e){system out println(e tostring())}}public inputstream changetoy(inputstream inputstream){try{datainputstream pipeout = new datainputsteam(inputstream)pipedoutstream pipeout = new pipedoutputstream()pipedlnsteam pipeln = new pipedlnputstream(pipeout)printstream printstream = new printstream(pipeout)ythread ythread = new ythread(xfileln printstream)ythread start()return pipeln}catch(exeption e){system out println(x tostring())}return null}public inputstream changetoz(inputstream inputsteam){try{datainputstream yfileln = new datainputstream(inputstream)pipeoutputstream pipeln = new pipedinputstream(pipeout )printrstream printstream = new printsteam(pipeout )zthread zthread = new zthread(yfileln printstream )zthread start()return pipeln }catch(exception e){system out println(e tostring())}return null}} Ythread类和Zthread类由于ythread类与zthread类基本一样 在此仅以ythread为例加以说明 Ythread的构造器接收两个参数 输入的文件和第一个管道的输出端 构造器存储这两个参数作为类的数据成员 Ythread(datainputstream xfileln pringstream printstream){this xfileln = xfilelnthis printstream = printstream} 线程通过run()方法来处理数据 首先读取一行数据 确保xstring不为空的情况下循环执行 string xstring = xfileln readline()每读一行数据 完成一次转换string ystring = xstring replace( x y )然后将修改后的数据输出到管道的输出端 prinstream prinrln(ystring)为了确保所有缓冲区的数据完全进入管道的输出端 pringstram flush()循环完成后 线程关闭管道输出流 pringstram close()ythread类的源程序如下 //ythread Java//import Java io *class ythread exteads thread{datainputstream xfilelnpringstream printstreamythread(datainputstream xfileln pringstream printstream){this xfileln = xfilelnthis printstream = printstream}public void run(){try{string xstring = xfileln readline()while(xstring!=null){string ystring= xstring replace( x y )printstream pringln(ystring)printstream flush()xstring= xfileln readline()}printstream close()}catch{ioexception e}{system out println(e tostring())}}} pipeapp应用程序使用microsoft visual j++ 编译 lishixinzhi/Article/program/Java/gj/201311/27508
Java.io包中包括许多类提供许多有关文件的各个方面 *** 作。\x0d\x0a1 输入输出抽象基类InputStream/OutputStream ,实现文件内容 *** 作的基本功能函数read()、 write()、close()、skip()等;一般都是创建出其派生类对象(完成指定的特殊功能)来实现文件读写。在文件读写的编程过程中主要应该注意异常处理的技术。 \x0d\x0a2 FileInputStream/FileOutputStream: \x0d\x0a用于本地文件读写(二进制格式读写并且是顺序读写,读和写要分别创建出不同的文件流对象); \x0d\x0a本地文件读写编程的基本过程为: \x0d\x0a① 生成文件流对象(对文件读 *** 作时应该为FileInputStream类,而文件写应该为FileOutputStream类); \x0d\x0a② 调用FileInputStream或FileOutputStream类中的功能函数如read()、write(int b)等)读写文件内容; \x0d\x0a③ 关闭文件(close())。 \x0d\x0a3 PipedInputStream/PipedOutputStream: \x0d\x0a用于管道输入输出(将一个程序或一个线程的输出结果直接连接到另一个程序或一个线程的输入端口,实现两者数据直接传送。 *** 作时需要连结); \x0d\x0a4管道的连接: \x0d\x0a方法之一是通过构造函数直接将某一个程序的输出作为另一个程序的输入,在定义对象时指明目标管道对象 \x0d\x0aPipedInputStream pInput=new PipedInputStream() \x0d\x0aPipedOutputStream pOutput= new PipedOutputStream(pInput) \x0d\x0a方法之二是利用双方类中的任一个成员函数 connect()相连接 \x0d\x0aPipedInputStream pInput=new PipedInputStream() \x0d\x0aPipedOutputStream pOutput= new PipedOutputStream() \x0d\x0apinput.connect(pOutput) \x0d\x0a5 管道的输入与输出: \x0d\x0a输出管道对象调用write()成员函数输出数据(即向管道的输入端发送数据);而输入管道对象调用read()成员函数可以读起数据(即从输出管道中获得数据)。这主要是借助系统所提供的缓冲机制来实现的。 \x0d\x0a6随机文件读写: \x0d\x0aRandomAccessFile类(它直接继承于Object类而非InputStream/OutputStream类),从而可以实现读写文件中任何位置中的数据(只需要改变文件的读写位置的指针)。 \x0d\x0a随机文件读写编程的基本过程为: \x0d\x0a① 生成流对象并且指明读写类型; \x0d\x0a② 移动读写位置; \x0d\x0a③ 读写文件内容; \x0d\x0a④ 关闭文件。\x0d\x0a\x0d\x0a七里河团队答疑助人,希望我的回答对你有所帮助在Java的IO流中有一种很非凡的流就是管道流类:PipedInputStream PipedOutputStream.这两个类的实例对象必须要通过connect方法连接.
其实看这么一个程序就知道了管道流类的使用方法.
//sender.java
import java.io.*
import java.util.*
public class sender extends Thread
{
PipedOutputStream out = new PipedOutputStream()
public PipedOutputStream getOut()
{
return out
}
public void run()
{
String str = "Hello,receiver ! I`m sender\n"
try
{
out.write(str.getBytes())
out.close()
}
catch(Exception e)
{
e.printStackTrace()
}
}
}
//receiver.java
import java.io.*
import java.util.*
public class receiver extends Thread
{
PipedInputStream in = new PipedInputStream()
public PipedInputStream getIn()
{
return in
}
public void run()
{
byte [] buf = new byte[1024]
try
{
int len = in.read(buf)
System.out.println("the following is from sender:\n"+new String(buf,0,len))
in.close()
}catch(Exception e)
{
e.printStackTrace()
}
}
}
//TestPiped.java
import java.io.*
class TestPiped
{
public static void main(String [] args)
{
sender s = new sender()
receiver r = new receiver()
PipedOutputStream out = s.getOut()
PipedInputStream in = r.getIn()
try
{
in.connect(out)
s.start()
r.start()
}
catch(Exception e)
{
e.printStackTrace()
}
}
}
这个程序的功能是sender发送”Hello,receiver ! I`m sender”给receiver然后receiver接受后显示出来并且在前面加上”the following is from sender”的信息.要注重的就是PipedInputStream和PipedOutputStream分别用两个线程传送数据.
评论列表(0条)