阅读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
,但那是蹩脚的恕我直言。
答案 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库,您可以在所有平台上安全地使用/(斜杠,而不是反斜杠)。库代码处理内部将事物转换为特定于平台的路径。无论后来在什么操作系统上读取路径都可以正确地构建它。