在不使用绝对路径的情况下使用 java 创建文本文件

Creating a text file with java without using absolute path

根据我之前提出的问题 我找到了解决方案,但在创建我想编写的文本文件时出现了另一个问题 into.here 我的代码:

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 中的应用程序不会出现此问题,但 运行 罐子会出现此问题。 Note:I 在 pathProvider 方法中找到代码,在某人的问题中。

您粘贴的代码和链接的问题 完全是转移注意力 - 它们与您 运行 遇到的错误没有任何关系。此外,保护域的东西是一个黑客,你之前被告知不要在你的 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, 等等).

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

如果您正在使用 FileWriter:FileWriter 已损坏,切勿使用此 class。使用其他东西。

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