Почему класс URL Java не распознает определенные протоколы?
URL u= новый URL("telnet://route-server.exodus.net");
Эта строка генерирует:
java.net.MalformedURLException: неизвестный протокол: telnet
И я сталкиваюсь с аналогичными проблемами с другими URL, которые начинаются с "news: //"
Это URL-адреса, извлеченные из ODP, поэтому я не понимаю, почему возникают такие исключения.
5 ответов
вопрос
Ява бросает MalformedURLException
потому что он не мог найти URLStreamHandler
для этого протокола. Проверьте Javadocs конструкторов для деталей.
Резюме:
Так как URL
класс имеет openConnection
метод, класс URL проверяет, чтобы убедиться, что Java знает, как открыть соединение с правильным протоколом. Без URLStreamHandler
для этого протокола Java отказывается создавать URL
чтобы спасти вас от неудачи при попытке позвонить openConnection
,
Решение
Вы, вероятно, должны использовать URI
Класс, если вы не планируете открывать соединение этих протоколов в Java.
Похоже, в вашем приложении нет зарегистрированного обработчика протокола "telnet". Так как класс URL может использоваться для открытия InputStream to URL, для выполнения этой работы необходимо иметь зарегистрированный обработчик протокола, чтобы иметь возможность создавать объект с его использованием.
Для получения дополнительной информации о том, как добавить обработчики, смотрите: http://docs.oracle.com/javase/7/docs/api/java/net/URLStreamHandlerFactory.html
Простой ответ заключается в том, что он распознает только определенные протоколы, а остальная часть бесконечности протоколов не распознается.
Вы получаете эту ошибку, потому что у java нет стандартного обработчика протокола для telnet.
Если URL-адрес изображения начинается с «данных», это означает, что данные изображения встроены в саму HTML-страницу, а не хранятся на удаленном сервере, доступ к которому можно получить через URL-адрес. Поэтому вы не сможете загрузить изображение, используя стандартное HTTP-соединение. Итак, нам помогает механизм base64.
URL-адрес источника изображения: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAWAUNoinFRBWASIUA........AAAAElFTkSuQmCC
Чтобы загрузить изображение, можно использовать приведенный ниже код:
// Get the image source data
String imageData = webElement.getAttribute("src");
// Extract the image data and file extension from the data URL
String[] parts = imageData.split(",");
String mimeType = parts[0].split(":")[1];
String base64Data = parts[1];
String fileExtension = "";
if (mimeType.equals("image/jpeg")) {
fileExtension = ".jpg";
} else if (mimeType.equals("image/png")) {
fileExtension = ".png";
} else if (mimeType.equals("image/gif")) {
fileExtension = ".gif";
} else {
// Unsupported image format
throw new IOException("Unsupported image format");
}
// Set the output file path and stream. Here, we save the image file.
String outputPath = "C:/images/image" + fileExtension;
FileOutputStream outputStream = new FileOutputStream(outputPath);
// Close the output stream
outputStream.close();
Этот код сначала извлекает данные изображения из URL-адреса «данных» и разделяет их на тип MIME и компоненты данных в кодировке Base64. Затем он определяет расширение файла на основе типа MIME и сохраняет изображение в файл на диске после декодирования данных изображения в кодировке Base64. Обратите внимание, что вам нужно будет обрабатывать любые исключения, которые могут возникнуть во время процессов декодирования и файлового ввода-вывода.
Чтобы использовать этот код, вам нужно будет импортировать следующие классы в дополнение к тем, которые я упомянул в своем предыдущем ответе:
import java.io.File;
import java.util.Base64;
Класс java.util.Base64 используется для декодирования данных изображения в кодировке Base64. Класс java.io.File используется для представления выходного файла на диске.
Я надеюсь, что это может помочь кому-то!