FileWriter 未使用 URL 中的协议写入文件

FileWriter not writing to file with protocol in URL

我正在使用下面的代码写入文件。

FileWriter writer = new FileWriter(outputPath);
writer.append(prettyJson);
writer.flush();
writer.close();

我注意到内容没有写入以"file://"开头的文件路径。这有什么具体原因吗?

简单。您必须遵守文档。文档明确规定: https://docs.oracle.com/javase/7/docs/api/java/io/FileWriter.html#FileWriter(java.io.File)

fileName - String The system-dependent filename.

System-dependent 表示:

  • /path/to/file 在 Linux / Mac
  • C:\path\to\file 在 Windows

file://不是文件名,而是URL,在浏览器中最常用。

javadoc 说:

public FileWriter(String fileName) throws IOException

Constructs a FileWriter object given a file name.

因此:当使用 this 接口时,您不能传递 URL 或 URI 或 合法 可以传递的任何内容从 file:// 开始。

换句话说:这按设计工作。此构造函数需要一个简单明了的文件名。

如果您有 URL-like 字符串,请尝试这样的操作:

URL fileURL = new URL("file://C:/whatever.txt");
InputStream is = fileURL.openStream();

或者简单地从您获得的 UIR 创建一个 File 对象。然后将该文件对象传递给略有不同的 FileWriter 构造函数。

如果您尝试使用相对路径,请执行以下操作:

FileWriter fw = new FileWriter("./" + fileName, true);

当Java以String的形式谈论文件名时,文档通常说

The system-dependent filename

因此它需要一个 "everyday" 文件名,例如 filename.ext,或 Windows 上的 c:\some\path\filename.ext 或 [=27 上的 /some/path/filename.ext =](这个实际上对两者都有效,Java 也接受 / 作为 Windows 上的路径分隔符)

对于使用 file:// 协议的文件名,使用 URI 并将其包装成 File:

FileWriter writer = new FileWriter(new File(new URI(outputPath)));