/** * */ package net.frontlinesms.csv; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.io.UnsupportedEncodingException; /** * In this class we read all files as UTF-8. * @author Alex */ public final class Utf8FileReader extends Reader { //> STATIC CONSTANTS //> INSTANCE PROPERTIES /** {@link InputStream} wrapping the file we are reading from */ private final FileInputStream fileInputStream; /** {@link Reader} wrapping {@link #fileInputStream} and enforcing {@link CsvUtils#ENCODING_UTF8} */ private final InputStreamReader inputStreamReader; /** {@link Reader} wrapping {@link #inputStreamReader} */ private final BufferedReader bufferedReader; //> CONSTRUCTORS /** * Create a new reader using the UTF-8 character encoding to the supplied file. * @param file * @throws IOException */ public Utf8FileReader(File file) throws IOException { this.fileInputStream = new FileInputStream(file); try { this.inputStreamReader = new InputStreamReader(this.fileInputStream, CsvUtils.ENCODING_UTF8); } catch(UnsupportedEncodingException ex) { /* * http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html * "Every implementation of the Java platform is required to support [UTF-8]." */ throw new IllegalStateException("JVM lacks support for the required characterset: '" + CsvUtils.ENCODING_UTF8 + "'.", ex); } this.bufferedReader = new BufferedReader(this.inputStreamReader); } //> ACCESSORS //> INSTANCE HELPER METHODS //> STATIC FACTORIES //> STATIC HELPER METHODS /** Close all underlying streams */ @Override public void close() { CsvUtils.close(this.bufferedReader); CsvUtils.close(this.inputStreamReader); CsvUtils.close(this.fileInputStream); } /** @see BufferedReader#read(char[], int, int) */ @Override public int read(char[] cbuf, int off, int len) throws IOException { return this.bufferedReader.read(cbuf, off, len); } }