Mega Code Archive

 
Categories / Java / File Input Output
 

InputStream to String and Byte array

/*  * Copyright WizTools.org  * Licensed under the Apache License, Version 2.0:  * http://www.apache.org/licenses/LICENSE-2.0  */ //package org.wiztools.commons; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; import java.nio.channels.WritableByteChannel; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.charset.MalformedInputException; import java.util.logging.Level; import java.util.logging.Logger; /**  * Common operations on java.io.Stream objects.  * @author subwiz  */ public final class StreamUtil {     private static final Logger LOG = Logger.getLogger(StreamUtil.class.getName());     private StreamUtil(){}     private static CharBuffer decodeHelper(byte[] byteArray, int numberOfBytes, java.nio.charset.Charset charset) throws IOException {         CharsetDecoder decoder = charset.newDecoder();         CharBuffer charBuffer = null;         try {             charBuffer = decoder.decode(ByteBuffer.wrap(byteArray, 0,                     numberOfBytes));         } catch (MalformedInputException ex) {             charBuffer = null;         }         return charBuffer;     }     /**      * Reads the stream and generates a String content using the charset specified.      * Stream will be closed at the end of the operation.      * @param in InputStream as the input.      * @param charset The charset to use to create the String object.      * @return The output String.      * @throws IOException      */     public static String inputStream2String(final InputStream is,             final Charset charset) throws IOException {         try{             StringBuilder out = new StringBuilder();             byte[] b = new byte[4096];             byte[] savedBytes = new byte[1];             boolean hasSavedBytes = false;             CharsetDecoder decoder = charset.newDecoder();             for (int n; (n = is.read(b)) != -1;) {                 if (hasSavedBytes) {                     byte[] bTmp = new byte[savedBytes.length + b.length];                     System.arraycopy(savedBytes, 0, bTmp, 0,                             savedBytes.length);                     System.arraycopy(b, 0, bTmp, savedBytes.length, b.length);                     b = bTmp;                     hasSavedBytes = false;                     n = n + savedBytes.length;                 }                 CharBuffer charBuffer = decodeHelper(b, n, charset);                 if (charBuffer == null) {                     int nrOfChars = 0;                     while (charBuffer == null) {                         nrOfChars++;                         charBuffer = decodeHelper(b, n - nrOfChars, charset);                         if (nrOfChars > 10 && nrOfChars < n) {                             try {                                 charBuffer = decoder.decode(ByteBuffer.wrap(b,                                         0, n));                             } catch (MalformedInputException ex) {                                 throw new IOException(                                         "File not in supported encoding (" +                                         charset.displayName() + ")", ex);                             }                         }                     }                     savedBytes = new byte[nrOfChars];                     hasSavedBytes = true;                     for (int i = 0; i < nrOfChars; i++) {                         savedBytes[i] = b[n - nrOfChars + i];                     }                 }                 charBuffer.rewind(); // Bring the buffer's pointer to 0                 out.append(charBuffer.toString());             }             if (hasSavedBytes) {                 try {                     CharBuffer charBuffer = decoder.decode(ByteBuffer.wrap(savedBytes, 0, savedBytes.length));                 } catch (MalformedInputException ex) {                     throw new IOException(                             "File not in supported encoding (" + charset.displayName() + ")",                             ex);                 }             }             return out.toString();         }         finally{             if(is != null){                 is.close();             }         }     }     /**      * Reads the InputStream and creates a byte[] of the content. The stream      * will be closed at the end of operation.      * @param is The input InputStream.      * @return The byte[] of the content read.      * @throws IOException      */     public static byte[] inputStream2Bytes(final InputStream is) throws IOException{         try{             ByteArrayOutputStream baos = new ByteArrayOutputStream();             byte[] buf = new byte[1024*8];             int len = -1;             while((len = is.read(buf))!=-1){                 baos.write(buf, 0, len);             }             return baos.toByteArray(); // baos doesn't need close!         }         finally{             is.close();         }     }     /**      * Copies the content read from InputStream to OutputStream. Uses the NIO Channels to copy.      * @param is The InputStream that is read.      * @param os The OutputStream where the data is written.      * @throws IOException      */     public static void copy(final InputStream is, final OutputStream os) throws IOException {         final ReadableByteChannel inChannel = Channels.newChannel(is);         final WritableByteChannel outChannel = Channels.newChannel(os);         try{             final ByteBuffer buffer = ByteBuffer.allocate(65536);             while(true) {                 int bytesRead = inChannel.read(buffer);                 if(bytesRead == -1) break;                 buffer.flip();                 while(buffer.hasRemaining()) outChannel.write(buffer);                 buffer.clear();             }         }         finally {             try{inChannel.close();}catch(IOException ex){LOG.log(Level.SEVERE, null, ex);}             try{outChannel.close();}catch(IOException ex){LOG.log(Level.SEVERE, null, ex);}         }     } }