В качестве альтернативы решению, предложенному @rmunge, библиотека ввода-вывода Apache Commons предоставляет класс _ 1_, что может быть очень полезно в вашем случае использования.
Если вы, например, используете Maven, вы можете импортировать библиотеку, включая следующую зависимость в вашем pom.xml
:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.8.0</version>
</dependency>
Затем вы можете использовать IOUtils
следующим образом:
URL url = new URL("http://hobbylesson.com/wp-content/uploads/2015/04/Simple-Acrylic-Painting-Ideas00005.jpg");
try (
InputStream imageInputStream = url.openStream();
ByteArrayOutputStream bOut = new ByteArrayOutputStream()
) {
// You can obtain a byte[] as well if required
// Please, consider write to the actual final OutputStream instead
// of into the intermediate byte array output stream to optimize memory
// consumption
IOUtils.copy(imageInputStream, bOut);
// Create an input stream from the read bytes
ByteArrayInputStream in = new ByteArrayInputStream(bOut.toByteArray());
// ...
} catch (IOException ioe) {
ioe.printStackTrace();
}
Или просто такой подход:
URL url = new URL("http://hobbylesson.com/wp-content/uploads/2015/04/Simple-Acrylic-Painting-Ideas00005.jpg");
byte[] imageBytes = IOUtils.toByteArray(url);
ByteArrayInputStream in = new ByteArrayInputStream(imageBytes);
Для ваших комментариев, если проблема заключается в том, что вы пытаетесь избежать проблем с задержкой в сети, если требование для ByteArrayInputStream
не является строго необходимым, как вы можете видеть в javadocs, возможно, следующий код может быть также полезно:
URL url = new URL("http://hobbylesson.com/wp-content/uploads/2015/04/Simple-Acrylic-Painting-Ideas00005.jpg");
try (InputStream imageInputStream = url.openStream()) {
InputStream in = IOUtils.toBufferedInputStream(imageInputStream);
//...
}
Конечно, вы всегда можете выполнить чтение и запись вручную, используя стандартные механизмы Java InputStream
и OutputStream
:
URL url = new URL("http://hobbylesson.com/wp-content/uploads/2015/04/Simple-Acrylic-Painting-Ideas00005.jpg");
try (
InputStream inputStream = url.openStream();
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
) {
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = bufferedInputStream.read(buffer)) != -1) {
bufferedOutputStream.write(buffer, 0, bytesRead);
}
bufferedOutputStream.flush();
// Create an input stream from the read bytes
ByteArrayInputStream in = new ByteArrayInputStream(outputStream.toByteArray());
// ...
} catch (IOException ioe) {
ioe.printStackTrace();
}
Если вам требуется больше контроля над базовым URL-соединением, вы можете использовать _ 12_ или HttpURLConnection
или многие клиентские библиотеки HTTP, такие как Apache HttpClient или OkHttp, чтобы назвать некоторые из них.
Если вам нужно определить фактический тип изображения, рассмотрите возможность использования Tika или JMimeMagic.
person
jccampanero
schedule
10.05.2021