Ответ 1
Вам нужно добавить обработчик протокола для "data:", чтобы для него можно было открыть URL/URLConnection. В качестве альтернативы вы можете создать обработчик протокола "resource:" для ресурсов пути класса.
Вам нужен пакет data
с классом Handler
(соглашение об условном имени!). Это будет класс factory для "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);
}
}
Умная вещь здесь - использовать декодирование Base64 DatatypeConverter
в стандартном Java SE.
P.S.
В настоящее время можно использовать Base64.getEncoder().encode(...)
.