「java有管道」常见的管道流 java
今天给各位分享java有管道的知识,其中也会对常见的管道流 java进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
java 管道流
管道流实际上就是整行的读取和写入,不用每个字节每个字节的读取和写入
读写是两个不同的分支,通常都是分开单独使用的。
可以通过BufferedReader 流的形式进行流缓存,之后通过readLine方法获取到缓存的内容。
BufferedReader bre = null;
try {
String file = "D:/test/test.txt";
bre = new BufferedReader(new FileReader(file));//此时获取到的bre就是整个文件的缓存流
while ((str = bre.readLine())!= null) // 判断最后一行不存在,为空结束循环
{
System.out.println(str);//原样输出读到的内容
};
备注一: 流用完之后必须close掉,如上面的就应该是:bre.close(),否则bre流会一直存在,直到程序运行结束。
可以通过“FileOutputStream”创建文件实例,之后过“OutputStreamWriter”流的形式进行存储,举例:
OutputStreamWriter pw = null;//定义一个流
pw = new OutputStreamWriter(new FileOutputStream(“D:/test.txt”),"GBK");//确认流的输出文件和编码格式,此过程创建了“test.txt”实例
pw.write("我是要写入到记事本文件的内容");//将要写入文件的内容,可以多次write
pw.close();//关闭流
备注二:文件流用完之后必须及时通过close方法关闭,否则会一直处于打开状态,直至程序停止,增加系统负担。
java关于管道流的问题
首先需要明确一点的是管道流本身就不建议在一个线程中使用,这是因为向输出流中写的数据,都会存到输入流内部的一个1024字节大小的数组中,如果写的内容超过这个数组的大小,而且没有被输入流读取的话,输出流所在的线程就会等待,这时,如果是在同一个线程中,该线程就会死锁,这是sun在管道流中明确指明的,不推荐在同一个线程中使用。
至于你说的多个线程通过管道向另外一个线程发送数据,出现部分数据丢失的情况,没有代码不好分析具体原因。
大概看了下你的代码,撇开其他的问题先不管,在你的代码中所有ThrFindIndex中的PipedOutputStream都是connect到同一个PipedInputStream,而每个ThrFindIndex的run方法在运行完以后就会把这个PipedOutputStream进行close(),假设一个情景:第一个ThrFindIndex线程一直在运行,当他运行完了之后,这个PipedOutputStream就会被关闭,所有的管道也就都没用了,这必然会影响到其他使用该管道的线程。so我没有往下在看了,大致原因应该在这里。
java 中的管道流是怎么用的?它与不同的输入输出流的区别在哪里?
在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分别用两个线程传送数据.
java有管道的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于常见的管道流 java、java有管道的信息别忘了在本站进行查找喔。
发布于:2022-12-07,除非注明,否则均为
原创文章,转载请注明出处。