最近处理奇怪的问题时,犯了个低级错误,浪费了不少时间,甚至都看了 jdk 底层的 c 代码。

下面这段测试代码是在 Windows 环境运行的(Mac和linux换成 /bin/sh,-c 后没有问题),你能发现错误在哪里吗?

@Test
public void test() throws Exception {String fileName = "out.log";File file = new File(fileName);Process process = new ProcessBuilder(getCommands(fileName)).redirectOutput(file).start();if(process.isAlive()) {process.waitFor();}BufferedReader readStderr = new BufferedReader(new InputStreamReader(process.getErrorStream(), "gbk"));String line;while((line = readStderr.readLine()) != null) {System.err.println(line);}readStderr.close();
}public List<String> getCommands(String fileName) {String os = System.getProperty("os.name");if (os.toLowerCase().startsWith("win")) {return Arrays.asList("cmd", "/c", "echo", "hello world", ">", fileName);} else {return Arrays.asList("/bin/sh", "-c", "echo", "hello world", ">", fileName);}
}

Windows环境执行会提示错误 另一个程序正在使用此文件,进程无法访问,错误已经很直接了,但是由于在 Mac 和 Linux 环境没有问题,因此觉得类似的代码在 Windows 上也不存在问题。

debug过程中,修改 getCommands 中的 fileName 时也能成功,有时候修改就不能成功,有时候文件名短的时候能经常性的成功,偶尔会有长文件名的时候也能成功。

错误也很明显了吧?

仍然在迷糊中…

这里新建的文件名,为什么会被占用呢?Windows为什么不把被占用的文件名提示出来?

想看看C代码部分能不能提供有效的信息…

JNIEXPORT jlong JNICALL
Java_java_lang_ProcessImpl_create(JNIEnv *env, jclass ignored,jstring cmd,jstring envBlock,jstring dir,jlongArray stdHandles,jboolean redirectErrorStream)
{jlong ret = 0;if (cmd != NULL && stdHandles != NULL) {const jchar *pcmd = (*env)->GetStringChars(env, cmd, NULL);if (pcmd != NULL) {const jchar *penvBlock = (envBlock != NULL)? (*env)->GetStringChars(env, envBlock, NULL): NULL;if (!(*env)->ExceptionCheck(env)) {const jchar *pdir = (dir != NULL)? (*env)->GetStringChars(env, dir, NULL): NULL;if (!(*env)->ExceptionCheck(env)) {jlong *handles = (*env)->GetLongArrayElements(env, stdHandles, NULL);if (handles != NULL) {ret = processCreate(env,pcmd,penvBlock,pdir,handles,redirectErrorStream);(*env)->ReleaseLongArrayElements(env, stdHandles, handles, 0);}if (pdir != NULL)(*env)->ReleaseStringChars(env, dir, pdir);}if (penvBlock != NULL)(*env)->ReleaseStringChars(env, envBlock, penvBlock);}(*env)->ReleaseStringChars(env, cmd, pcmd);}}return ret;
}

太长了…跳过…

由于代码不是我写的,所以处理过程中,没有仔细的看过完整的 Process 创建过程,有一瞬间,突然看到了问题的关键:

redirectOutput(file)
//和
">", fileName

上面这个方法已经把输出重定向到 file 了,new File(fileName) 时和命令当前执行的路径是一样的,通过 > fileName 时也是重定向到 fileName 中,所以 另一个程序正在使用此文件,进程无法访问,另一个程序竟然就是自己。

将上面两种方式随便去掉哪一个都可以正常运行。

你在看本文的过程中,有没有更早的发现问题呢?

当 Windows 提示你的操作遇到 “另一个程序正在使用此文件,进程无法访问” 时,这个文件大概率就是你操作的文件,如果找不到其他被使用的地方,可能就是你自己重复使用了同一个文件。

