1 /*
2 FileUtils.java
3 Creation date : 07/03/2009
4 Copyright © Benjamin Croizet (graffity2199@yahoo.fr)
5
6 This program is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public License
8 or GNU Lesser General Public License as published by the
9 Free Software Foundation; either version 3 of the License,
10 or (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received copies of the GNU General Public License
18 and GNU Lesser General Public License along with this program;
19 if not, write to the Free Software Foundation, Inc.,
20 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 http://www.fsf.org/licensing/licenses/gpl.html
22 http://www.gnu.org/licenses/lgpl.html
23 */
24
25 package net.sourceforge.plantumldependency.common.utils.file;
26
27 import static java.util.logging.Level.INFO;
28 import static java.util.logging.Level.SEVERE;
29 import static java.util.logging.Logger.getLogger;
30 import static net.sourceforge.plantumldependency.common.constants.CommonConstants.MINUS_ONE_RETURN_CODE;
31 import static net.sourceforge.plantumldependency.common.constants.log.ErrorConstants.CLOSE_FILE_ERROR;
32 import static net.sourceforge.plantumldependency.common.constants.log.ErrorConstants.CLOSE_STREAM_ERROR;
33 import static net.sourceforge.plantumldependency.common.constants.log.ErrorConstants.READ_FILE_ERROR;
34 import static net.sourceforge.plantumldependency.common.constants.log.ErrorConstants.WRITE_FILE_ERROR;
35 import static net.sourceforge.plantumldependency.common.constants.log.InfoConstants.READ_FILE_INFO;
36 import static net.sourceforge.plantumldependency.common.constants.log.InfoConstants.WRITE_FILE_INFO;
37 import static net.sourceforge.plantumldependency.common.utils.log.LogUtils.buildLogString;
38
39 import java.io.Closeable;
40 import java.io.File;
41 import java.io.FileInputStream;
42 import java.io.FileWriter;
43 import java.io.IOException;
44 import java.io.InputStream;
45 import java.io.InputStreamReader;
46 import java.io.Reader;
47 import java.io.StringWriter;
48 import java.util.logging.Logger;
49
50 /**
51 * The class utilities managing files.
52 *
53 * @author Benjamin Croizet (<a href="mailto:graffity2199@yahoo.fr>graffity2199@yahoo.fr</a>)
54 * @since 1.3.0
55 * @version 1.3.0
56 */
57 public abstract class FileUtils {
58
59 /** The class logger. */
60 private static final transient Logger LOGGER = getLogger(FileUtils.class.getName());
61
62 /**
63 * Properly close a {@link Closeable} object.
64 *
65 * @param closeable
66 * the {@link Closeable} instance to close, mustn't be <code>null</code>.
67 * @since 1.3.0
68 */
69 public static void closeCloseable(final Closeable closeable) {
70 if (closeable != null) {
71 try {
72 closeable.close();
73 } catch (final IOException e) {
74 LOGGER.log(SEVERE, CLOSE_STREAM_ERROR, e);
75 }
76 }
77 }
78
79 /**
80 * Properly close a {@link Closeable} object.
81 *
82 * @param closeable
83 * the {@link Closeable} instance to close, mustn't be <code>null</code>.
84 * @param closeableFile
85 * the closeable {@link File} to log if any exception occurs.
86 * @since 1.3.0
87 */
88 public static void closeCloseable(final Closeable closeable, final File closeableFile) {
89 closeCloseable(closeable, closeableFile.toString());
90 }
91
92 /**
93 * Properly close a {@link Closeable} object.
94 *
95 * @param closeable
96 * the {@link Closeable} instance to close, mustn't be <code>null</code>.
97 * @param closeableName
98 * the closeable name to log if any exception occurs.
99 * @since 1.3.0
100 */
101 public static void closeCloseable(final Closeable closeable, final String closeableName) {
102 if (closeable != null) {
103 try {
104 closeable.close();
105 } catch (final IOException e) {
106 LOGGER.log(SEVERE, buildLogString(CLOSE_FILE_ERROR, closeableName), e);
107 }
108 }
109 }
110
111 /**
112 * This method reads the following file path as a <code>String</code>. It uses the default
113 * encoding when reading the file.
114 *
115 * @param file
116 * the file to read from, must'nt be <code>null</code>.
117 * @return the file content as a <code>String</code>, or the <code>null</code> constant if any
118 * error has occurred.
119 * @since 1.3.0
120 */
121 public static String readFileIntoString(final File file) {
122 return readFileIntoString(file, null);
123 }
124
125 /**
126 * This method reads the following file path as a <code>String</code>.
127 *
128 * @param file
129 * the file to read from, must'nt be <code>null</code>.
130 * @param charsetName
131 * The name of a supported {@link java.nio.charset.Charset}.
132 * @return the file content as a <code>String</code>, or the <code>null</code> constant if any
133 * error has occurred.
134 * @since 1.3.0
135 */
136 public static String readFileIntoString(final File file, final String charsetName) {
137 assert file != null : "file is null";
138
139 LOGGER.log(INFO, buildLogString(READ_FILE_INFO, new Object[] {file}));
140
141 FileInputStream fi = null;
142 String result = null;
143
144 try {
145 fi = new FileInputStream(file);
146 result = readStreamIntoString(fi, charsetName);
147 } catch (final IOException e) {
148 LOGGER.log(SEVERE, buildLogString(READ_FILE_ERROR, file), e);
149 } finally {
150 closeCloseable(fi, file);
151 }
152
153 return result;
154 }
155
156 /**
157 * This method reads the following file path as a <code>String</code>. It uses the default
158 * encoding when reading the file.
159 *
160 * @param pathName
161 * the file pathname to read from, must'nt be <code>null</code>.
162 * @return the file content as a <code>String</code>, or the <code>null</code> constant if any
163 * error has occurred.
164 * @since 1.3.0
165 */
166 public static String readFileIntoString(final String pathName) {
167 return readFileIntoString(pathName, null);
168 }
169
170 /**
171 * This method reads the following file path as a <code>String</code>.
172 *
173 * @param pathName
174 * the file pathname to read from, must'nt be <code>null</code>.
175 * @param charsetName
176 * The name of a supported {@link java.nio.charset.Charset}.
177 * @return the file content as a <code>String</code>, or the <code>null</code> constant if any
178 * error has occurred.
179 * @since 1.3.0
180 */
181 public static String readFileIntoString(final String pathName, final String charsetName) {
182 assert pathName != null : "pathName is null";
183
184 return readFileIntoString(new File(pathName), charsetName);
185 }
186
187 /**
188 * This method reads the following file path as a <code>String</code>. It uses the default
189 * encoding when reading the file.
190 *
191 * @param file
192 * the file to read from, must'nt be <code>null</code>.
193 * @return the file content as a <code>StringBuffer</code>, or the <code>null</code> constant if
194 * any error has occurred.
195 * @since 1.3.0
196 */
197 public static StringBuffer readFileIntoStringBuffer(final File file) {
198 return readFileIntoStringBuffer(file, null);
199 }
200
201 /**
202 * This method reads the following file path as a <code>String</code>.
203 *
204 * @param file
205 * the file to read from, must'nt be <code>null</code>.
206 * @param charsetName
207 * The name of a supported {@link java.nio.charset.Charset}.
208 * @return the file content as a <code>StringBuffer</code>, or the <code>null</code> constant if
209 * any error has occurred.
210 * @since 1.3.0
211 */
212 public static StringBuffer readFileIntoStringBuffer(final File file, final String charsetName) {
213 assert file != null : "file is null";
214
215 LOGGER.log(INFO, buildLogString(READ_FILE_INFO, new Object[] {file}));
216
217 FileInputStream fi = null;
218 StringBuffer result = null;
219
220 try {
221 fi = new FileInputStream(file);
222 result = readStreamIntoStringBuffer(fi, charsetName);
223 } catch (final IOException e) {
224 LOGGER.log(SEVERE, buildLogString(READ_FILE_ERROR, file), e);
225 } finally {
226 closeCloseable(fi, file);
227 }
228
229 return result;
230 }
231
232 /**
233 * This method reads the following file path as a <code>String</code>. It uses the default
234 * encoding when reading the file.
235 *
236 * @param pathName
237 * the file pathname to read from, must'nt be <code>null</code>.
238 * @return the file content as a <code>StringBuffer</code>, or the <code>null</code> constant if
239 * any error has occurred.
240 * @since 1.3.0
241 */
242 public static StringBuffer readFileIntoStringBuffer(final String pathName) {
243 return readFileIntoStringBuffer(pathName, null);
244 }
245
246 /**
247 * This method reads the following file path as a <code>String</code>.
248 *
249 * @param pathName
250 * the file pathname to read from, must'nt be <code>null</code>.
251 * @param charsetName
252 * The name of a supported {@link java.nio.charset.Charset}.
253 * @return the file content as a <code>StringBuffer</code>, or the <code>null</code> constant if
254 * any error has occurred.
255 * @since 1.3.0
256 */
257 public static StringBuffer readFileIntoStringBuffer(final String pathName, final String charsetName) {
258 assert pathName != null : "pathName is null";
259
260 return readFileIntoStringBuffer(new File(pathName), charsetName);
261 }
262
263 /**
264 * This method reads the following stream as a <code>String</code>. Doesn't close the stream. It
265 * uses the default encoding when reading the stream.
266 *
267 * @param stream
268 * the input stream to read from, must'nt be <code>null</code>.
269 * @return the stream content as a <code>String</code>, or the <code>null</code> constant if any
270 * error has occurred.
271 * @throws IOException
272 * if any exception occurs while reading the stream.
273 * @since 1.3.0
274 */
275 public static String readStreamIntoString(final InputStream stream) throws IOException {
276 return readStreamIntoString(stream, null);
277 }
278
279 /**
280 * This method reads the following stream as a <code>String</code>. Doesn't close the stream.
281 *
282 * @param stream
283 * the input stream to read from, must'nt be <code>null</code>.
284 * @param charsetName
285 * The name of a supported {@link java.nio.charset.Charset}.
286 * @return the stream content as a <code>String</code>, or the <code>null</code> constant if any
287 * error has occurred.
288 * @throws IOException
289 * if any exception occurs while reading the stream.
290 * @since 1.3.0
291 */
292 public static String readStreamIntoString(final InputStream stream, final String charsetName) throws IOException {
293 return readStreamIntoStringBuffer(stream, charsetName).toString();
294 }
295
296 /**
297 * This method reads the following stream as a <code>String</code>. Doesn't close the stream. It
298 * uses the default encoding when reading the stream.
299 *
300 * @param stream
301 * the input stream to read from, must'nt be <code>null</code>.
302 * @return the stream content as a <code>StringBuffer</code>, or the <code>null</code> constant
303 * if any error has occurred.
304 * @throws IOException
305 * if any exception occurs while reading the stream.
306 * @since 1.3.0
307 */
308 public static StringBuffer readStreamIntoStringBuffer(final InputStream stream) throws IOException {
309 return readStreamIntoStringBuffer(stream, null);
310 }
311
312 /**
313 * This method reads the following stream as a <code>String</code>. Doesn't close the stream.
314 *
315 * @param stream
316 * the input stream to read from, must'nt be <code>null</code>.
317 * @param charsetName
318 * The name of a supported {@link java.nio.charset.Charset}.
319 * @return the stream content as a <code>StringBuffer</code>, or the <code>null</code> constant
320 * if any error has occurred.
321 * @throws IOException
322 * if any exception occurs while reading the stream.
323 * @since 1.3.0
324 */
325 public static StringBuffer readStreamIntoStringBuffer(final InputStream stream, final String charsetName)
326 throws IOException {
327 assert stream != null : "stream is null";
328
329 Reader streamReader = null;
330 if (charsetName == null) {
331 streamReader = new InputStreamReader(stream);
332 } else {
333 streamReader = new InputStreamReader(stream, charsetName);
334 }
335
336 final StringWriter out = new StringWriter();
337 int b;
338 while ((b = streamReader.read()) != MINUS_ONE_RETURN_CODE) {
339 out.write(b);
340 }
341
342 return out.getBuffer();
343 }
344
345 /**
346 * This method writes the following <code>String</code> into the file.
347 *
348 * @param str
349 * the <code>String</code> to write, must'nt be <code>null</code> .
350 * @param file
351 * the file to write into, must'nt be <code>null</code>.
352 * @return <code>true</code> if no error have occurred while writing the file,
353 * <code>false</code> otherwise.
354 * @since 1.3.0
355 */
356 public static boolean writeIntoFile(final String str, final File file) {
357 return writeIntoFile(str, file, false);
358 }
359
360 /**
361 * This method writes the following <code>String</code> into the file.
362 *
363 * @param str
364 * the <code>String</code> to write, must'nt be <code>null</code> .
365 * @param file
366 * the file to write into, must'nt be <code>null</code>.
367 * @param append
368 * if <code>true</code>, then data will be written to the end of the file rather than
369 * the beginning.
370 * @return <code>true</code> if no error have occurred while writing the file,
371 * <code>false</code> otherwise.
372 * @since 1.3.0
373 */
374 public static boolean writeIntoFile(final String str, final File file, final boolean append) {
375 assert str != null : "str is null";
376 assert file != null : "file is null";
377
378 LOGGER.log(INFO, buildLogString(WRITE_FILE_INFO, file));
379
380 boolean error = true;
381 FileWriter writer = null;
382
383 try {
384 writer = new FileWriter(file, append);
385 writer.write(str, 0, str.length());
386 error = false;
387 } catch (final IOException e) {
388 LOGGER.log(SEVERE, buildLogString(WRITE_FILE_ERROR, file), e);
389 } finally {
390 closeCloseable(writer, file);
391 }
392
393 return error;
394 }
395
396 /**
397 * This method writes the following <code>String</code> into the file.
398 *
399 * @param str
400 * the <code>String</code> to write, must'nt be <code>null</code> .
401 * @param path
402 * the file path to write into, must'nt be <code>null</code>.
403 * @return <code>true</code> if no error have occurred while writing the file,
404 * <code>false</code> otherwise.
405 * @since 1.3.0
406 */
407 public static boolean writeIntoFile(final String str, final String path) {
408 return writeIntoFile(str, path, false);
409 }
410
411 /**
412 * This method writes the following <code>String</code> into the file.
413 *
414 * @param str
415 * the <code>String</code> to write, must'nt be <code>null</code> .
416 * @param pathName
417 * the file path to write into, must'nt be <code>null</code>.
418 * @param append
419 * if <code>true</code>, then data will be written to the end of the file rather than
420 * the beginning.
421 * @return <code>true</code> if no error have occurred while writing the file,
422 * <code>false</code> otherwise.
423 * @since 1.3.0
424 */
425 public static boolean writeIntoFile(final String str, final String pathName, final boolean append) {
426 assert pathName != null : "pathName is null";
427
428 return writeIntoFile(str, new File(pathName), append);
429 }
430
431 /**
432 * Private constructor to prevent from instantiation.
433 *
434 * @since 1.3.0
435 */
436 private FileUtils() {
437 super();
438 }
439 }