5

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

但是有两个问题:

  1. 弄清楚每个平台的有效或无效是一件很痛苦的事情。
  2. 我基于平台的默认文件系统做出假设,但当然 OSX 系统可能正在写入非 mac 文件系统,如 FAT32,在这种情况下,这些检查将无效。

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

4

3 回答 3

5

根据您的预期结果(更正的字符串?无效的字符位置?异常?),这应该让您了解可以做什么:

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

我希望它有所帮助。

于 2012-12-05T09:59:42.893 回答
2

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

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

于 2012-11-30T15:48:08.880 回答
1

我想你应该看看Path.getPath

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

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

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

于 2012-10-09T17:07:17.707 回答