当前位置: 首页 > 面试题库 >

ProcessBuilder不会停止

蔺沛
2023-03-14
问题内容

我正在尝试使用Linux下的ProcessBuilder类将mp3文件解码为wav文件。由于某些原因,该过程不会停止,因此我必须手动取消它。

有人可以给我一个提示。我认为引用的代码很容易重现:

import java.io.*;

public class Test {
 public static void main(String[] args) {
     try {
         Process lameProcess = new ProcessBuilder("lame", "--decode", "test.mp3", "-").start();
         InputStream is = lameProcess.getInputStream();
         FileOutputStream fileOutput = new FileOutputStream("test.wav");
         DataOutputStream dataOutput = new DataOutputStream(fileOutput);


         byte[] buf = new byte[32 * 1024];
         int nRead = 0;
         int counter = 0;
         while((nRead = is.read(buf)) != -1) {
             dataOutput.write(buf, 0, buf.length);
         }

         is.close();
         fileOutput.close();

     }
     catch (Exception e) {
         e.printStackTrace();
     }
 }
}

jstack的输出

"main" prio=10 tid=0x0000000002588800 nid=0x247a runnable [0x00007f17e2761000]
   java.lang.Thread.State: RUNNABLE
    at java.io.FileInputStream.readBytes(Native Method)
    at java.io.FileInputStream.read(FileInputStream.java:236)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:275)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
    - locked <0x00000000eb5b1660> (a java.io.BufferedInputStream)
    at java.io.FilterInputStream.read(FilterInputStream.java:107)
    at Test.main(Test.java:17)

问题答案:

您需要清空进程的输出(通过getInputStream())和错误(通过getErrorStream())流,否则可能会阻塞。

引用过程文档:

由于某些本机平台仅为标准输入和输出流提供有限的缓冲区大小,因此未能及时写入子流程的输入流或读取子流程的输出流可能导致子流程阻塞,甚至死锁。

(适用于错误流和输出流)

您可能需要在不同的线程中耗尽每个流,因为每个流在没有数据时可能会阻塞。



 类似资料:
  • 问题内容: 我有一个Java应用程序,用于准备操作系统命令并给我一个对象。(实际的os命令是使用cygwin在ssh上进行rsync的)。 这在Windows中运行良好,但是,如果我想停止使用它的进程将不会杀死子ssh和rsync进程……..我必须使用Windows任务管理器手动将其杀死。 是否有可能在我打电话之前以某种方式获取该进程的信息并发送ctrl-c ? 如果有人对解决方法有任何想法,那就

  • 我试图从网页生成pdf,通过Centos OS上的java ProcessBuilder调用wkhtmltopdf。问题是,当我用一个main方法运行一个简单类时,进程终止于: 并创建一个空pdf文件(大小为0B) 我包含了一个方法,该方法打印我在类中调用wkhtmltopdf的参数,当我复制命令并在bash中运行它时,它工作并创建pdf。更重要的是:当我在windows中运行完全相同的类时,它运

  • 问题内容: 我可以使用成功启动,文档中提到可以正常退出应用程序hit ctrl-c。 Maven进程确实终止了,但是Tomcat仍在运行,我仍然可以访问该网页。当我再次尝试启动spring-boot时,由于端口正在使用中,因此无法启动Tomcat。 要继续,我必须手动终止正在运行的进程。这是一个错误还是我错过了什么? 问题答案: 我仍然在Windows 7上运行的1.1.9版本上碰巧。 因此,在按

  • 问题内容: 当我运行以下代码时,它停下来让我输入服务器名和它们的端口号,此后应该停下来让我输入用户名,但它永远不会暂停scan.nextline()并直飞输入接收者名称? 问题答案: 代替,我将再次使用,然后解析输入。如果得到,则可以向用户咆哮说输入已被插入。 之所以需要这样做,是因为serverPort输入的末尾还有换行符。使用时,扫描器将获取所有下一个令牌并将其转换为。Integer令牌之后的

  • 我想从ftp服务器上读取文件,然后将其保存到本地存储库中并从服务器上删除,运行读取文件的作业,在DB上找到一条记录,更改一个参数并保存。 Spring集成配置: Spring批处理配置: 我会很高兴得到任何帮助。

  • 要继续,我必须手动终止正在运行的进程。这是一个窃听器还是我遗漏了什么?