相关疑难解决方法(0)

Process Builder waitFor()问题和打开文件限制

我继承了一些代码:

Process p = new ProcessBuilder("/bin/chmod", "777", path).start();
p.waitFor();
Run Code Online (Sandbox Code Playgroud)

基本上,存在一些古老且高度基于巫术的原因,用于将键/值对作为文件存储在磁盘上.我真的不想进入它.

但是,我留下了一堆IO异常:

Exception :Cannot run program "/bin/chmod": java.io.IOException: error=24, Too many open files
Message: Cannot run program "/bin/chmod": java.io.IOException: error=24, Too many open files
Run Code Online (Sandbox Code Playgroud)

一堆我的意思是在1万亿的领域

我感觉waitFor调用是阻止这些进程等待进程完成它并退出,但我认为chmod在文件实际关闭之前返回结果.有谁知道这是否会导致这些例外?

我的另一个倾向是数千个文件的打开和关闭在java端没有快速发生,并且还有其他事情发生,可能是某种形式的文件缓冲区没有被清除掉正在调用fw.close().

我对java很新,这是一个让我难过的地狱怪异的东西.(很高兴应用程序仍以某种方式运行..吐出一个非常大的日志文件后)

任何人都可以想办法解决这个问题,清除缓冲区或增加文件打开限制,以便jvm可以跟上自己(假设这是问题)

java processbuilder java-io

9
推荐指数
2
解决办法
3万
查看次数

Mac命令中的Java命令Runtime.getRuntime().exec()

我使用的是Mac OS Lion,java版本为1.6.0_26

我正在为Java制作一个小型应用程序,并为用户提供主菜单,因此他可以选择多个选项.

其中之一是使用.pkg安装应用程序

使用这些命令一切正常:

File instFolder = new File(System.getProperty("user.dir") + "/foldername/appInstaller.pkg");
String s = "open "+ instFolder.toString();
Process p = Runtime.getRuntime().exec(s);
Run Code Online (Sandbox Code Playgroud)

然后我意识到当foldername有空格或者我把这个带有所需子文件夹的java文件复制到名为"NO NAME"的USB笔式驱动器(或带空格的某个名称)时会出现问题.

因为s将变成类似:

open/Volumes/NO NAME/foldername/appInstaller.pkg

open/Users/user1/Desktop/folder name/appInstaller.pkg



所以当你运行p进程时,命令将在第一个空格处完成出现在路径

open/Volumes/NO

open/Users/user1/Desktop /文件夹中


为了解决这个问题,我改变了s定义,如下所示:

String s = "open "+ "\"" + instFolder.toString() + "\"";
Run Code Online (Sandbox Code Playgroud)

它停止了正常工作.奇怪的是,如果我复制s值(在创建s变量之后)并将其粘贴到终端中它可以工作:

打开"/ Users/user1/Desktop/folder name/appInstaller.pkg"


但是从Java运行它确实不行.

请问你能帮帮我吗?

谢谢.

java macos runtime.exec

4
推荐指数
1
解决办法
1万
查看次数

p.waitfor()永远等待

我试图使用java程序运行命令,但p.waitfor()函数永远等待.代码有什么问题?

import java.io.*;

public class doscmd
{
  public static void main(String args[]) throws InterruptedException
  {
    try
    {
      Process p=Runtime.getRuntime().exec("cmd /c dir");
      p.waitFor();
      BufferedReader reader=new BufferedReader(new InputStreamReader(p.getInputStream()));
      String line=reader.readLine();
      while(line!=null)
      {
        System.out.println(line);
        line=reader.readLine();
      }
    } 
    catch(IOException e1) {}


    System.out.println("Done");
  }
}
Run Code Online (Sandbox Code Playgroud)

java

3
推荐指数
1
解决办法
2044
查看次数

标签 统计

java ×3

java-io ×1

macos ×1

processbuilder ×1

runtime.exec ×1