001package biweekly.util; 002 003import java.io.ByteArrayOutputStream; 004import java.io.Closeable; 005import java.io.File; 006import java.io.FileInputStream; 007import java.io.FileNotFoundException; 008import java.io.FileOutputStream; 009import java.io.IOException; 010import java.io.InputStream; 011import java.io.InputStreamReader; 012import java.io.OutputStream; 013import java.io.OutputStreamWriter; 014import java.io.Reader; 015import java.io.Writer; 016import java.nio.charset.Charset; 017 018/* 019 Copyright (c) 2013-2015, Michael Angstadt 020 All rights reserved. 021 022 Redistribution and use in source and binary forms, with or without 023 modification, are permitted provided that the following conditions are met: 024 025 1. Redistributions of source code must retain the above copyright notice, this 026 list of conditions and the following disclaimer. 027 2. Redistributions in binary form must reproduce the above copyright notice, 028 this list of conditions and the following disclaimer in the documentation 029 and/or other materials provided with the distribution. 030 031 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 032 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 033 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 034 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 035 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 036 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 037 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 038 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 039 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 040 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 041 */ 042 043/** 044 * I/O helper classes. 045 * @author Michael Angstadt 046 */ 047public class IOUtils { 048 private static final Charset UTF8 = Charset.forName("UTF-8"); 049 050 /** 051 * Reads all the bytes from an input stream. 052 * @param in the input stream 053 * @return the bytes 054 * @throws IOException if there's a problem reading from the input stream 055 */ 056 public static byte[] toByteArray(InputStream in) throws IOException { 057 return toByteArray(in, false); 058 } 059 060 /** 061 * Reads all the bytes from an input stream. 062 * @param in the input stream 063 * @param close true to close the input stream when done, false not to 064 * @return the bytes 065 * @throws IOException if there's a problem reading from the input stream 066 */ 067 public static byte[] toByteArray(InputStream in, boolean close) throws IOException { 068 try { 069 ByteArrayOutputStream out = new ByteArrayOutputStream(); 070 byte[] buffer = new byte[4096]; 071 int read; 072 while ((read = in.read(buffer)) != -1) { 073 out.write(buffer, 0, read); 074 } 075 return out.toByteArray(); 076 } finally { 077 if (close) { 078 closeQuietly(in); 079 } 080 } 081 } 082 083 /** 084 * Reads the contents of a text file. 085 * @param file the file to read 086 * @return the file contents 087 * @throws IOException if there's a problem reading the file 088 */ 089 public static String getFileContents(File file) throws IOException { 090 return getFileContents(file, Charset.defaultCharset().name()); 091 } 092 093 /** 094 * Reads the contents of a text file. 095 * @param file the file to read 096 * @param charset the character encoding of the file 097 * @return the file contents 098 * @throws IOException if there's a problem reading the file 099 */ 100 public static String getFileContents(File file, String charset) throws IOException { 101 byte[] bytes = toByteArray(new FileInputStream(file), true); 102 return new String(bytes, charset); 103 } 104 105 /** 106 * Closes a closeable resource, catching its {@link IOException}. 107 * @param closeable the resource to close (can be null) 108 */ 109 public static void closeQuietly(Closeable closeable) { 110 try { 111 if (closeable != null) { 112 closeable.close(); 113 } 114 } catch (IOException e) { 115 //ignore 116 } 117 } 118 119 /** 120 * Creates a writer whose character encoding is set to "UTF-8". 121 * @param out the output stream to write to 122 * @return the writer 123 */ 124 public static Writer utf8Writer(OutputStream out) { 125 return new OutputStreamWriter(out, UTF8); 126 } 127 128 /** 129 * Creates a writer whose character encoding is set to "UTF-8". 130 * @param file the file to write to 131 * @return the writer 132 * @throws FileNotFoundException if the file cannot be written to 133 */ 134 public static Writer utf8Writer(File file) throws FileNotFoundException { 135 return utf8Writer(file, false); 136 } 137 138 /** 139 * Creates a writer whose character encoding is set to "UTF-8". 140 * @param file the file to write to 141 * @param append true to append to the end of the file, false to overwrite 142 * it 143 * @return the writer 144 * @throws FileNotFoundException if the file cannot be written to 145 */ 146 public static Writer utf8Writer(File file, boolean append) throws FileNotFoundException { 147 return utf8Writer(new FileOutputStream(file, append)); 148 } 149 150 /** 151 * Creates a reader whose character encoding is set to "UTF-8". 152 * @param in the input stream to read from 153 * @return the reader 154 */ 155 public static Reader utf8Reader(InputStream in) { 156 return new InputStreamReader(in, UTF8); 157 } 158 159 /** 160 * Creates a reader whose character encoding is set to "UTF-8". 161 * @param file the file to read from 162 * @return the reader 163 * @throws FileNotFoundException if the file can't be read 164 */ 165 public static Reader utf8Reader(File file) throws FileNotFoundException { 166 return utf8Reader(new FileInputStream(file)); 167 } 168 169 private IOUtils() { 170 //hide 171 } 172}