001 package ezvcard.util; 002 003 import java.io.ByteArrayOutputStream; 004 import java.io.Closeable; 005 import java.io.File; 006 import java.io.FileInputStream; 007 import java.io.FileNotFoundException; 008 import java.io.FileOutputStream; 009 import java.io.IOException; 010 import java.io.InputStream; 011 import java.io.InputStreamReader; 012 import java.io.OutputStream; 013 import java.io.OutputStreamWriter; 014 import java.io.Reader; 015 import java.io.Writer; 016 import java.nio.charset.Charset; 017 018 /* 019 Copyright (c) 2013, 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 The views and conclusions contained in the software and documentation are those 043 of the authors and should not be interpreted as representing official policies, 044 either expressed or implied, of the FreeBSD Project. 045 */ 046 047 /** 048 * I/O helper classes. 049 * @author Michael Angstadt 050 */ 051 public class IOUtils { 052 private static final Charset UTF8 = Charset.forName("UTF-8"); 053 054 /** 055 * Gets the extension off a file's name. 056 * @param file the file 057 * @return its extension (e.g. "jpg") or null if it doesn't have one 058 */ 059 public static String getFileExtension(File file) { 060 String fileName = file.getName(); 061 int dot = fileName.lastIndexOf('.'); 062 if (dot >= 0 && dot < fileName.length() - 1) { 063 return fileName.substring(dot + 1); 064 } 065 return null; 066 } 067 068 /** 069 * Reads all the bytes from an input stream. 070 * @param in the input stream 071 * @return the bytes 072 * @throws IOException if there's a problem reading from the input stream 073 */ 074 public static byte[] toByteArray(InputStream in) throws IOException { 075 return toByteArray(in, false); 076 } 077 078 /** 079 * Reads all the bytes from an input stream. 080 * @param in the input stream 081 * @param close true to close the input stream when done, false not to 082 * @return the bytes 083 * @throws IOException if there's a problem reading from the input stream 084 */ 085 public static byte[] toByteArray(InputStream in, boolean close) throws IOException { 086 try { 087 ByteArrayOutputStream out = new ByteArrayOutputStream(); 088 byte[] buffer = new byte[4096]; 089 int read; 090 while ((read = in.read(buffer)) != -1) { 091 out.write(buffer, 0, read); 092 } 093 return out.toByteArray(); 094 } finally { 095 if (close) { 096 closeQuietly(in); 097 } 098 } 099 } 100 101 /** 102 * Reads the contents of a text file. 103 * @param file the file to read 104 * @return the file contents 105 * @throws IOException if there's a problem reading the file 106 */ 107 public static String getFileContents(File file) throws IOException { 108 return getFileContents(file, Charset.defaultCharset().name()); 109 } 110 111 /** 112 * Reads the contents of a text file. 113 * @param file the file to read 114 * @param charset the character encoding of the file 115 * @return the file contents 116 * @throws IOException if there's a problem reading the file 117 */ 118 public static String getFileContents(File file, String charset) throws IOException { 119 byte[] bytes = toByteArray(new FileInputStream(file), true); 120 return new String(bytes, charset); 121 } 122 123 /** 124 * Closes a closeable resource, catching its {@link IOException}. 125 * @param closeable the resource to close (can be null) 126 */ 127 public static void closeQuietly(Closeable closeable) { 128 try { 129 if (closeable != null) { 130 closeable.close(); 131 } 132 } catch (IOException e) { 133 //ignore 134 } 135 } 136 137 /** 138 * Creates a writer whose character encoding is set to "UTF-8". 139 * @param out the output stream to write to 140 * @return the writer 141 */ 142 public static Writer utf8Writer(OutputStream out) { 143 return new OutputStreamWriter(out, UTF8); 144 } 145 146 /** 147 * Creates a writer whose character encoding is set to "UTF-8". 148 * @param file the file to write to 149 * @return the writer 150 * @throws FileNotFoundException if the file cannot be written to 151 */ 152 public static Writer utf8Writer(File file) throws FileNotFoundException { 153 return utf8Writer(file, false); 154 } 155 156 /** 157 * Creates a writer whose character encoding is set to "UTF-8". 158 * @param file the file to write to 159 * @param append true to append to the end of the file, false to overwrite 160 * it 161 * @return the writer 162 * @throws FileNotFoundException if the file cannot be written to 163 */ 164 public static Writer utf8Writer(File file, boolean append) throws FileNotFoundException { 165 return utf8Writer(new FileOutputStream(file, append)); 166 } 167 168 /** 169 * Creates a reader whose character encoding is set to "UTF-8". 170 * @param in the input stream to read from 171 * @return the reader 172 */ 173 public static Reader utf8Reader(InputStream in) { 174 return new InputStreamReader(in, UTF8); 175 } 176 177 /** 178 * Creates a reader whose character encoding is set to "UTF-8". 179 * @param file the file to read from 180 * @return the reader 181 * @throws FileNotFoundException if the file can't be read 182 */ 183 public static Reader utf8Reader(File file) throws FileNotFoundException { 184 return utf8Reader(new FileInputStream(file)); 185 } 186 187 private IOUtils() { 188 //hide 189 } 190 }