使用 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 复制时不支持文件名中的特殊字符的主要内容,如果未能解决你的问题,请参考以下文章