流式URL编码器

时间:2012-06-19 19:56:05

标签: java

在我的Java应用程序中,我正在寻找URLEncoder.encode(String s, String enc)的流式版本。我想使用“application / x-www-form-urlencoded”内容类型流式传输大型HTTP帖子请求。在图书馆或开源项目中是否存在这样的事情?或者有一种简单的方法来实现它吗?

这是一次早期尝试,但是不正确,因为它不处理大于一个字节的UTF代码点:

// Incorrect attempt at creating a URLEncoder OutputStream
private class URLEncoderOutputStream extends FilterOutputStream
{
    public URLEncoderOutputStream(OutputStream out)
    {
        super(out);
    }

    @Override
    public void write(int b) throws IOException
    {
        String s = new String(new byte[] { (byte)b });
        String enc = URLEncoder.encode(s, "UTF-8");
        out.write(enc.getBytes("UTF-8"));
    }
}

2 个答案:

答案 0 :(得分:3)

问题是OutputStreams对字符一无所知,只知道字节。你真正想要的是一个 Writer ,例如

public class URLEncodedWriter extends FilterWriter {
    public void write(int c) {
        out.write(URLEncoder.encode((char)c, "UTF-8"));
    }
    ... // Same for 2 other write() methods
}

答案 1 :(得分:1)

我认为答案是我不应该这样做。根据{{​​3}}:

  

内容类型“application / x-www-form-urlencoded”对于发送大量二进制数据或包含非ASCII字符的文本效率不高。内容类型“multipart / form-data”应该用于提交包含文件,非ASCII数据和二进制数据的表单。

在任何情况下,大多数服务器都会拒绝超过一定长度的HTTP标头。