在不使用绝对路径的情况下使用 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 File
、FileOutputStream
、FileWriter
, 等等).
如果您使用的是过时的 APIs:new BufferedWriter(new OutputStreamWriter(new FileOutputStream(thePath), StandardCharsets.UTF-8)
- 但请注意,除非您添加适当的 try-with-resources,否则这是一个资源泄漏错误。
如果您正在使用 FileWriter
:FileWriter 已损坏,切勿使用此 class。使用其他东西。
如果您要自行转换字符串,则为 str.getBytes(StandardCharsets.UTF_8)
,而不是 str.getBytes()
。
根据我之前提出的问题
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 File
、FileOutputStream
、FileWriter
, 等等).
如果您使用的是过时的 APIs:new BufferedWriter(new OutputStreamWriter(new FileOutputStream(thePath), StandardCharsets.UTF-8)
- 但请注意,除非您添加适当的 try-with-resources,否则这是一个资源泄漏错误。
如果您正在使用 FileWriter
:FileWriter 已损坏,切勿使用此 class。使用其他东西。
如果您要自行转换字符串,则为 str.getBytes(StandardCharsets.UTF_8)
,而不是 str.getBytes()
。