X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2FIOUtils.java;h=f857850dea11db8d4185fd21ad226b86380cc034;hb=805005449dacb1e7b825db63836bf100e472ddd0;hp=83dcd502b242fb26d88b611b1d7ff4e7d1a30c17;hpb=b771aed5070864bbcbae286c8de74478f6837618;p=fanfix.git diff --git a/src/be/nikiroo/utils/IOUtils.java b/src/be/nikiroo/utils/IOUtils.java index 83dcd50..f857850 100644 --- a/src/be/nikiroo/utils/IOUtils.java +++ b/src/be/nikiroo/utils/IOUtils.java @@ -1,13 +1,14 @@ package be.nikiroo.utils; import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; -import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.io.OutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -173,19 +174,41 @@ public class IOUtils { * in case of I/O error */ public static String readSmallFile(File file) throws IOException { - BufferedReader reader = new BufferedReader(new FileReader(file)); + InputStream stream = new FileInputStream(file); try { - StringBuilder builder = new StringBuilder(); - for (String line = reader.readLine(); line != null; line = reader - .readLine()) { - builder.append(line); - } - return builder.toString(); + return readSmallStream(stream); } finally { - reader.close(); + stream.close(); } } + /** + * Read the whole {@link InputStream} content into a {@link String}. + * + * @param stream + * the {@link InputStream} + * + * @return the content + * + * @throws IOException + * in case of I/O error + */ + public static String readSmallStream(InputStream stream) throws IOException { + // do NOT close the reader, or the related stream will be closed, too + // reader.close(); + BufferedReader reader = new BufferedReader( + new InputStreamReader(stream)); + + StringBuilder builder = new StringBuilder(); + for (String line = reader.readLine(); line != null; line = reader + .readLine()) { + builder.append(line); + builder.append("\n"); + } + + return builder.toString(); + } + /** * Recursively delete the given {@link File}, which may of course also be a * directory. @@ -224,4 +247,69 @@ public class IOUtils { return loader.getResourceAsStream(name); } + + /** + * Return a resetable {@link InputStream} from this stream, and reset it. + * + * @param in + * the input stream + * @return the resetable stream, which may be the same + * + * @throws IOException + * in case of I/O error + */ + public static InputStream forceResetableStream(InputStream in) + throws IOException { + MarkableFileInputStream tmpIn = null; + File tmp = null; + + boolean resetable = in.markSupported(); + if (resetable) { + try { + in.reset(); + } catch (IOException e) { + resetable = false; + } + } + + if (resetable) { + return in; + } + + tmp = File.createTempFile(".tmp-stream", ".tmp"); + try { + write(in, tmp); + tmpIn = new MarkableFileInputStream(new FileInputStream(tmp)); + return tmpIn; + } finally { + try { + if (tmpIn != null) { + tmpIn.close(); + } + } finally { + tmp.delete(); + } + } + } + + /** + * Convert the {@link InputStream} into a byte array. + * + * @param in + * the input stream + * + * @return the array + * + * @throws IOException + * in case of I/O error + */ + public static byte[] toByteArray(InputStream in) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + write(in, out); + + byte[] array = out.toByteArray(); + out.close(); + + return array; + } }