Вам необходимо добавить обработчик протокола для «data:», чтобы для него можно было открыть URL / URLConnection.В качестве альтернативы вы можете создать обработчик протокола "resource:" для ресурсов пути к классам.
Вам необходим пакет data
с классом Handler
(фиксированное соглашение об именах!).Это будет фабричный класс для «data:», возвращающего URLConnection.Для этого мы создадим DataConnection.
Установка обработчика протокола может быть выполнена через System.setProperty.Здесь я предоставил Handler.install();
, чтобы сделать это в общем виде.
package test1.data;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;
public class Handler extends URLStreamHandler {
@Override
protected URLConnection openConnection(URL u) throws IOException {
return new DataConnection(u);
}
public static void install() {
String pkgName = Handler.class.getPackage().getName();
String pkg = pkgName.substring(0, pkgName.lastIndexOf('.'));
String protocolHandlers = System.getProperty("java.protocol.handler.pkgs", "");
if (!protocolHandlers.contains(pkg)) {
if (!protocolHandlers.isEmpty()) {
protocolHandlers += "|";
}
protocolHandlers += pkg;
System.setProperty("java.protocol.handler.pkgs", protocolHandlers);
}
}
}
URLConnection дает InputStream байтам:
package test1.data;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import javax.xml.bind.DatatypeConverter;
public class DataConnection extends URLConnection {
public DataConnection(URL u) {
super(u);
}
@Override
public void connect() throws IOException {
connected = true;
}
@Override
public InputStream getInputStream() throws IOException {
String data = url.toString();
data = data.replaceFirst("^.*;base64,", "");
System.out.println("Data: " + data);
byte[] bytes = DatatypeConverter.parseBase64Binary(data);
return new ByteArrayInputStream(bytes);
}
}
Умная вещь здесь - использовать декодирование Base64DatatypeConverter
в стандартной Java SE.
PS
В настоящее время можно использовать Base64.getEncoder().encode(...)
.