如何在Java 1.7中将文件路径转换为有效的文件路径

时间:2012-10-09 17:02:15

标签: java filesystems nio nio2

使用Java 1.6 Filepath可以由用户输入,然后我应用各种正则表达式来删除对平台无效的字符(例如'?'在Windows上无效),并检查路径长度以确保我们最终得到在尝试创建文件路径之前,操作系统的有效文件路径。

但有两个问题:

  1. 解决每个平台的有效与否问题。
  2. 我正在根据平台的默认文件系统做出假设,但当然OSX系统可能会写入非mac文件系统,例如FAT32,在这种情况下,这些检查无效。
  3. 所以我希望在Java 7中使用NIO2有更好的方法,但还没有找到解决方案,有吗?

3 个答案:

答案 0 :(得分:4)

根据您的预期结果(更正的字符串?无效的字符位置?例外?),这可以让您了解可以执行的操作:

import java.io.File;
import java.nio.file.InvalidPathException;
public class Test {
    public static final void main(final String[] args) {
        final String current = new File(".").toPath().toAbsolutePath().normalize().toFile().toString();
        Test.correctPath(current);
        Test.correctPath(current + "aValidExpression");
        Test.correctPath(current + "aValidExpression?;:-&é");
        Test.correctPath(current + "aValidExpr//ession?;:-&é");
        Test.correctPath(current + "aValidExpre\\ssion?;:-&é");
    }

    public static final String correctPath(final String path) {
        try {
            final String returnValue = new File(path).toPath().toAbsolutePath().normalize().toFile().toString();
            System.out.println(returnValue);
            return returnValue;
        } catch (final InvalidPathException e) {
            System.err.println(e.getMessage());
            final int errorIndex = e.getIndex();
            final String newPath = path.substring(0, errorIndex - 1) + path.substring(errorIndex + 1);
            return Test.correctPath(newPath);
        }
    }
}

我希望它有所帮助。

答案 1 :(得分:2)

您问题的关键是“删除对平台无效的字符”。各种StringPath转换函数(例如get()resolve())会告诉您 字符串是否有效作为路径,但是不会告诉为什么它无效。无效的一种方法是包含无效字符。另一种方法是将太多的斜线字符组合在一起。无论如何,图书馆不提供任何比这更多的信息;它没有提供任何帮助以任何有助于用户修复输入错误的方式验证用户输入的工具。诚然,这应该是一种标准做法,但这根本不是一种做法。

Upshot:如果你想拥有一个验证库,你必须自己编写这样的验证库。好处:你当然不是唯一有这种问题的人。

答案 2 :(得分:1)

我想你应该看看Path.getPath

public static Path get(String first,
   String... more)

 getPath("/foo","bar","gus")-->/foo/bar/gus
  

将路径字符串或从路径字符串连接时的字符串序列转换为Path。如果more不指定任何元素,则第一个参数的值是要转换的路径字符串。如果more指定一个或多个元素,那么每个非空字符串(包括first)将被视为名称元素序列(请参阅Path)并连接以形成路径字符串。有关字符串如何连接的详细信息是提供程序特定的,但通常它们将使用名称分隔符作为分隔符进行连接。例如,如果名称分隔符为“/”并且调用了getPath(“/ foo”,“bar”,“gus”),则路径字符串“/ foo / bar / gus”将转换为Path。如果first是空字符串且more不包含任何非空字符串,则返回表示空路径的Path。