You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌入JRE打包Java游戏后无法读取西里尔文外部文件求助

问题原因与解决方案

你的问题不是JRE的问题,核心原因是文件读取时未明确指定字符编码,导致打包后运行环境的系统默认编码与IDE环境不一致,无法正确解析西里尔文文本。

具体分析

在IntelliJ IDEA中运行时,IDE默认会将项目的文件编码设置为UTF-8(或你手动配置的对应西里尔文编码),此时读取文件如果未指定编码,会自动使用IDE的默认编码,所以能正常解析西里尔文。但打包成可执行文件后,程序会使用Windows系统的默认编码(俄语版Windows通常是Windows-1251,非俄语版可能是CP1252或GBK),与文件实际编码不匹配,导致读取失败或乱码。

解决步骤

1. 明确指定文件读取的编码

修改你读取文本文件的代码,强制使用文件实际的编码(推荐用UTF-8统一编码):

// 示例:读取UTF-8编码的西里尔文文件
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;

List<String> lines = Files.readAllLines(Paths.get("your-file.txt"), StandardCharsets.UTF_8);

如果你的文本文件是用Windows-1251编码保存的,就指定对应编码:

import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;

Charset cyrillicCharset = Charset.forName("Windows-1251");
List<String> lines = Files.readAllLines(Paths.get("your-file.txt"), cyrillicCharset);

2. 确保文本文件编码统一

将所有西里尔文文本文件转换为UTF-8编码(可以用Notepad++、VS Code等工具转换),避免不同文件使用不同编码带来的适配问题。

3. 验证Gradle打包时文件是否被正确包含

确保你的文本文件被Gradle正确复制到打包后的目录中,可在build.gradle中添加processResources配置,强制包含目标文件:

processResources {
    from 'path/to/your/text/files' // 替换为你的文件所在实际目录
    include '**/*.txt' // 匹配所有需要的文本文件
}

4. (可选)设置JVM默认编码

如果不想修改代码,也可以在打包时添加JVM参数,强制程序使用UTF-8编码:
对于你使用的PackageTask,添加参数:

task packageMyApp(type: io.github.fvarrui.javapackager.gradle.PackageTask, dependsOn: build) {        
    mainClass = mainClassName
    bundleJre = true
    generateInstaller = false
    administratorRequired = false
    platform = "windows"
    jvmArgs = ["-Dfile.encoding=UTF-8"] // 新增JVM编码参数
}

如果用jpackage,则通过--java-options参数指定:

jpackage --java-options "-Dfile.encoding=UTF-8" ...其他打包参数

内容的提问来源于stack exchange,提问作者Alexander Gorodilov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:01:15