Contents
  1. 1. 一.问题由来
    1. 1.1. 1. 环境介绍
    2. 1.2. 2. 问题详情
  2. 2. 二.查询资料
    1. 2.1. 1.历史由来
  3. 3. 三.原因分析
  4. 4. 四.解决方案
    1. 4.1. 1. 继续使用sun.* 包
    2. 4.2. 2. 换用其他包,比如 java.util.Base64包
  5. 5. 参考资料

一.问题由来

问题如题,这种情况在使用android 和 eclipse中都碰到.

1. 环境介绍

android 中使用 import android.util.Base64.*;

eclipse 中使用
import sun.misc.BASE64Encoder;
import sun.misc.BASE64Decoder;

2. 问题详情

使用Base64编码图片为字符串,发送给服务器,服务器收到的字符串是一段一段的,并不没有一次性接受所有的字符串.

二.查询资料

为解决这个问题,我查询了base64的各种资料.

1.历史由来

Java一直缺少BASE64编码API,以至于通常在项目开发中会选用第三方的API实现.

刚开始,sun公司的sun.misc.BASE64Encoder的base64包使用较多,由于是公司内部使用,对外支持不好,时常出现导包错误,现在不推荐使用.

详情参见oracle 公司的公告: Why Developers Should Not Write Programs
That Call ‘sun’ Packages

The sun. packages are not part of the supported, public interface.
A Java program that directly calls into sun.
packages is not guaranteed to work on all Java-compatible platforms. In fact, such a program is not guaranteed to work even in future versions on the same platform.

意思是sun.* 这样的包对java程序的支持不好,会导致程序不能工作.

后来,oracle自己弄了一个base64的包,

import org.apache.commons.codec.binary.Base64;

这个包就没那么多问题,具体使用方法如下:

byte[] encodedBytes = Base64.encodeBase64(“Test”.getBytes());
System.out.println(“encodedBytes “ + new String(encodedBytes));
byte[] decodedBytes = Base64.decodeBase64(encodedBytes);
System.out.println(“decodedBytes “ + new String(decodedBytes));

再后来,Java 8实现了BASE64编解码API,它包含到java.util包,从此 base64 名正言顺.

import java.util.Base64;

具体使用如下:

byte[] encodedBytes = Base64.getEncoder().encode(“Test”.getBytes());
System.out.println(“encodedBytes “ + new String(encodedBytes));
byte[] decodedBytes = Base64.getDecoder().decode(encodedBytes);
System.out.println(“decodedBytes “ + new String(decodedBytes));

关于java 8 中base64 更详细的介绍请查看:
BASE64Java 8实现BASE64编解码

三.原因分析

由于我使用sun. 和 android.util.base64.包,用Base64编码的时候如果出现\n 之类的字符,Java中转义。
当字符串过长(一般超过76)时会自动在中间加一个换行符,字符串最后也会加一个换行符。

而现在使用的java.util.Base64; 没有这个特点.

四.解决方案

对于eclipse,

1. 继续使用sun.* 包

重写base64 编码.

具体实现可参照 重写BASE64Encoder

2. 换用其他包,比如 java.util.Base64包

具体使用方法请查看官网使用文档.

对于android,

将android.util.Base64.encodeToString(input, Base64.DEFAULT)
换成
Android.util.Base64.encodeToString(input, Base64.NO_WRAP);

参考资料

1.Base64 Encoding in Java

2.Base64编码的 换行 转义

3.Java 8实现BASE64编解码

4.重写BASE64Encoder

comments powered by HyperComments
Contents
  1. 1. 一.问题由来
    1. 1.1. 1. 环境介绍
    2. 1.2. 2. 问题详情
  2. 2. 二.查询资料
    1. 2.1. 1.历史由来
  3. 3. 三.原因分析
  4. 4. 四.解决方案
    1. 4.1. 1. 继续使用sun.* 包
    2. 4.2. 2. 换用其他包,比如 java.util.Base64包
  5. 5. 参考资料
Fork me on GitHub