Java Process:另一个程序正在使用此文件,进程无法访问相关推荐

  1. [Kafka错误]-----kafka在window下出现另一个程序正在使用此文件,进程无法访问的错误

    目录 前言------对于只想解决这个问题的程序猿们,可以直接跳到"解决" 1.背景 2.问题 3.原因 4.解决(尾部有提供编译好的kafka包下载链接) 4.1kafka补丁版 ...

  2. 另一个程序正在使用此文件 进程无法访问 iis

    大家遇到这个问题可能会很奇怪,实际上,iis提示的消息非常不明确 解决办法:这个问题是网站端口被其它网站占用了,你只需要改一个端口就行. 转载于:https://www.cnblogs.com/mao ...

  3. 另一个程序正在使用此文件,进程无法访问

    原因是因为在操作这个文件的时候,这个文件已经被其他的进程占用了. 很可能是IO没关掉的原因.

  4. android studio 另一个程序正在使用此文件 进程无法访问

    不知道从哪个版本开始,as 总是时不时的提示下面的错误, 一种简单的解决方式: 切换到Terminal 窗口,直接输入gradlew -stop ,再build就可以正常运行了. gradlew -s ...

  5. 【错误记录】Flutter 混合开发报错 ( java.nio.file.FileSystemException: xxx/R.jar: 另一个程序正在使用此文件,进程无法访问。 )

    文章目录 一. 报错信息 二. 解决方案 一. 报错信息 Flutter 混合开发项目 : 在 Android 项目中 , 嵌入了 Flutter 页面 , 不小心运行了下 Flutter 项目 , ...

  6. Android studio 另一个程序正在使用此文件,进程无法访问

    Execution failed for task ':doraemonkit:transformClassesAndResourcesWithPrepareIntermediateJarsForDe ...

  7. 【Jenkins】插件安装报错“另一个程序正在使用此文件,进程无法访问”完美解决

    背景说明: 最近在Jenkins的自动化测试持续集成,因为开发环境的jenkins版本比较旧,自动安装插件会安装最新版的插件,插件和jenkins版本不兼容,导致插件无法正常运行.最后折中选择了一个规 ...

  8. win10 启动kafka报错 另一个程序正在使用此文件,进程无法访问

    welcome to my blog 问题描述: win10启动kafka报错: ERROR Failed to clean up log for __consumer_offsets-39 in d ...

  9. D:\……R.jar: 另一个程序正在使用此文件,进程无法访问。

    Android studio报错D:\--R.jar: 另一个程序正在使用此文件,进程无法访问. 解决办法: 按住Ctrl+Shift+Esc打开任务管理器 进入性能选项卡 点击 打开资源监视器 关联 ...

最新文章

  1. html元素的分类有哪些?
  2. Nacos发布 v0.2 版本,无缝支持 Spring Cloud 微服务生态及高可用集群模式
  3. 有源晶振和无源晶振的输出波形
  4. Spring Boot + JSP 创建web项目
  5. SQL Server 2008 阻止保存要求重新创建表的更改问题
  6. 华为P30系列新配色官宣:9月6日IFA2019上见!
  7. 拓端tecdat|使用OpenCV在Python中进行图像处理
  8. 增强版的RecycleViewAdapter,能够直接使用
  9. 数字图像处理-绪论(下)
  10. 汉字Unicode编码规范
  11. java的数组排序和去重
  12. U盘安装完kali后内存变小的言diao(无图)博客
  13. 在计算机里看不到硬盘的信息,在电脑bios里面检测不到硬盘如何解决?
  14. 7z001怎么解压在安卓手机上面_手机怎么解压zip文件 安卓手机zip文件怎么打开?...
  15. CSDN博客中删除空白代码块
  16. C语言验证哥德巴赫猜想
  17. [20160213]关于ansi语法.txt
  18. 诚之和:李子柒向资本发起“反击战”
  19. 搭建RP-pppoe服务器
  20. 数据中台和ERP是啥关系?不都是信息系统吗? by彭文华

热门文章

  1. 完成AK4191+AK4499EX的DSD1024音乐硬解
  2. host 修改rancher_搭建Rancher
  3. 双层神经网络实现非线性回归——机器学习
  4. php流程图怎么制作,流程图的在线制作方法
  5. pdo连接mysql 注入_使用PDO查询mysql避免SQL注入
  6. 项目实训-收尾工作-组织协调
  7. java怎么调用同包变量,Java并发包中的原子变量操作类
  8. 检测公司可用IP地址-脚本
  9. 科学知识图谱绘制方法、步骤及工具
  10. 【React】React全家桶(四)React脚手架