【问题标题】:Java Path for Specific FileSystem特定文件系统的 Java 路径
【发布时间】:2016-07-04 22:11:16
【问题描述】:

阅读documentation on Path 和其他地方,对我来说很明显,它总是需要运行VM 的文件系统。但是,我想向 Java 说明我想要 Unix 路径。

原因是我通过 Jackson 将路径导出为 JSON,并且在序列化程序中使用 toString() 会为不同的 VM 返回不同的结果。简单来说,即使我在 Windows 机器上开发,我也想得到这个:

{"path":"/tmp"}

我的序列化器如下所示:

public class PathSerializer extends JsonSerializer<Path> {

  @Override
  public void serialize(Path path, JsonGenerator jsonGenerator, SerializerProvider provider) throws IOException, JsonProcessingException {
    jsonGenerator.writeString(path.toString());
  }

}

为了解决这个问题,我当然可以这样做:

public class PathSerializer extends JsonSerializer<Path> {

  @Override
  public void serialize(Path path, JsonGenerator jsonGenerator, SerializerProvider provider) throws IOException, JsonProcessingException {
    jsonGenerator.writeString(path.toString().replace('\\', '/'));
  }

}

但是,这并不独立于文件系统。我的意思是我知道我有什么目标系统,我不想在这里涵盖所有源系统。

我该怎么做?我的意思是最后的手段当然是使用String 而不是Path,但恕我直言,这有点蹩脚。

【问题讨论】:

  • 什么值包含您的path 变量??是这样吗?例如:-foldername\\foldername\\filename
  • @VikrantKashyap 绝对路径。目前 JSON 看起来像 {"path":"\\tmp"}
  • 您的问题有效。如果您的生产系统部署在“linux”上并且用户系统基于windows,那么它将引发错误

标签: java path nio


【解决方案1】:

这适用于所有平台:

@Override
public void serialize(Path path, JsonGenerator jsonGenerator, SerializerProvider provider) throws IOException, JsonProcessingException
{
   jsonGenerator.writeString(path.toString().replace(File.separator, "/"));
}

使用用于处理文件的 Java 库,您可以在所有平台上安全地使用 /(斜杠,而不是反斜杠)。库代码在内部处理将事物转换为特定于平台的路径。话虽如此,无论以后什么操作系统读取路径都能够正确构建它。

【讨论】:

  • 我认为这是最接近“不同文件系统的路径生成器”的方法。
【解决方案2】:

诀窍是在两者之间使用 URI..

// At the begining you have the input parameter with tmp path in it
// so same as:
Path path= new File("/tmp").toPath();
// System.out.println(path.toString()) 
// -> "\tmp" under windows
URI theTmpFolderURI = path.toUri();
// System.out.println(theTmpFolderURI.toString()) 
// -> "file:///C:/tmp" under windows and 
// -> "file://tmp/" under xNIX     

回到一个路径然后是一个文件,结果取决于你得到的windows下的环境

Paths.get(theTmpFolderURI).toFile().getAbsolutePath();
// -> C:\tmp

同:

Paths.get(theTmpFolderURI).toAbsolutePath().toString();
// -> C:\tmp

所以代码会是这样的:

String fromString = Paths.get(path.toUri()).toAbsolutePath().toString(); 
jsonGenerator.writeString(fromString);

生成的 JSON 将是

"C:\\tmp"

【讨论】:

  • 它在哪里摆脱了反斜杠?
  • 对于系统之间的通信总是使用 URI 表示法。这显然是标准的目的:) 在内部(服务器端)代码将自动适应当前环境并在运行时将 URI 转换为特定的文件系统资源标识符。 JSON 中的双反斜杠对于 JSON 是 VALID 是强制性的......
  • 如果您需要将文件系统强制到特定环境,我推荐使用 Apache Commons IO 项目的工具,例如用于 Windows 样式转换的 this method 或用于 unix 的 this other风格。
  • 不,这不是我想要的,我想你误解了这个问题。我不需要完整的 URI,只需要路径,并且在任何地方都不需要任何反斜杠。
  • 看看 Apache Commons IO FilenameUtils。有一些不错的 Unix 窗口和反向对话工具。 commons.apache.org/proper/commons-io/javadocs/api-1.4/org/…
猜你喜欢
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多