Java内存游戏项目:如何配置跨平台的leaderboard.txt文件路径?
问题解答
关于./resources/leaderboard.txt的可行性
./代表当前工作目录——也就是你运行Java程序时所在的文件夹。如果你的MemoryGame是项目根目录,且你每次都是在这个根目录下启动程序(比如用命令行进入MemoryGame后执行java ...),那么这个相对路径是可行的。但要注意:
- 路径大小写要统一:你的本地绝对路径用了
Resources,代码里写的是resources,Windows系统不区分大小写,但其他系统(如Linux/macOS)会区分,建议全小写保持一致。 - 如果运行程序时的工作目录不是项目根目录(比如在
src文件夹下启动),这个路径就会找不到文件。
更稳妥的方案建议
直接操作resources文件夹里的文件其实不太规范,因为这个文件夹通常用来存放只读静态资源,一旦项目打包成JAR包,里面的文件会被嵌入包内,无法用FileWriter修改。针对排行榜这种需要读写的用户数据,推荐两种方式:
1. 保存到项目根目录的独立数据文件夹
创建一个data文件夹放在MemoryGame根目录下,用相对路径访问:
// 确保data文件夹存在,不存在则创建 File dataDir = new File("./data"); if (!dataDir.exists()) { dataDir.mkdirs(); } // 读写排行榜文件 BufferedWriter scoreWrite = new BufferedWriter(new FileWriter("./data/leaderboard.txt")); BufferedReader scoreRead = new BufferedReader(new FileReader("./data/leaderboard.txt"));
这种方式既保持了相对路径的灵活性,又把用户数据和项目静态资源分开,更符合项目结构规范。
2. 保存到用户主目录
如果希望程序在不同电脑上运行时,数据都能被用户保留,可以把文件存在用户的主目录下:
// 获取用户主目录路径 String userHome = System.getProperty("user.home"); // 创建专属的程序数据文件夹 File gameDir = new File(userHome + "/.memorygame"); if (!gameDir.exists()) { gameDir.mkdirs(); } // 读写文件 String leaderboardPath = gameDir.getAbsolutePath() + "/leaderboard.txt"; BufferedWriter scoreWrite = new BufferedWriter(new FileWriter(leaderboardPath)); BufferedReader scoreRead = new BufferedReader(new FileReader(leaderboardPath));
这种方式不会因为项目位置变动而丢失数据,体验更好。
3. 只读资源的正确读取方式(如果不需要修改)
如果只是读取静态的初始排行榜数据,可以用Java的类路径资源读取方式,这种方式在开发和打包后都能正常工作:
// 从类路径读取资源(resources文件夹下的文件会被放到类路径根目录) InputStream inputStream = getClass().getResourceAsStream("/leaderboard.txt"); BufferedReader scoreRead = new BufferedReader(new InputStreamReader(inputStream));
但这种方式只能读取,无法写入,适合不需要修改的静态资源。
内容的提问来源于stack exchange,提问作者Derek Kwon
相关产品推荐
相关产品推荐

