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}