resource read getresourceasstream from java io inputstream embedded-resource

java - read - ¿Cómo cargar un recurso classpath a una matriz de byte?



java read file from resources (4)

cómo obtener la ruta de entrada para un recurso de ruta de clases determinado, leer desde la ruta de entrada hasta que llegue al final, pero parece ser un problema muy común, y me pregunto si hay una API que no conozco, o una biblioteca que haría las cosas tan simples como

byte[] data = ResourceUtils.getResourceAsBytes("/assets/myAsset.bin")

o

byte[] data = StreamUtils.readStreamToEnd(myInputStream)

¡por ejemplo!


Comúnmente, los métodos Java aceptarán un InputStream . En esa mayoría de los casos, recomendaría pasar el flujo directamente al método de interés.

Muchos de esos mismos métodos también aceptarán una URL (por ejemplo, obtenida de getResource(String) ). Eso a veces puede ser mejor, ya que una variedad de métodos requerirá un InputStream reposicionable y hay veces en que la secuencia devuelta por getResourceAsStream(String) no será reposicionable.


Echa un vistazo a Apache IOUtils : tiene varios métodos para trabajar con transmisiones


Eche un vistazo a Google guava ByteStreams.toByteArray(INPUTSTREAM) , esto es lo que desea.


Usualmente uso los siguientes dos enfoques para convertir el Resource en una matriz de byte[] .

1 - enfoque

Lo que necesita es primero llamar a getInputStream() en el objeto Resource y luego pasarlo al método convertStreamToByteArray como a continuación ....

InputStream stream = resource.getInputStream(); long size = resource.getFile().lenght(); byte[] byteArr = convertStreamToByteArray(stream, size); public byte[] convertStreamToByteArray(InputStream stream, long size) throws IOException { // check to ensure that file size is not larger than Integer.MAX_VALUE. if (size > Integer.MAX_VALUE) { return new byte[0]; } byte[] buffer = new byte[(int)size]; ByteArrayOutputStream os = new ByteArrayOutputStream(); int line = 0; // read bytes from stream, and store them in buffer while ((line = stream.read(buffer)) != -1) { // Writes bytes from byte array (buffer) into output stream. os.write(buffer, 0, line); } stream.close(); os.flush(); os.close(); return os.toByteArray(); }

2 - enfoque

Como sugirió Konstantin V. Salikhov, puede usar org.apache.commons.io.IOUtils y llamar a su método static IOUtils.toByteArray(stream) y pasarle el objeto InputStream como este ...

byte[] byteArr = IOUtils.toByteArray(stream);

Note - Solo pensé que mencionaría esto debajo del capó toByteArray(...) comprueba para asegurarse de que el tamaño del archivo no sea mayor que Integer.MAX_VALUE , por lo que no tiene que comprobar esto.