特定文件系统的Java路径

时间:2016-03-18 08:34:42

标签: java path nio

阅读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());
  }

}

要解决Windows问题,我当然可以这样做:

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,但那是蹩脚的恕我直言。

2 个答案:

答案 0 :(得分:1)

诀窍是在两者之间使用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"

答案 1 :(得分:0)

这适用于所有平台:

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

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