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

Posted

技术标签:

【中文标题】如何在 Java 1.7 中将文件路径转换为有效的文件路径【英文标题】:How to convert a filepath to valid file path in Java 1.7 【发布时间】:2012-09-30 01:42:17 【问题描述】:

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

但是有两个问题:

    很难确定每个平台的有效或无效。 我基于平台的默认文件系统做出假设,但当然,OSX 系统可能正在写入非 mac 文件系统,例如 FAT32,在这种情况下,这些检查将无效。

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

【问题讨论】:

【参考方案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);
        
    

希望对你有帮助。

【讨论】:

@NoBugs 确实你不知道。事实上,这是一个很好的例子,说明了为什么您应该遵循 Java 约定并以 CamelCase 命名您的类,因为乍一看,您似乎有一个名为 test 的实例变量,而不是调用静态方法。 谢谢。不需要errorIndex - 1 处的-1【参考方案2】:

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

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

【讨论】:

【参考方案3】:

我想你应该看看Path.getPath

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

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

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

【讨论】:

但这是否修复了无效字符,我认为如果输入无效,它只会引发 InvalidPathException。不幸的是,我目前只能访问 OSX 机器,虽然我认为像 >,

以上是关于如何在 Java 1.7 中将文件路径转换为有效的文件路径的主要内容,如果未能解决你的问题,请参考以下文章

如何在NetSuite中将一个Freemarker模板转换为另一个模板?

如何在批处理文件中将 DOS 路径转换为文件方案 URI

如何在 ASP.NET 中将文件路径转换为 ​​URL

如何在Python中将用户输入转换为文件路径

如何在Java中将浮点数组转换为双精度数组?

如何在asp.net web api中将图像路径转换为http url?