Tag: 管道

使用Stream API组织应用程序管道

据我所知,Stream API旨在应用于集合。 但是我非常喜欢他们的想法,所以当我可以和不应该的时候,我会尝试应用它们。 最初我的应用程序有两个线程通过BlockingQueue通信。 首先会填充新元素。 第二个对它们进行转换并保存在磁盘上。 对我而言,看起来像是一个完美的流机会。 我最终得到的代码是: Stream.generate().flatten().filter().forEach() 我想把几张map放在那里,但事实certificate我必须拖一个额外的字段直到forEach 。 因此,我要么必须创建具有两个字段和模糊名称的无意义的类,要么使用AbstractMap.SimpleEntry来传递两个字段,这对我来说并不是很重要。 无论如何,我改写了我的应用程序,它甚至似乎工作。 但是有一些警告。 因为我有无限的流’事物’无法阻止。 现在我在守护程序线程上启动它,但这不是一个解决方案。 业务逻辑(如连接丢失/发现,这可能不是BL)看起来疏远了。 也许我只需要代理。 另一方面,队列人口有自由懒惰。 一个线程而不是两个(不知道这有多好)。 希望熟悉其他开发人员的模式。 所以我的问题是使用Stream API进行应用程序流组织是否可行? 还有更多的不足之处吗? 如果没有推荐什么是替代品?

使用Java在线程之间管道数据

我正在编写一个模仿电影院的multithreading应用程序。 涉及的每个人都是自己的线程,并发必须完全由信号量完成。 我唯一的问题是如何基本上链接线程,以便他们可以通信(例如通过管道)。 例如: 客户[1]是一个线程,获取一个信号量,让它走向票房。 现在,客户[1]必须告诉Box Office Agent他们想要看电影“X”。 然后BoxOfficeAgent [1]也是一个线程,必须检查以确保电影未满,并要么卖票或告诉客户[1]选择另一部电影。 如何在保持与信号量的并发性的同时来回传递数据? 另外,我可以在java.util.concurrent中使用的唯一类是Semaphore类。

有没有人玩过NIO管道来过滤/拦截System.out?

正如这里建议的那样,我想在选择器循环中做到这一点。 我真正想要的是在我的选择器循环中读取写入系统的内容。 编辑1:我编写了一个完整的解决方案,只是为了找出你不能使用System.setOut重定向GC日志。 它只是直接到FD或其他东西。 显示塞子! 除非我重定向到文件并将此文件传输到我的选择器。 很多工作! 看到这里 。

Java中使用params的高效XSLT管道

