无法从 Java 中的命名管道读取
Posted
技术标签:
【中文标题】无法从 Java 中的命名管道读取【英文标题】:Not able to read from named pipe in Java 【发布时间】:2010-02-11 18:50:48 【问题描述】:我正在通过调用 mkfifo() 命令使用 JNI 创建一个命名管道。我正在使用模式 = 0666。
然后我尝试使用 Java 写入管道,但在写入管道时卡住了。我被困在下一行,无法越过它。我也没有收到任何错误。
PrintWriter out = new PrintWriter((new BufferedWriter(new FileWriter(pipePath))));
请帮忙。
问候,
-H
PipePeer.java
import java.io.*;*
public class PipePeer
private native int createPipe(String pipeName, int mode);* // --------> native method to call mkfifo(pipeName, mode);
static
System.load("/home/user/workspace/Pipes/libpipe.so");
public static void main(String[] args)
PipePeer p = new PipePeer();
PipeImplement pi = new PipeImplement();
String pipePath = "/home/user/workspace/Pipes/pipeFolderpipe1";
int mode = 0777;
int createResult = p.createPipe(pipePath, mode);
if (createResult == 0)
System.out.println("Named pipe created successfully");
else
System.out.println("Error: couldnot create Named pipe");
String pipeLocation = "/home/user/workspace/Pipes/pipeFolder/pipe1";
pi.writePipe("From Java", pipeLocation);
System.out.println(pi.readPipe(pipeLocation));
PipeImplement.java
import java.io.*;
public class PipeImplement
public BufferedReader in;
public void writePipe(String strWrite, String pipePath)
PrintWriter out = null;
try
//-------------> cannot go past this line <--------------------
out = new PrintWriter((new BufferedWriter(new FileWriter(pipePath))));
catch(IOException e)
System.out.println("error while writing");
e.printStackTrace();
out.println(strWrite);
System.out.println("writen");
out.close();
System.out.println("close");
public String readPipe(String pipePath)
try
in = new BufferedReader(new FileReader(pipePath));
catch (FileNotFoundException e)
e.printStackTrace();
String lineRead = "";
try
lineRead = in.readLine();
catch (IOException e)
e.printStackTrace();
return lineRead;
【问题讨论】:
【参考方案1】:这就是 *nix 上的命名管道的工作方式。你在打开管道时被卡住了。 打开 fifo 进行写入将阻塞,直到有人打开它进行读取。
如果您尝试从同一个线程同步读取/写入管道,您将陷入死锁,您必须切换到 NIO,或者创建一个从 fifo 读取的线程和一个写入它的线程。
【讨论】:
以上是关于无法从 Java 中的命名管道读取的主要内容,如果未能解决你的问题,请参考以下文章