在尝试执行 dir 命令时,系统无法找到该命令。这通常是因为 dir 是 Windows 命令提示符(cmd.exe)中的一个内部命令,而不是一个独立的可执行文件。因此,直接通过 Runtime.exec() 方法调用 dir 会失败。
要解决这个问题,可以通过启动 cmd.exe 并传递 /c dir 参数来执行 dir 命令。这样,cmd.exe 会处理 dir 命令并返回结果。
ProcessBuilder 的使用:通过 ProcessBuilder 构建一个进程,指定 cmd.exe 作为命令,并传递 /c 参数和 dir 命令以及目标目录路径。
设置工作目录:使用 processBuilder.directory(new java.io.File(directoryPath)) 设置进程的工作目录,确保 dir 命令在正确的目录下执行。
读取输出:通过 BufferedReader 读取命令的输出并打印到控制台。
处理异常:捕获 IOException 和 InterruptedException 异常,并将它们包装成 RuntimeException 抛出。
设置字符编码:在 InputStreamReader 的构造函数中,传入 "UTF-8" 作为字符编码。这确保了读取的输出使用 UTF-8 编码。
异常处理:将所有可能抛出的异常统一捕获并转换为 RuntimeException 重新抛出,简化了异常处理逻辑。
通过这些修改,应该可以解决输出乱码的问题。如果问题仍然存在,可以尝试使用其他编码(如 GBK)或检查系统默认编码是否正确。
看起来即使设置了字符编码,输出仍然出现乱码。这可能是由于以下几个原因:
系统默认编码问题:Windows 系统的默认编码通常是 GBK 或 GB2312,而不是 UTF-8。
命令行工具的编码设置:PowerShell 或命令提示符的默认编码可能与 Java 程序的编码不匹配。
解决方案
使用 GBK 编码:尝试将字符编码设置为 GBK。
检查命令行工具的编码设置:确保命令行工具的编码设置与 Java 程序一致。
为了确保在 show 方法中如果有其他任务执行时能够等待,可以使用 synchronized 关键字来实现线程同步。这样可以确保在同一时间只有一个线程能够执行 show 方法中的代码。
因为只是给定了压缩后文件生成的所在目录,但是压缩后文件还没有创建,所以会报错,无法创建流
显示压缩成功,但压缩文件中为空
```
// 分块解密
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[MAX_DECRYPT_BLOCK];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
byte[] block = new byte[bytesRead];
System.arraycopy(buffer, 0, block, 0, bytesRead);
byte[] decryptedBlock = cipher.doFinal(block);
out.write(decryptedBlock);
}
// 构建输出文件路径
String outputFilePathWithOriginalName = Paths.get(outputFilePath).resolve(originalFileName).toString();
try (FileOutputStream fos = new FileOutputStream(outputFilePathWithOriginalName)) {
fos.write(out.toByteArray());
}
```
```
// 分块解密
ByteArrayOutputStream out = new ByteArrayOutputStream();
int inputLen = data.length;
int offSet = 0;
byte[] cache;
int i = 0;
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
cache = cipher.doFinal(data, offSet, MAX_DECRYPT_BLOCK);
} else {
cache = cipher.doFinal(data, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_DECRYPT_BLOCK;
}
// 写入目标文件
Files.write(Paths.get(target), out.toByteArray());
out.close();
```
SwingUtilities.invokeLater 的调用没有立即执行,而是被放入了事件队列中等待处理。为了确保进度条能够实时更新,我们可以尝试以下几种方法:
减少 Thread.sleep 的时间间隔:使每个进度更新的间隔更短,从而提高更新频率。
使用 SwingWorker:SwingWorker 是专门用于在后台执行任务并更新 Swing UI 的类,可以更好地处理这种场景。