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

如何在Java 1.7中将文件路径转换为有效的文件路径,java,filesystems,nio,nio2,Java,Filesystems,Nio,Nio2,使用Java 1.6,用户可以输入文件路径,然后我应用各种正则表达式来删除对平台无效的字符(例如“?”在Windows上无效),并检查路径长度,以确保在尝试创建文件路径之前,操作系统的文件路径是有效的 但有两个问题: 确定每个平台的有效性和无效性是一件痛苦的事情 我根据平台的默认文件系统进行假设,但当然OSX系统可能会写入非mac文件系统,如FAT32,在这种情况下,这些检查将无效 所以我希望在Java7中使用NIO2有更好的方法,但还没有找到解决方案,有没有?我想你应该看看 将路径字符串或连接

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

但有两个问题:

  • 确定每个平台的有效性和无效性是一件痛苦的事情
  • 我根据平台的默认文件系统进行假设,但当然OSX系统可能会写入非mac文件系统,如FAT32,在这种情况下,这些检查将无效

  • 所以我希望在Java7中使用NIO2有更好的方法,但还没有找到解决方案,有没有?

    我想你应该看看

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


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


    结果:如果你想拥有这样一个验证库,你必须自己编写这样一个验证库。优点:你肯定不是唯一一个有这样问题的人。

    根据你的预期结果(正确的字符串?无效字符位置?异常?),这应该让你知道可以做什么:

    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);
            }
        }
    }
    

    我希望它能帮上忙。

    但如果这能修复无效字符,我认为如果输入无效,它只会抛出InvalidPathException。不幸的是,我现在只能访问OSX机器,虽然我认为像“>”这样的字符,@NoBugs实际上你没有。事实上,这是一个很好的例子,说明了为什么您应该遵循Java约定,并在CamelCase中命名您的类,因为乍一看,您似乎有一个名为
    test
    的实例变量,而不是调用静态方法。谢谢。不需要
    错误索引-1
    处的
    -1
    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);
            }
        }
    }