如果我在 IDE 中运行我的项目,它工作正常:
EXISTS c:\testvideos\[video] ролик\video.mp4
但是如果我在 Windows 控制台中运行它,我会收到错误:
NOT exists c:\testvideos\[video] ?????\video.mp
我尝试过:
NOT exists c:\testvideos\[video] ?????\video.mp4 NOT exists c:\testvideos\[video] ?????\video.mp4 NOT exists c:\testvideos\[video] ?????\video.mp4 NOT exists c:\testvideos\[video] ?????\video.mp4
这是测试代码:
import java.io.File;
import java.nio.charset.StandardCharsets;
public class TestFileArgument {
public static void main(String[] args) {
String fileName = args[0];
// String fileName = "c:\\testvideos\\[video] ролик\\video.mp4";
try {
checkFileExists(fileName);
checkFileExists(new String(fileName.getBytes("UTF-8"), "windows-1251"));
checkFileExists(new String(fileName.getBytes("windows-1251"), "UTF-8"));
checkFileExists(new String(fileName.getBytes("UTF-8"), StandardCharsets.ISO_8859_1.displayName()));
} catch (Exception e) {
e.printStackTrace();
}
}
public static void checkFileExists(String fileName) {
if (new File(fileName).exists()) {
System.out.println("EXISTS " + fileName);
} else {
System.out.println("NOT exists " + fileName);
}
}
}
这是控制台启动字符串:
c:\Users\Ariloum\.jdks\openjdk-21\bin\java.exe -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -jar c:\testvideos\testFileArguments.jar "c:\testvideos\[video] ролик\video.mp4"
如果我从批处理文件中启动它,回声会正确显示路径,没有问号符号而不是西里尔文“???????”
如果文件名连续包含两个或多个空格符号“”,也会失败。 有什么解决办法吗?
Powershell 是你的朋友:
PS C:\Users\goose> [Console]::InputEncoding = [Console]::OutputEncoding = New-Object System.Text.UTF8Encoding
PS C:\Users\goose> Get-Content -Encoding UTF8 .\TestFileArgument.java
import java.nio.file.Files;
import java.nio.file.Path;
public class TestFileArgument {
public static void main(String[] args) {
String fileName = "[video] ролик/video.mp4";
System.out.println(Path.of(fileName));
System.out.println(Files.exists(Path.of(fileName)));
}
}
PS C:\Users\goose> javac -encoding UTF-8 TestFileArgument.java
PS C:\Users\goose> java TestFileArgument
[video] ролик\video.mp4
true
PS C:\Users\goose>