使用 URI 复制时不支持文件名中的特殊字符

Posted

技术标签:

【中文标题】使用 URI 复制时不支持文件名中的特殊字符【英文标题】:Special character in filename are not supported while copying using URI 【发布时间】:2013-03-16 14:10:04 【问题描述】:

我需要使用 URI 将文件(文件名包含特殊字符)从一个路径复制到另一个路径。但它会引发错误。如果它成功复制,如果文件名不包含特殊字符。您能否告诉我如何使用 URI 将带有特殊字符的文件名从一条路径复制到另一条路径。我复制了下面的代码和错误。

代码:-

import java.io.*;
import java.net.URI;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;

public class test 
    private static File file = null;
    public static void main(String[] args) throws InterruptedException, Exception 
        String from = "file:///home/guest/input/3.-^%&.txt";
        String to = "file:///home/guest/output/3.-^%&.txt";
        InputStream in = null;
        OutputStream out = null;
        final ReadableByteChannel inputChannel;
        final WritableByteChannel outputChannel;
        if (from.startsWith("file://")) 
            file = new File(new URI(from));
            in = new FileInputStream(file);
        

        if (from.startsWith("file://")) 
            file = new File(new URI(to));
            out = new FileOutputStream(file);
        

        inputChannel = Channels.newChannel(in);
        outputChannel = Channels.newChannel(out);

        test.copy(inputChannel, outputChannel);
        inputChannel.close();
        outputChannel.close();
    

    public static void copy(ReadableByteChannel in, WritableByteChannel out) throws IOException 
        ByteBuffer buffer = ByteBuffer.allocateDirect(32 * 1024);
        while (in.read(buffer) != -1 || buffer.position() > 0) 
        buffer.flip();
        out.write(buffer);
        buffer.compact();
        
  

错误:--

Exception in thread "main" java.net.URISyntaxException: Illegal character in path at index 30: file:///home/maria/input/3.-^%&.txt
    at java.net.URI$Parser.fail(URI.java:2829)
    at java.net.URI$Parser.checkChars(URI.java:3002)
    at java.net.URI$Parser.parseHierarchical(URI.java:3086)
    at java.net.URI$Parser.parse(URI.java:3034)
    at java.net.URI.<init>(URI.java:595)
    at com.tnq.fms.test3.main(test3.java:29)
Java Result: 1

感谢您对此进行调查...

【问题讨论】:

不确定,但您可以尝试对文件名进行编码! 【参考方案1】:

文件名应为%-escaped。例如,实际文件名中的空格在 URI 中变为 %20。如果您使用带有多个参数的构造函数之一,java.net.URI 类可以为您完成:

new URI("file", null, "/home/guest/input/3.-^%&.txt", null);

见HTTP URL Address Encoding in Java。

【讨论】:

感谢它的工作。你能告诉我为什么下面的代码不起作用。 file = new File(new URI(file:///home/maria/input/3.-^%&.txt)) ^% 是特殊字符,需要转义。 ^ 作为%5E% 作为%25。请参阅我引用的***文章。【参考方案2】:

您可以尝试使用java.net.uri。

【讨论】:

以上是关于使用 URI 复制时不支持文件名中的特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

Uri 忽略特殊字符

如何去除文件名中的特殊字符

js上传文件名不能包含特殊字符

php文件字​​符编码、mysql数据库字符编码、特殊字符

URI 中特殊字符处理

URL传参中不能带特殊的字符以及处理方案