View Javadoc
1   package org.codehaus.plexus.util;
2   
3   /*
4    * Copyright The Codehaus Foundation.
5    *
6    * Licensed under the Apache License, Version 2.0 (the "License");
7    * you may not use this file except in compliance with the License.
8    * You may obtain a copy of the License at
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   */
18  
19  import java.io.File;
20  import java.io.FileNotFoundException;
21  import java.io.IOException;
22  import java.io.InputStream;
23  import java.io.InputStreamReader;
24  import java.io.Reader;
25  import java.io.UnsupportedEncodingException;
26  import java.net.URL;
27  import java.nio.charset.Charset;
28  import java.nio.file.Files;
29  
30  import org.codehaus.plexus.util.xml.XmlStreamReader;
31  
32  /**
33   * Utility to create Readers from streams, with explicit encoding choice: platform default, XML, or specified.
34   *
35   * @author <a href="mailto:hboutemy@codehaus.org">Herve Boutemy</a>
36   * @see Charset
37   * @see <a href="http://java.sun.com/j2se/1.4.2/docs/guide/intl/encoding.doc.html">Supported encodings</a>
38   *
39   * @since 1.4.3
40   */
41  public class ReaderFactory
42  {
43      /**
44       * ISO Latin Alphabet #1, also known as ISO-LATIN-1. Every implementation of the Java platform is required to
45       * support this character encoding.
46       * 
47       * @see Charset
48       */
49      public static final String ISO_8859_1 = "ISO-8859-1";
50  
51      /**
52       * Seven-bit ASCII, also known as ISO646-US, also known as the Basic Latin block of the Unicode character set. Every
53       * implementation of the Java platform is required to support this character encoding.
54       * 
55       * @see Charset
56       */
57      public static final String US_ASCII = "US-ASCII";
58  
59      /**
60       * Sixteen-bit Unicode Transformation Format, byte order specified by a mandatory initial byte-order mark (either
61       * order accepted on input, big-endian used on output). Every implementation of the Java platform is required to
62       * support this character encoding.
63       * 
64       * @see Charset
65       */
66      public static final String UTF_16 = "UTF-16";
67  
68      /**
69       * Sixteen-bit Unicode Transformation Format, big-endian byte order. Every implementation of the Java platform is
70       * required to support this character encoding.
71       * 
72       * @see Charset
73       */
74      public static final String UTF_16BE = "UTF-16BE";
75  
76      /**
77       * Sixteen-bit Unicode Transformation Format, little-endian byte order. Every implementation of the Java platform is
78       * required to support this character encoding.
79       * 
80       * @see Charset
81       */
82      public static final String UTF_16LE = "UTF-16LE";
83  
84      /**
85       * Eight-bit Unicode Transformation Format. Every implementation of the Java platform is required to support this
86       * character encoding.
87       * 
88       * @see Charset
89       */
90      public static final String UTF_8 = "UTF-8";
91  
92      /**
93       * The <code>file.encoding</code> System Property.
94       */
95      public static final String FILE_ENCODING = System.getProperty( "file.encoding" );
96  
97      /**
98       * Create a new Reader with XML encoding detection rules.
99       *
100      * @param in not null input stream.
101      * @return an XML reader instance for the input stream.
102      * @throws IOException if any.
103      * @see XmlStreamReader
104      */
105     public static XmlStreamReader newXmlReader( InputStream in )
106         throws IOException
107     {
108         return new XmlStreamReader( in );
109     }
110 
111     /**
112      * Create a new Reader with XML encoding detection rules.
113      *
114      * @param file not null file.
115      * @return an XML reader instance for the input file.
116      * @throws IOException if any.
117      * @see XmlStreamReader
118      */
119     public static XmlStreamReader newXmlReader( File file )
120         throws IOException
121     {
122         return new XmlStreamReader( file );
123     }
124 
125     /**
126      * Create a new Reader with XML encoding detection rules.
127      *
128      * @param url not null url.
129      * @return an XML reader instance for the input url.
130      * @throws IOException if any.
131      * @see XmlStreamReader
132      */
133     public static XmlStreamReader newXmlReader( URL url )
134         throws IOException
135     {
136         return new XmlStreamReader( url );
137     }
138 
139     /**
140      * Create a new Reader with default platform encoding.
141      *
142      * @param in not null input stream.
143      * @return a reader instance for the input stream using the default platform charset.
144      * @see Charset#defaultCharset()
145      */
146     public static Reader newPlatformReader( InputStream in )
147     {
148         return new InputStreamReader( in );
149     }
150 
151     /**
152      * Create a new Reader with default platform encoding.
153      *
154      * @param file not null file.
155      * @return a reader instance for the input file using the default platform charset.
156      * @throws IOException if any.
157      * @see Charset#defaultCharset()
158      */
159     public static Reader newPlatformReader( File file )
160         throws IOException
161     {
162         return Files.newBufferedReader( file.toPath() );
163     }
164 
165     /**
166      * Create a new Reader with default platform encoding.
167      *
168      * @param url not null url.
169      * @return a reader instance for the input url using the default platform charset.
170      * @throws IOException if any.
171      * @see Charset#defaultCharset()
172      */
173     public static Reader newPlatformReader( URL url )
174         throws IOException
175     {
176         return new InputStreamReader( url.openStream() );
177     }
178 
179     /**
180      * Create a new Reader with specified encoding.
181      *
182      * @param in not null input stream.
183      * @param encoding not null supported encoding.
184      * @return a reader instance for the input stream using the given encoding.
185      * @throws UnsupportedEncodingException if any.
186      * @see <a href="http://java.sun.com/j2se/1.4.2/docs/guide/intl/encoding.doc.html">Supported encodings</a>
187      */
188     public static Reader newReader( InputStream in, String encoding )
189         throws UnsupportedEncodingException
190     {
191         return new InputStreamReader( in, encoding );
192     }
193 
194     /**
195      * Create a new Reader with specified encoding. Note that there is no buffering on this reader, which favours
196      * clients that read into large buffers (8K+).
197      *
198      * @param file not null file.
199      * @param encoding not null supported encoding.
200      * @return a reader instance for the input file using the given encoding.
201      * @throws IOException if any.
202      * @see <a href="http://java.sun.com/j2se/1.4.2/docs/guide/intl/encoding.doc.html">Supported encodings</a>
203      */
204     public static Reader newReader( File file, String encoding )
205         throws IOException
206     {
207         return new InputStreamReader( Files.newInputStream( file.toPath() ), encoding );
208     }
209 
210     /**
211      * Create a new Reader with specified encoding.
212      *
213      * @param url not null url.
214      * @param encoding not null supported encoding.
215      * @return a reader instance for the input url using the given encoding.
216      * @throws IOException if any.
217      * @see <a href="http://java.sun.com/j2se/1.4.2/docs/guide/intl/encoding.doc.html">Supported encodings</a>
218      */
219     public static Reader newReader( URL url, String encoding )
220         throws IOException
221     {
222         return new InputStreamReader( url.openStream(), encoding );
223     }
224 }