Java Scanner读取文件报错求助:远程整数文件修改流程异常
问题分析与解决方案
你的代码里有几个关键问题导致Scanner读不到文件内容,我逐个给你拆解:
1. 异步执行shell脚本,未等待下载完成
Runtime.getRuntime().exec("/home/ayyuce/Desktop/download.sh")是异步执行的——Java会启动新进程跑脚本,但不会等脚本执行完就继续往下走。这时候下载脚本可能还没把文件下载好,你就已经开始用Scanner读文件了,自然读不到内容。
解决方法:获取exec返回的Process对象,调用waitFor()阻塞当前线程,直到脚本执行完成。
2. 提前用PrintWriter清空了文件
你在读取文件之前就执行了PrintWriter pw = new PrintWriter(f);——这个构造函数会直接覆盖并清空目标文件,哪怕文件之前有内容,到Scanner读取的时候已经是空的了,必然会走到else分支输出Error。
解决方法:先完成文件读取和数值计算,再创建PrintWriter写入新内容。
3. 数值增值的逻辑错误
int increase=num++;是后自增操作,increase的值等于原来的num,并没有实现增值效果。应该用int increase = num + 1;或者int increase = ++num;(前自增)。
4. 资源管理不规范
你现在的代码关闭资源的顺序不合理,且没有处理异常场景,最好用try-with-resources语法自动管理资源,避免资源泄漏。
修正后的代码
import java.io.*; import java.util.*; public class Shell { // 类名首字母大写,符合Java编码规范 public static void main(String[] args) throws IOException, InterruptedException { // 执行下载脚本并等待完成 Process downloadProcess = Runtime.getRuntime().exec("/home/ayyuce/Desktop/download.sh"); downloadProcess.waitFor(); // 阻塞直到下载脚本执行完毕 File f = new File("/home/ayyuce/Desktop/yeni.txt"); int num = 0; // 先读取文件中的整数 try (Scanner s = new Scanner(f)) { // try-with-resources自动关闭Scanner if (s.hasNextInt()) { // 直接判断是否有有效整数,比hasNextLine更精准 num = s.nextInt(); } else { System.out.println("Error: 文件中没有有效的整数"); return; // 读取失败直接退出,避免后续无效操作 } } // 计算增值后的数值 int increase = num + 1; // 写入新数值到文件 try (PrintWriter pw = new PrintWriter(f)) { // try-with-resources自动关闭PrintWriter pw.println(increase); } // 执行上传脚本并等待完成 Process uploadProcess = Runtime.getRuntime().exec("/home/ayyuce/Desktop/upload.sh"); uploadProcess.waitFor(); } }
额外小建议
- 执行shell脚本时,可以读取脚本的输出和错误流(比如
downloadProcess.getInputStream()和getErrorStream()),方便排查脚本执行是否出问题 - 尽量遵循Java编码规范,比如类名首字母大写,代码适当换行缩进,提升可读性
内容的提问来源于stack exchange,提问作者Ayyuce Demirbas
相关产品推荐
相关产品推荐

