X-Git-Url: http://git.nikiroo.be/?p=fanfix.git;a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2FIOUtils.java;h=3d252eac126df091a7fa8abf55999d95af6f288f;hp=e9a378c0fd6e279c1568afb848808ab83f9cdf5e;hb=8c227da67c11370980154c61861bcfb9c73881c5;hpb=bb60bd13efae59e804e5d7a5a7590a020835966f diff --git a/src/be/nikiroo/utils/IOUtils.java b/src/be/nikiroo/utils/IOUtils.java index e9a378c..3d252ea 100644 --- a/src/be/nikiroo/utils/IOUtils.java +++ b/src/be/nikiroo/utils/IOUtils.java @@ -1,14 +1,11 @@ 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.FileWriter; import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; @@ -16,6 +13,8 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; +import be.nikiroo.utils.streams.MarkableFileInputStream; + /** * This class offer some utilities based around Streams and Files. * @@ -30,13 +29,15 @@ public class IOUtils { * @param target * the target {@link File} * + * @return the number of bytes written + * * @throws IOException * in case of I/O error */ - public static void write(InputStream in, File target) throws IOException { + public static long write(InputStream in, File target) throws IOException { OutputStream out = new FileOutputStream(target); try { - write(in, out); + return write(in, out); } finally { out.close(); } @@ -50,15 +51,23 @@ public class IOUtils { * @param out * the target {@link OutputStream} * + * @return the number of bytes written + * * @throws IOException * in case of I/O error */ - public static void write(InputStream in, OutputStream out) + public static long write(InputStream in, OutputStream out) throws IOException { - byte buffer[] = new byte[4069]; - for (int len = 0; (len = in.read(buffer)) > 0;) { + long written = 0; + byte buffer[] = new byte[4096]; + int len = in.read(buffer); + while (len > -1) { out.write(buffer, 0, len); + written += len; + len = in.read(buffer); } + + return written; } /** @@ -229,11 +238,11 @@ public class IOUtils { */ public static void writeSmallFile(File file, String content) throws IOException { - FileWriter writerVersion = new FileWriter(file); + FileOutputStream out = new FileOutputStream(file); try { - writerVersion.write(content); + out.write(StringUtils.getBytes(content)); } finally { - writerVersion.close(); + out.close(); } } @@ -269,19 +278,13 @@ public class IOUtils { * 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"); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + try { + write(stream, out); + return out.toString("UTF-8"); + } finally { + out.close(); } - - return builder.toString(); } /** @@ -367,13 +370,30 @@ public class IOUtils { return errorAcc; } + /** + * Open the resource next to the given {@link Class}. + * + * @param location + * the location where to look for the resource + * @param name + * the resource name (only the filename, no path) + * + * @return the opened resource if found, NULL if not + */ + public static InputStream openResource( + @SuppressWarnings("rawtypes") Class location, String name) { + String loc = location.getName().replace(".", "/") + .replaceAll("/[^/]*$", "/"); + return openResource(loc + name); + } + /** * Open the given /-separated resource (from the binary root). * * @param name - * the resource name + * the resource name (the full path, with "/" as separator) * - * @return the opened resource if found, NLL if not + * @return the opened resource if found, NULL if not */ public static InputStream openResource(String name) { ClassLoader loader = IOUtils.class.getClassLoader(); @@ -396,9 +416,6 @@ public class IOUtils { */ public static InputStream forceResetableStream(InputStream in) throws IOException { - MarkableFileInputStream tmpIn = null; - File tmp = null; - boolean resetable = in.markSupported(); if (resetable) { try { @@ -412,19 +429,24 @@ public class IOUtils { return in; } - tmp = File.createTempFile(".tmp-stream", ".tmp"); + final File 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(); + in.close(); + + return new MarkableFileInputStream(tmp) { + @Override + public void close() throws IOException { + try { + super.close(); + } finally { + tmp.delete(); + } } - } finally { - tmp.delete(); - } + }; + } catch (IOException e) { + tmp.delete(); + throw e; } } @@ -441,12 +463,12 @@ public class IOUtils { */ public static byte[] toByteArray(InputStream in) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); - write(in, out); - - byte[] array = out.toByteArray(); - out.close(); - - return array; + try { + write(in, out); + return out.toByteArray(); + } finally { + out.close(); + } } /**