【问题标题】:Creating a text file with java without using absolute path使用java创建文本文件而不使用绝对路径
【发布时间】:2021-10-01 17:13:26
【问题描述】:

按照我在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 方法内的代码。

【问题讨论】:

  • 您无法写入资源。它们是只读的。您可以写入文件系统中的文件。将它们从用户的主目录中删除
  • 您需要将您正在运行的代码放入您的问题中。
  • @tgdavies 这段代码导致问题不是程序的其余部分。
  • 正如@rzwitserloot 在他的回答中所说,如果您的问题是文件中写入了哪些字符,那么您为什么认为创建路径的方式是问题所在?
  • @tgdavies 我不知道,我也不确定,但是使用绝对路径一切正常,我想也许是我传递的编码导致了问号,但似乎不是。跨度>

标签: java file jar io absolute-path


【解决方案1】:

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

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

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

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

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

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

给定一个代表文件路径的字符串写入文件:

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

就是你所需要的。这将写为 UTF_8,它可以处理波斯符号(因为如果您不指定编码,文件 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()

【讨论】:

  • 现在我添加了用于写入文件的代码。在添加此方法之前一切正常,是的,我知道您对 user.home 的看法,但对我来说拥有文件似乎更好在用户知道并看到文件的地方创建,这将是 jar 所在的位置。即使现在使用此代码,当我在 eclipse 中运行它时它也可以工作,但为什么 jar 不能那样工作?
  • 正如我所说,不要使用 FileWriter。它坏了。
  • 所以如果问题是因为使用 FileWriter,那么为什么使用绝对路径它可以正常工作?
  • 不是。您在具有不同默认编码的不同平台上运行它。与绝对路径与相对路径无关。 FileWriter 已损坏,因为您无法指定编码(在较新的 java 版本上您可以,但这些具有更好的 java.nio.file API。您为什么不使用它?)
  • 是的,你是对的。我真的很想感谢你。我们讨论得越多,我学到的就越多。我使用FileWriter 的主要原因是使文件可附加。现在我正在使用new BufferedWriter(new OutputStreamWriter(new FileOutputStream(thePath), StandardCharsets.UTF-8),问号消失了,但文件不可附加。我怎样才能解决这个问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
相关资源
最近更新 更多