X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2FIOUtils.java;h=5a7e179b684d9423182c048376f2bf014c54077b;hb=8e76f6ab13a8a4a651f2518b6c91d5e6424c7922;hp=bf0686babca9e7addfbbd810a7a8e4d5fd66756d;hpb=59864f77f0b8d5a57f479152a3131093544af6b2;p=nikiroo-utils.git diff --git a/src/be/nikiroo/utils/IOUtils.java b/src/be/nikiroo/utils/IOUtils.java index bf0686b..5a7e179 100644 --- a/src/be/nikiroo/utils/IOUtils.java +++ b/src/be/nikiroo/utils/IOUtils.java @@ -1,22 +1,22 @@ 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; 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. + * This class offer some utilities based around Streams and Files. * * @author niki */ @@ -54,9 +54,11 @@ public class IOUtils { */ public static void write(InputStream in, OutputStream out) throws IOException { - byte buffer[] = new byte[4069]; - for (int len = 0; (len = in.read(buffer)) > 0;) { + byte buffer[] = new byte[4096]; + int len = in.read(buffer); + while (len > 0) { out.write(buffer, 0, len); + len = in.read(buffer); } } @@ -89,8 +91,12 @@ public class IOUtils { } zip.putNextEntry(new ZipEntry(base + "/")); } - for (File file : target.listFiles()) { - zip(zip, base, file, false); + + File[] files = target.listFiles(); + if (files != null) { + for (File file : files) { + zip(zip, base, file, false); + } } } else { if (base == null || base.isEmpty()) { @@ -137,6 +143,58 @@ public class IOUtils { } } + /** + * Unzip the given ZIP file into the target directory. + * + * @param zipFile + * the ZIP file + * @param targetDirectory + * the target directory + * + * @return the number of extracted files (not directories) + * + * @throws IOException + * in case of I/O errors + */ + public static long unzip(File zipFile, File targetDirectory) + throws IOException { + long count = 0; + + if (targetDirectory.exists() && targetDirectory.isFile()) { + throw new IOException("Cannot unzip " + zipFile + " into " + + targetDirectory + ": it is not a directory"); + } + + targetDirectory.mkdir(); + if (!targetDirectory.exists()) { + throw new IOException("Cannot create target directory " + + targetDirectory); + } + + FileInputStream in = new FileInputStream(zipFile); + try { + ZipInputStream zipStream = new ZipInputStream(in); + try { + for (ZipEntry entry = zipStream.getNextEntry(); entry != null; entry = zipStream + .getNextEntry()) { + File file = new File(targetDirectory, entry.getName()); + if (entry.isDirectory()) { + file.mkdirs(); + } else { + IOUtils.write(zipStream, file); + count++; + } + } + } finally { + zipStream.close(); + } + } finally { + in.close(); + } + + return count; + } + /** * Write the {@link String} content to {@link File}. * @@ -156,11 +214,27 @@ public class IOUtils { dir.mkdirs(); } - FileWriter writerVersion = new FileWriter(new File(dir, filename)); + writeSmallFile(new File(dir, filename), content); + } + + /** + * Write the {@link String} content to {@link File}. + * + * @param file + * the {@link File} to write + * @param content + * the content + * + * @throws IOException + * in case of I/O error + */ + public static void writeSmallFile(File file, String content) + throws IOException { + FileOutputStream out = new FileOutputStream(file); try { - writerVersion.write(content); + out.write(content.getBytes("UTF-8")); } finally { - writerVersion.close(); + out.close(); } } @@ -196,19 +270,14 @@ 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 { + // do NOT close, or the related stream will be closed, too + // out.close(); } - - return builder.toString(); } /** @@ -234,13 +303,13 @@ public class IOUtils { throws IOException { List list = deltree(target, null); if (exception && !list.isEmpty()) { - String slist = ""; + StringBuilder slist = new StringBuilder(); for (File file : list) { - slist += "\n" + file.getPath(); + slist.append("\n").append(file.getPath()); } throw new IOException("Cannot delete all the files from: <" // - + target + ">:" + slist); + + target + ">:" + slist.toString()); } return list.isEmpty(); @@ -323,9 +392,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 { @@ -339,19 +405,32 @@ 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(); + + final FileInputStream fis = new FileInputStream(tmp); + return new MarkableFileInputStream(fis) { + @Override + public void close() throws IOException { + try { + try { + super.close(); + } finally { + try { + fis.close(); + } catch (IOException e) { + } + } + } finally { + tmp.delete(); + } } - } finally { - tmp.delete(); - } + }; + } catch (IOException e) { + tmp.delete(); + throw e; } } @@ -368,11 +447,31 @@ public class IOUtils { */ public static byte[] toByteArray(InputStream in) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); - write(in, out); - - byte[] array = out.toByteArray(); - out.close(); + try { + write(in, out); + return out.toByteArray(); + } finally { + out.close(); + } + } - return array; + /** + * Convert the {@link File} into a byte array. + * + * @param file + * the input {@link File} + * + * @return the array + * + * @throws IOException + * in case of I/O error + */ + public static byte[] toByteArray(File file) throws IOException { + FileInputStream fis = new FileInputStream(file); + try { + return toByteArray(fis); + } finally { + fis.close(); + } } }