package br.com.citframework.util; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.nio.charset.Charset; import org.apache.commons.lang.StringUtils; /** * Utilit�rio para persist�ncia de arquivos no file system * * @author bruno.ribeiro - <a href="mailto:bruno.ribeiro@centrait.com.br">bruno.ribeiro@centrait.com.br</a> * @since 10/02/2015 * */ public final class FileUtil { private FileUtil() {} public static final Charset DEFAULT_CHARSET = Charset.defaultCharset(); private static final String PATH_MUST_NOT_BE_NULL_OR_EMPTY = "Path must not be null or empty."; /** * Cria, se inexistente, a barra no fim de uma pasta no filesystem * * @param path * pasta a ser verificada a exist�ncia de barra no fim * @return pasta com o nome contendo a barra no fim * @author bruno.ribeiro - <a href="mailto:bruno.ribeiro@centrait.com.br">bruno.ribeiro@centrait.com.br</a> * @since 10/02/2015 */ public static String garantirBarraFim(String path) { Assert.notNullAndNotEmpty(path, PATH_MUST_NOT_BE_NULL_OR_EMPTY); if (!path.matches(".*[\\\\/]")) { path += path.indexOf('\\') >= 0 ? "\\" : "/"; } return path; } /** * Cria, se inexistente, a barra no in�cio de uma pasta no filesystem * * @param path * pasta a ser verificada a exist�ncia de barra no in�cio * @return pasta com o nome contendo a barra no in�cio * @author bruno.ribeiro - <a href="mailto:bruno.ribeiro@centrait.com.br">bruno.ribeiro@centrait.com.br</a> * @since 10/02/2015 */ public static String garantirBarraInicio(String path) { Assert.notNullAndNotEmpty(path, PATH_MUST_NOT_BE_NULL_OR_EMPTY); if (!(path.startsWith("/") || path.startsWith("\\") || path.indexOf(":") > 0)) { path = (path.indexOf("\\") > 0 ? "\\" : "/") + path; } return path; } /** * Garante a exist�ncia de um arquivo/diret�rio no filesystem * * @param path * pasta a ser garantida a exist�ncia * @param isToCreate * se o arquivo/diret�erio deve ou n�o ser criado * @return {@code true} caso a pasta j� exista ou foi criada, {@code false}, caso contr�rio * @author bruno.ribeiro - <a href="mailto:bruno.ribeiro@centrait.com.br">bruno.ribeiro@centrait.com.br</a> * @since 10/02/2015 */ public static boolean garantirExistencia(final String path, final boolean isToCreate) { boolean exists = false; final File directory = new File(path); if (!directory.exists()) { if (isToCreate) { exists = directory.mkdirs(); } } return exists; } /** * Grava um arquivo e seu respectivo conte�do, com encode padr�o, no file system * * @param content * conte�do do arquivo a ser salvo * @param fileName * nome do arquivo a ser criado * @param path * diret�rio em que o arquivo ser� criado * @param appendToEnd * se o conte�do deve ser escrito no final do arquivo. Se {@code false}, escreve no in�cio do arquivo * @throws IOException * caso algum problema de I/O aconte�a * @author bruno.ribeiro - <a href="mailto:bruno.ribeiro@centrait.com.br">bruno.ribeiro@centrait.com.br</a> * @since 10/02/2015 */ public static void salvarArquivo(final String content, final String fileName, final String path, final boolean appendToEnd) throws IOException { salvarArquivo(content, fileName, path, appendToEnd, DEFAULT_CHARSET); } /** * Grava um arquivo e seu respectivo conte�do, com encode especificado, no file system * * @param content * conte�do do arquivo a ser salvo * @param fileName * nome do arquivo a ser criado * @param path * diret�rio em que o arquivo ser� criado * @param appendToEnd * se o conte�do deve ser escrito no final do arquivo. Se {@code false}, escreve no in�cio do arquivo * @param encoding * charset no qual o conte�do deve ser salvo * @throws IOException * caso algum problema de I/O aconte�a * @author bruno.ribeiro - <a href="mailto:bruno.ribeiro@centrait.com.br">bruno.ribeiro@centrait.com.br</a> * @since 11/02/2015 * @see Charset * @see #salvarArquivo(String, String, String, boolean, Charset) */ public static void salvarArquivo(final String content, final String fileName, final String path, final boolean appendToEnd, final String encoding) throws IOException { final Charset charSet = StringUtils.isBlank(encoding) ? DEFAULT_CHARSET : Charset.forName(encoding); salvarArquivo(content, fileName, path, appendToEnd, charSet); } /** * Grava um arquivo e seu respectivo conte�do, com encode especificado, no file system * * @param content * conte�do do arquivo a ser salvo * @param fileName * nome do arquivo a ser criado * @param path * diret�rio em que o arquivo ser� criado * @param appendToEnd * se o conte�do deve ser escrito no final do arquivo. Se {@code false}, escreve no in�cio do arquivo * @param encoding * charset no qual o conte�do deve ser salvo * @throws IOException * caso algum problema de I/O aconte�a * @author bruno.ribeiro - <a href="mailto:bruno.ribeiro@centrait.com.br">bruno.ribeiro@centrait.com.br</a> * @since 11/02/2015 * @see Charset * @see #salvarArquivo(String, String, String, boolean, String) */ public static void salvarArquivo(final String content, final String fileName, String path, final boolean appendToEnd, final Charset encoding) throws IOException { path = garantirBarraFim(path); path = garantirBarraInicio(path); garantirExistencia(path, true); try (final FileOutputStream fos = new FileOutputStream(path + fileName, appendToEnd); final OutputStreamWriter osw = new OutputStreamWriter(fos, encoding); final Writer out = new BufferedWriter(osw)) { out.write(content); out.flush(); } catch (final IOException e) { throw new IOException("Problema ao salvar o arquivo: " + e.getMessage()); } } }