微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不使用绝对路径用java创建文本文件

如何解决不使用绝对路径用java创建文本文件

按照我在 How to have my java project to use some files without using their absolute path? 之前提出的问题,我找到了解决方案,但在创建要写入的文本文件时出现了另一个问题。这是我的代码

private String pathProvider() throws Exception {
    //finding the location where the jar file has been located
    String jarPath=URLDecoder.decode(getClass().getProtectionDomain().getCodeSource().getLocation().getPath(),"UTF-8");
    //creating the full and final path
    String completePath=jarPath.substring(0,jarPath.lastIndexOf("/"))+File.separator+"Records.txt";
    
    return completePath;
}

public void writeRecord() {
    
    try(Formatter writer=new Formatter(new FileWriter(new File(pathProvider()),true))) {
        
        writer.format("%s  %s  %s  %s  %s  %s  %s  %s  %n",whichIsChecked(),nameInput.getText(),lastNameInput.getText(),idInput.getText(),fieldOfStudyInput.getText(),date.getSelectedItem().toString(),month.getSelectedItem().toString(),year.getSelectedItem().toString());
        
        successful();
        
    } catch (Exception e) {
        failure();
    }
}

这可以工作并在运行 jar 文件的任何地方创建文本文件,但我的问题是,当信息写入文件时,数字、符号和英文字符会保留下来,但波斯语中的其他字符则是变成了问号。像: ?????第111话????.虽然在 eclipse 中运行应用程序不会出现这个问题,但运行 jar 会出现这个问题。 注意:我在某个人的问题中找到了 pathProvider 方法中的代码

解决方法

您粘贴的代码和链接的问题是完全的红鲱鱼 - 它们与您遇到的错误没有任何关系。此外,保护域的内容是一种黑客行为,之前有人告诉您不要在 jar 文件旁边写入数据文件,这不是操作系统(应该)的工作方式。为此使用 user.home

此方法中没有任何内容可以解释问号 - 返回的字符串有很多问题(见上文),但不会导致输出中出现问号。

文件基本上是字节。字符串基本上是字符。因此,当您编写将字符串写入文件的代码时,某处的某些代码会将字符转换为字节。

确保发生这种情况的地方包含字符集编码。

使用默认为 UTF-8 的新 API(我认为在您之前的一个问题中,我也告诉您这样做)。或者,在编写时指定 UTF-8。请注意,这里使用的 UTF-8 是关于文件名,而不是它的内容(例如,如果您在文件名中放置波斯符号,则与文件内容中的波斯符号无关文件 / 在您要写入的内容中)。

因为你没有粘贴代码,我不能给你具体的细节,因为有数百种方法可以做到这一点,我不知道你用的是哪一种。

写入一个文件,给出一个表示其路径的字符串:

Path p = Paths.get(completePath);
Files.write("Hello,World!",p);

就是你所需要的。这将写入 UTF_8,它可以处理波斯符号(因为如果您不指定编码,Files API 默认为 UTF-8,不像 new FileFileOutputStreamFileWriter 等)。

如果您使用过时的 API:new BufferedWriter(new OutputStreamWriter(new FileOutputStream(thePath),StandardCharsets.UTF-8) - 但请注意,除非您添加适当的 try-with-resources,否则这是一个资源泄漏错误。

如果您使用的是 FileWriter:FileWriter 已损坏,请不要使用此类。用别的东西。

如果您自己转换字符串,则它是 str.getBytes(StandardCharsets.UTF_8),而不是 str.getBytes()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。