Preciso acrescentar texto repetidamente a um arquivo existente em Java. Como faço isso?
fonte
Preciso acrescentar texto repetidamente a um arquivo existente em Java. Como faço isso?
Você está fazendo isso para fins de registro? Nesse caso, existem várias bibliotecas para isso . Dois dos mais populares são o Log4j e o Logback .
Se você precisar fazer isso apenas uma vez, a classe Arquivos facilita isso:
try {
Files.write(Paths.get("myfile.txt"), "the text".getBytes(), StandardOpenOption.APPEND);
}catch (IOException e) {
//exception handling left as an exercise for the reader
}
Cuidado : A abordagem acima lançará um NoSuchFileException
se o arquivo ainda não existir. Ele também não anexa uma nova linha automaticamente (o que você geralmente deseja ao anexar a um arquivo de texto). A resposta de Steve Chambers cobre como você pode fazer isso com a Files
classe.
No entanto, se você estiver gravando no mesmo arquivo várias vezes, o procedimento acima deverá abrir e fechar o arquivo no disco várias vezes, o que é uma operação lenta. Nesse caso, um gravador em buffer é melhor:
try(FileWriter fw = new FileWriter("myfile.txt", true);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter out = new PrintWriter(bw))
{
out.println("the text");
//more code
out.println("more text");
//more code
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
Notas:
FileWriter
construtor solicitará que ele seja anexado ao arquivo, em vez de gravar um novo arquivo. (Se o arquivo não existir, ele será criado.)BufferedWriter
É recomendável usar a para um gravador caro (como FileWriter
).PrintWriter
fornece acesso à println
sintaxe à qual você provavelmente está acostumado System.out
.BufferedWriter
e PrintWriter
não são estritamente necessários.try {
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("myfile.txt", true)));
out.println("the text");
out.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
Se você precisar de um tratamento robusto de exceções para Java antigo, ele ficará muito detalhado:
FileWriter fw = null;
BufferedWriter bw = null;
PrintWriter out = null;
try {
fw = new FileWriter("myfile.txt", true);
bw = new BufferedWriter(fw);
out = new PrintWriter(bw);
out.println("the text");
out.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
finally {
try {
if(out != null)
out.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
try {
if(bw != null)
bw.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
try {
if(fw != null)
fw.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
}
new BufferedWriter(...)
lança uma exceção; OFileWriter
será fechado? Eu acho que não será fechado, porque oclose()
método (em condições normais) será invocado noout
objeto, que neste caso não será inicializado - portanto, na verdade, oclose()
método não será invocado -> o arquivo será aberto, mas não será fechado. Então IMHO atry
declaração deve ficar assimtry(FileWriter fw = new FileWriter("myFile.txt")){ Print writer = new ....//code goes here }
E ele deveriaflush()
o escritor antes de sair dotry
bloco !!!StandardOpenOption.APPEND
não será criado - como uma falha silenciosa, pois também não causará uma exceção. (2) Usar.getBytes()
significa que não há caracteres de retorno antes ou depois do texto anexado. Adicionaram uma resposta alternativa para resolvê-las.Você pode usar
fileWriter
com um sinalizador definido comotrue
, para anexar.fonte
close
deve ser colocado nofinally
bloco, como mostrado na resposta do @ etech, caso exista uma exceção entre a criação do FileWriter e a chamada close.try(FileWriter fw = new FileWriter(filename,true)){ // Whatever }catch(IOException ex){ ex.printStackTrace(); }
Todas as respostas aqui dos blocos try / catch não deveriam ter as partes .close () contidas em um bloco finalmente?
Exemplo para resposta marcada:
Além disso, a partir do Java 7, você pode usar uma instrução try-with-resources . Finalmente, nenhum bloco é necessário para fechar o (s) recurso (s) declarado (s) porque ele é tratado automaticamente e também é menos detalhado:
fonte
out
sai do escopo, é automaticamente fechado quando é coletado do lixo, certo? No seu exemplo com ofinally
bloco, acho que você realmente precisa de outra tentativa / captura aninhada,out.close()
se bem me lembro. A solução Java 7 é muito boa! (Eu não venho desenvolvendo Java desde o Java 6, então não estava familiarizado com essa alteração.) #flush
método?Editar - a partir do Apache Commons 2.1, a maneira correta de fazer isso é:
Adaptei a solução do @ Kip para incluir o fechamento correto do arquivo e finalmente:fonte
Para expandir um pouco a resposta de Kip , aqui está um método Java 7+ simples para acrescentar uma nova linha a um arquivo, criando-o se ele ainda não existir :
Nota: A descrição acima usa a
Files.write
sobrecarga que grava linhas de texto em um arquivo (ou seja, semelhante a umprintln
comando). Para escrever apenas texto no final (ou seja, semelhante a umprint
comando), umaFiles.write
sobrecarga alternativa pode ser usada, passando em uma matriz de bytes (por exemplo"mytext".getBytes(StandardCharsets.UTF_8)
).fonte
.CREATE
faz o trabalho para você.Verifique se o fluxo é fechado corretamente em todos os cenários.
É um pouco alarmante quantas dessas respostas deixam o identificador de arquivo aberto em caso de erro. A resposta https://stackoverflow.com/a/15053443/2498188 está no dinheiro, mas apenas porque
BufferedWriter()
não pode ser lançada. Se pudesse, uma exceção deixaria oFileWriter
objeto aberto.Uma maneira mais geral de fazer isso que não se importa se
BufferedWriter()
pode lançar:Editar:
No Java 7, a maneira recomendada é usar "try with resources" e deixar a JVM lidar com isso:
fonte
PrintWriter.close()
não é declarado comothrows IOException
nos documentos . Olhando para sua fonte , oclose()
método, de fato, não pode ser lançadoIOException
, porque o captura no fluxo subjacente e define uma sinalização. Portanto, se você estiver trabalhando no código para o próximo ônibus espacial ou em um sistema de medição de dose de raios-X, use-oPrintWriter.checkError()
após tentarout.close()
. Isso realmente deveria ter sido documentado.XX.close()
deve estar em sua própria tentativa / captura, certo? Por exemplo,out.close()
poderia lançar uma exceção, caso em quebw.close()
efw.close()
nunca seria chamado, efw
é aquele que é mais crítico para perto.No Java-7, isso também pode ser feito:
// ---------------------
fonte
java 7+
Na minha humilde opinião, já que sou fã de Java simples, sugiro algo que é uma combinação das respostas acima mencionadas. Talvez eu esteja atrasado para a festa. Aqui está o código:
Se o arquivo não existir, ele será criado e, se já existir, anexará o sampleText ao arquivo existente. Com isso, você evita adicionar bibliotecas desnecessárias ao seu caminho de classe.
fonte
Isso pode ser feito em uma linha de código. Espero que isto ajude :)
fonte
Usando java.nio. Arquivos junto com java.nio.file. StandardOpenOption
Isso cria um
BufferedWriter
arquivo usando, que aceitaStandardOpenOption
parâmetros, e uma liberação automáticaPrintWriter
do resultanteBufferedWriter
.PrintWriter
doprintln()
método, pode ser chamado para gravar no arquivo.Os
StandardOpenOption
parâmetros usados neste código: abre o arquivo para gravação, anexa somente ao arquivo e cria o arquivo se ele não existir.Paths.get("path here")
pode ser substituído pornew File("path here").toPath()
. ECharset.forName("charset name")
pode ser modificado para acomodar o desejadoCharset
.fonte
Eu apenas adiciono pequenos detalhes:
2.nd parâmetro (true) é um recurso (ou interface) chamado appendable ( http://docs.oracle.com/javase/7/docs/api/java/lang/Appendable.html ). É responsável por poder adicionar algum conteúdo ao final de um arquivo / fluxo específico. Essa interface é implementada desde o Java 1.5. Cada objeto (por exemplo , BufferedWriter, CharArrayWriter, CharBuffer, FileWriter, FilterWriter, LogStream, OutputStreamWriter, PipedWriter, PrintStream, PrintWriter, StringBuffer, StringBuilder, StringWriter, Writer ) com essa interface pode ser usado para adicionar conteúdo
Em outras palavras, você pode adicionar algum conteúdo ao seu arquivo compactado com gzip ou algum processo http
fonte
Amostra, usando o Goiaba:
fonte
Tente com bufferFileWriter.append, ele funciona comigo.
fonte
isso fará o que você pretende ..
fonte
Melhor usar o try-with-resources do que todos os negócios pré-java 7 finalmente
fonte
Se estivermos usando o Java 7 e superior e também soubermos o conteúdo a ser adicionado (anexado) ao arquivo, podemos usar o método newBufferedWriter no pacote NIO.
Há alguns pontos a serem observados:
StandardCharsets
.try-with-resource
instrução na qual os recursos são fechados automaticamente após a tentativa.Embora o OP não tenha perguntado, apenas no caso de querermos procurar linhas com alguma palavra-chave específica, por exemplo
confidential
, podemos usar APIs de fluxo em Java:fonte
write(String string)
Se alguém espera uma nova linha após cada corda escrita,newLine()
deve ser chamadoo true permite acrescentar os dados no arquivo existente. Se vamos escrever
Ele substituirá o arquivo existente. Então vá para a primeira abordagem.
fonte
fonte
Em seguida, pegue uma IOException em algum lugar a montante.
fonte
Crie uma função em qualquer lugar do seu projeto e simplesmente chame essa função sempre que precisar.
Gente, você deve se lembrar de que está chamando threads ativos que não está chamando de forma assíncrona e, uma vez que provavelmente seriam boas 5 a 10 páginas para fazê-lo corretamente. Por que não dedicar mais tempo ao seu projeto e esquecer de escrever qualquer coisa que já esteja escrita? Devidamente
três linhas de código dois, na verdade, uma vez que a terceira acrescenta texto. : P
fonte
fonte
Você também pode tentar o seguinte:
fonte
Eu poderia sugerir o projeto apache commons . Este projeto já fornece uma estrutura para fazer o que você precisa (por exemplo, filtragem flexível de coleções).
fonte
O método a seguir permite anexar texto a algum arquivo:
Alternativamente usando
FileUtils
:Não é eficiente, mas funciona bem. Quebras de linha são tratadas corretamente e um novo arquivo é criado se ainda não existir.
fonte
Este código satisfará sua necessidade:
fonte
Caso você queira ADICIONAR ALGUM TEXTO EM LINHAS ESPECÍFICAS, primeiro você pode ler o arquivo inteiro, anexar o texto onde quiser e substituir tudo como no código abaixo:
fonte
Minha resposta:
fonte
fonte
Você pode usar o código a seguir para anexar o conteúdo no arquivo:
fonte
1.7 Abordagem:
fonte