无法打开作为参数传递给 jar 的文件

问题描述 投票:0回答:1

如果我在 IDE 中运行我的项目,它工作正常:

EXISTS c:\testvideos\[video] ролик\video.mp4

但是如果我在 Windows 控制台中运行它,我会收到错误:

NOT exists c:\testvideos\[video] ?????\video.mp

我尝试过:

  • 设置 chcp 65001
  • 添加参数 -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8
  • 在应用程序内尝试不同的编码:
    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"

如果我从批处理文件中启动它,回声会正确显示路径,没有问号符号而不是西里尔文“???????”

如果文件名连续包含两个或多个空格符号“”,也会失败。 有什么解决办法吗?

java file jar arguments codepages
1个回答
0
投票

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> 
© www.soinside.com 2019 - 2024. All rights reserved.