这个问题的最佳答案描述了一种在Java中实现高效XSLT管道的技术: Java中的高效XSLT管道(或将结果重定向到源) 不幸的是,虽然Transformer似乎公开了一个用于设置XSLT参数的API,但这似乎没有任何效果。 例如,我有以下代码: Transformer.java import javax.xml.transform.sax.SAXTransformerFactory; import javax.xml.transform.Templates; import javax.xml.transform.sax.TransformerHandler; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import javax.xml.transform.sax.SAXResult; import javax.xml.transform.Transformer; import java.io.File; public class MyTransformer { public static void main(String[] args) throws javax.xml.transform.TransformerConfigurationException, javax.xml.transform.TransformerException{ SAXTransformerFactory stf = (SAXTransformerFactory)TransformerFactory.newInstance(); // These templates objects could be reused and obtained from elsewhere. Templates templates1 = stf.newTemplates(new StreamSource( […]

当我无缘无故地写入水槽时,NIO Pipe抛出“Broken Pipe”! 怎么调试?

我相信我已经做好了一切。 我创建一个管道,将接收器传递给写入器线程,使用OP_READ在我的选择器上注册源,启动我的选择器。 一切正常,但一旦我向水槽写东西,我就会得到一个破损的管道exception。 为什么!!! ??? 这里没有破裂的管道。 我烦了。 我如何调试/了解这里发生的事情? 有没有人有一个简单的管道示例,我可以运行来测试这是否有效。 在接收器上写入的线程和读取它的选择器。 编辑:我几乎遵循这里的建议。 在互联网上很难找到NIO管道的具体例子。 import java.io.*; import java.nio.ByteBuffer; import java.nio.channels.*; import java.util.Iterator; public class SystemOutPipe extends Thread { public static void main(String[] args) { try { SystemOutPipe sop = new SystemOutPipe(); sop.start(); System.out.println(“This message should be redirected to System.err\nNow waiting 5 seconds …”); Thread.sleep(5000L); sop.setStopped(true); sop.join(); } […]

捕获Apache Commons-Exec的大量输出

我正在用Java编写video应用程序,执行ffmpeg并将其输出捕获到标准输出。 我决定使用Apache Commons-Exec而不是Java的Runtime ,因为它似乎更好。 但是,我很难捕获所有输出。 我认为使用管道是可行的方法,因为它是进程间通信的标准方式。 但是,我使用PipedInputStream和PipedOutputStream设置是错误的。 它似乎工作,但仅适用于流的前1042个字节,奇怪的是它恰好是PipedInputStream.PIPE_SIZE的值。 我对使用管道并不感兴趣,但我想避免使用磁盘I / O(如果可能的话),因为数据的速度和数量(分辨率为512×384的1m 20svideo产生690M的管道数据)。 关于处理来自管道的大量数据的最佳解决方案的想法? 我的两个课程的代码如下。 (是的, sleep很糟糕。想一想吗? wait()和notifyAll() ?) WriteFrames.java public class WriteFrames { public static void main(String[] args) { String commandName = “ffmpeg”; CommandLine commandLine = new CommandLine(commandName); File filename = new File(args[0]); String[] options = new String[] { “-i”, filename.getAbsolutePath(), “-an”, “-f”, “yuv4mpegpipe”, “-“}; […]

使用命令行使用Java管道输入

public class ReadInput { public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); String x = null; while( (x = input.readLine()) != null ) { System.out.println(x); } } } 我可以通过输入’java ReadInput <input.txt'从命令行运行此代码,但不能直接输入输入,如'java ReadInput hello'。 当我输入'java ReadInput hello'时,由于某种原因,我似乎陷入无限循环。 它不应该像输入'java ReadInput <input.txt'那样工作,而只是重新打印'hello'吗?

如何在管道输入时让java退出

我有一个java进程打印出很多文本。 有时我只是想看一些文字。 使用普通程序,我可以这样做: $ myprog | head 我只会看到来自myprog的10行输出,它会立即退出。 但是对于java,如果我这样做: $ java MyClass | head 我获得了前10行输出,但java进程在完成所有处理之后才会退出。 这就像java并不关心stdout(System.out)已经消失了,而且头部进程已经死了。 所有其他程序要么像猫一样默默地退出: $ cat /etc/group | head root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4: tty:x:5: disk:x:6: lp:x:7: mail:x:8: news:x:9: 或者退出管道错误/exception,如python: $ python -c ‘while True: print “hi”‘ | head hi hi hi hi hi hi hi hi hi hi Traceback (most recent […]

如何使用bash将输入传递给Java程序

我的Java程序正在监听标准输入: InputStreamReader isReader = new InputStreamReader(System.in); BufferedReader bufReader = new BufferedReader(isReader); while(true){ try { String inputStr = null; if((inputStr=bufReader.readLine()) != null) { … } else { System.out.println(“inputStr is null”); } } catch (Exception e) { … } } 现在,我想从bash管道输入到这个程序。 我尝试了以下方法: echo “hi” | java -classpath ../src test.TestProgram 但它只是打印inputStr is null无限次inputStr is null 。 我究竟做错了什么? 编辑1:更新了问题以包含更多代码/上下文。 […]

如何将Process的输入/输出流复制到系统对应的流程?

这是对这个问题的跟进。 答案表明存在 将Process out,err和输入流复制到System版本 使用IOUtils.copy如下(修复各种编译错误后): import org.apache.commons.io.IOUtils; import java.io.IOException; public class Test { public static void main(String[] args) throws IOException, InterruptedException { final Process process = Runtime.getRuntime().exec(“/bin/sh -i”); new Thread(new Runnable() {public void run() { try { IOUtils.copy(process.getInputStream(), System.out); } catch (IOException e) {} } } ).start(); new Thread(new Runnable() {public void run() { try […]