【问题标题】:Read file with whitespace in name using Java?使用Java读取名称中带有空格的文件?
【发布时间】:2014-07-12 17:55:43
【问题描述】:

文件的原始名称是1_00100 0042.jpg。我有一个问题:

java.net.URISyntaxException: Illegal character in path at index 49: file:///opt/storage/user-data/attachments/1_00100\ 0042.jpg

你能给我一些解决方案如何使用这个错误的路径获取这个文件吗?我知道 C# 有 Path 类。 Java中有类似的东西吗?

我尝试下一步但没有成功:

private String replaceWhitespace(String str) {
    if (str.contains(" ")) {
        str = str.replace(" ", "%20");
    }
    return str;
}

【问题讨论】:

标签: java path


【解决方案1】:

使用文件,它适用于空格:

String path = "file:///opt/storage/user-data/attachments/1_00100\\ 0042.jpg";
File f = new File(path);

如果您想用 %20 替换空格,请使用正则表达式:

path.replaceAll("\\u0020", "%20");

【讨论】:

  • 这不是你想的那样。例如检查f.getName() 用户输入"file:///opt/storage/user-data/attachments/1_00100\\ 0042.jpg" 的结果。
  • 我不明白你暴露的问题,有什么问题?
  • 您的代码将无法编译,因为 Java 中的 \ 是特殊字符,需要额外的 \ 才能成为文字,因此您需要将其写为 "\\"。关于getName() 的结果会发生奇怪的事情,因为在Java8 中它只会是0042.jpg,而在Java7 中我看到1_00100\ 0042.jpg(例如ideone.com/m2FsuT)。我不知道为什么会有这样的差异。
  • 哦,你的意思是转义,是的,我错过了,对不起,我会编辑它。
【解决方案2】:

我不确定您从哪里获得此路径,但我假设添加空格之前的 \ 以对其进行转义,因此您需要更改方法以在空格之前删除此 \
此外,由于此方法不会影响您的类实例的状态,您可以将其设为 static

private static String replaceWhitespace(String str) {
    if (str.contains("\\ ")) {
        str = str.replace("\\ ", "%20");
    }
    return str;
}

演示:

String file = "file:///opt/storage/user-data/attachments/1_00100\\ 0042.jpg";
file = replaceWhitespace(file);

URI u = new URI(file);
System.out.println(u.getRawPath());
System.out.println(u.getPath());

输出:

/opt/storage/user-data/attachments/1_00100%200042.jpg
/opt/storage/user-data/attachments/1_00100 0042.jpg

【讨论】:

    猜你喜欢
    • 2011-03-09
    • 1970-01-01
    • 2012-02-26
    • 2013-05-25
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多