【问题标题】:Read file with whitespace in its path using Java使用Java读取路径中带有空格的文件
【发布时间】:2012-02-26 01:11:17
【问题描述】:

我正在尝试使用 FileInputStream 打开名称中包含空格的文件。

例如:

String fileName = "This is my file.txt";
String path = "/home/myUsername/folder/";

String filePath = path + filename;
f = new BufferedInputStream(new FileInputStream(filePath));

结果是抛出 FileNotFoundException。 我试图将文件路径硬编码为"/home/myUserName/folder/This\\ is\\ my\\ file.txt",只是为了看看我是否应该转义空格字符,但它似乎不起作用。 对这个问题有什么建议吗?

编辑:只是为了与查看此问题的每个人都在同一页面上...打开名称中没有空格的文件有效,有空格的文件失败。权限不是这里的问题,也不是文件夹分隔符。

【问题讨论】:

标签: java java-io


【解决方案1】:

通常路径中的空格无关紧要。只需确保当您从外部源(如命令行)传递路径时,它的末尾不包含空格:

File file = new File(path.trim());

如果你想有没有空格的路径,你可以把它转换成 URI 然后再回到路径

try {
    URI u = new URI(path.trim().replaceAll("\\u0020", "%20"));
    File file = new File(u.getPath());
} catch (URISyntaxException ex) {
    Exceptions.printStackTrace(ex);
}

【讨论】:

    【解决方案2】:

    不,您不需要转义空格。

    如果代码抛出 FileNotFoundException,则该文件不存在(或者,您可能缺乏访问该文件的必要权限)。

    如果权限没有问题,并且您认为该文件存在,请确保它的名称与您认为的名称相同。特别是,请确保文件名不包含任何不可打印的字符、无意的前导或尾随空格等。为此,ls -b 可能会有所帮助。

    【讨论】:

    • 路径中没有空格的文件没问题,我可以打开它们...所以权限似乎不是问题:(。
    • @user253530:向我们展示ls -l 的输出,其中列出了相关文件。
    • -rw-r--r-- 1 根根 101 2012-02-03 11:16 add.txt -rw-r--r-- 1 根根 13969 2012-02-02 20:23 CASE 1A.txt 每个人都有读取权限...这不是问题...我可以打开 add.txt 但我无法打开 CASE 1A.txt...这是我确定的名称跨度>
    • @user253530:我确信嵌入的空白不是问题。确保文件名不包含任何不可打印的字符、无意的前导或尾随空格等。ls -b 可能会有所帮助。
    【解决方案3】:

    带空格的文件名就可以了

    这是我的代码

    File f = new File("/Windows/F/Programming/Projects/NetBeans/TestApplications/database prop.properties");
            System.out.println(f.exists());
            try
            {
                FileInputStream stream = new FileInputStream(f);
            }
            catch (FileNotFoundException ex)
            {
                System.out.println(ex.getMessage());
            }
    

    f.exists() 返回true 总是没有任何问题

    【讨论】:

    • 感谢您告诉我,在将其发送到 FileInputStream 之前,我首先必须使用 File(path)。
    • @user253530:您是否暗示您的原始代码不起作用,并将filePath 包装成File() 使其起作用?!
    • 是...如果我使用 FileInputStream(String filePath) 它不起作用....但是如果我先执行 File f = new File(filePath) 然后 FileInputStream(f) 不会抛出一个错误……很奇怪……
    • 这没有意义——FileInputStream(String name) 的构造函数只是创建了一个File——代码是等价的。
    【解决方案4】:

    看起来你有问题,而不是文件分隔符而不是文件名中的空格。您是否尝试过使用

    System.getProperty("file.separator")
    

    而不是路径变量中的“/”?

    【讨论】:

    • 不要逃避你的空白,我相信你在 unix/linux 上就像 env。如果它不起作用,那么您正在做其他错误的事情,例如。拼错文件名或其他
    猜你喜欢
    • 2014-07-12
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 2011-03-09
    相关资源
    最近更新 更多