Convert InputStream to byte array in Java

前端 未结 30 3486
無奈伤痛
無奈伤痛 2020-11-21 12:08

How do I read an entire InputStream into a byte array?

相关标签:
30条回答
  • 2020-11-21 12:38

    Java 8 way (thanks to BufferedReader and Adam Bien)

    private static byte[] readFully(InputStream input) throws IOException {
        try (BufferedReader buffer = new BufferedReader(new InputStreamReader(input))) {
            return buffer.lines().collect(Collectors.joining("\n")).getBytes(<charset_can_be_specified>);
        }
    }
    

    Note that this solution wipes carriage return ('\r') and can be inappropriate.

    0 讨论(0)
  • 2020-11-21 12:39

    Java 9 will give you finally a nice method:

    InputStream in = ...;
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    in.transferTo( bos );
    byte[] bytes = bos.toByteArray();
    
    0 讨论(0)
  • 2020-11-21 12:40

    You can use Apache Commons IO to handle this and similar tasks.

    The IOUtils type has a static method to read an InputStream and return a byte[].

    InputStream is;
    byte[] bytes = IOUtils.toByteArray(is);
    

    Internally this creates a ByteArrayOutputStream and copies the bytes to the output, then calls toByteArray(). It handles large files by copying the bytes in blocks of 4KiB.

    0 讨论(0)
  • 2020-11-21 12:41

    Safe solution (with capability of close streams correctly):

    • Java 9+:

       final byte[] bytes;
       try (inputStream) {
           bytes = inputStream.readAllBytes();
       }
      

    • Java 8:

       public static byte[] readAllBytes(InputStream inputStream) throws IOException {
           final int bufLen = 4 * 0x400; // 4KB
           byte[] buf = new byte[bufLen];
           int readLen;
           IOException exception = null;
      
           try {
               try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
                   while ((readLen = inputStream.read(buf, 0, bufLen)) != -1)
                       outputStream.write(buf, 0, readLen);
      
                   return outputStream.toByteArray();
               }
           } catch (IOException e) {
               exception = e;
               throw e;
           } finally {
               if (exception == null) inputStream.close();
               else try {
                   inputStream.close();
               } catch (IOException e) {
                   exception.addSuppressed(e);
               }
           }
       }
      

    • Kotlin (when Java 9+ isn't accessible):

       @Throws(IOException::class)
       fun InputStream.readAllBytes(): ByteArray {
           val bufLen = 4 * 0x400 // 4KB
           val buf = ByteArray(bufLen)
           var readLen: Int = 0
      
           ByteArrayOutputStream().use { o ->
               this.use { i ->
                   while (i.read(buf, 0, bufLen).also { readLen = it } != -1)
                       o.write(buf, 0, readLen)
               }
      
               return o.toByteArray()
           }
       }
      

      To avoid nested use see here.


    • Scala (when Java 9+ isn't accessible) (By @Joan. Thx):

      def readAllBytes(inputStream: InputStream): Array[Byte] =
        Stream.continually(inputStream.read).takeWhile(_ != -1).map(_.toByte).toArray
      
    0 讨论(0)
  • 2020-11-21 12:41

    The other case to get correct byte array via stream, after send request to server and waiting for the response.

    /**
             * Begin setup TCP connection to PC app
             * to open integrate connection between mobile app and pc app (or mobile app)
             */
            mSocket = new Socket(IP, port);
           // mSocket.setSoTimeout(30000);
    
            DataOutputStream mDos = new DataOutputStream(mSocket.getOutputStream());
    
            String str = "MobileRequest#" + params[0] + "#<EOF>";
    
            mDos.write(str.getBytes());
    
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            /* Since data are accepted as byte, all of them will be collected in the
            following byte array which initialised with accepted data length. */
            DataInputStream mDis = new DataInputStream(mSocket.getInputStream());
            byte[] data = new byte[mDis.available()];
    
            // Collecting data into byte array
            for (int i = 0; i < data.length; i++)
                data[i] = mDis.readByte();
    
            // Converting collected data in byte array into String.
            String RESPONSE = new String(data);
    
    0 讨论(0)
  • 2020-11-21 12:41

    This is my copy-paste version:

    @SuppressWarnings("empty-statement")
    public static byte[] inputStreamToByte(InputStream is) throws IOException {
        if (is == null) {
            return null;
        }
        // Define a size if you have an idea of it.
        ByteArrayOutputStream r = new ByteArrayOutputStream(2048);
        byte[] read = new byte[512]; // Your buffer size.
        for (int i; -1 != (i = is.read(read)); r.write(read, 0, i));
        is.close();
        return r.toByteArray();
    }
    
    0 讨论(0)
提交回复
热议问题