Qual é a maneira mais simples de criar e gravar em um arquivo (texto) em Java?
1383
Observe que cada uma das amostras de código abaixo pode ser lançada IOException
. Os blocos try / catch / finalmente foram omitidos por questões de brevidade. Consulte este tutorial para obter informações sobre o tratamento de exceções.
Observe que cada um dos exemplos de código abaixo substituirá o arquivo se ele já existir
Criando um arquivo de texto:
PrintWriter writer = new PrintWriter("the-file-name.txt", "UTF-8");
writer.println("The first line");
writer.println("The second line");
writer.close();
Criando um arquivo binário:
byte data[] = ...
FileOutputStream out = new FileOutputStream("the-file-name");
out.write(data);
out.close();
Os usuários do Java 7+ podem usar a Files
classe para gravar em arquivos:
Criando um arquivo de texto:
List<String> lines = Arrays.asList("The first line", "The second line");
Path file = Paths.get("the-file-name.txt");
Files.write(file, lines, StandardCharsets.UTF_8);
//Files.write(file, lines, StandardCharsets.UTF_8, StandardOpenOption.APPEND);
Criando um arquivo binário:
byte data[] = ...
Path file = Paths.get("the-file-name");
Files.write(file, data);
//Files.write(file, data, StandardOpenOption.APPEND);
"PrintWriter prints formatted representations of objects to a text-output stream. "
a resposta do Bozho é mais correta, embora pareça complicada (você sempre pode envolvê-lo em algum método utilitário).writer.close()
deve estar em um bloco finalmenteNo Java 7 e superior:
Existem utilitários úteis para isso:
Observe também que você pode usar a
FileWriter
, mas ela usa a codificação padrão, o que geralmente é uma má idéia - é melhor especificar a codificação explicitamente.Abaixo está a resposta original anterior ao Java 7
Consulte também: Leitura, gravação e criação de arquivos (inclui NIO2).
fonte
close()
de qualquer fluxo enrolado em qualquer outro fechará também todos os fluxos internos.Se você já possui o conteúdo que deseja gravar no arquivo (e não é gerado rapidamente), a
java.nio.file.Files
adição no Java 7 como parte da E / S nativa fornece a maneira mais simples e eficiente de atingir seus objetivos.Basicamente, criar e gravar em um arquivo é apenas uma linha, além de uma simples chamada de método !
O exemplo a seguir cria e grava em 6 arquivos diferentes para mostrar como ele pode ser usado:
fonte
fonte
output.close()
lança IOExceptionAqui está um pequeno exemplo de programa para criar ou substituir um arquivo. É a versão longa, para que possa ser entendida com mais facilidade.
fonte
Uma maneira muito simples de criar e gravar em um arquivo em Java:
fonte
File.exists()/createNewFile()
código aqui é inútil e inútil. O sistema operacional já precisa fazer exatamente a mesma coisa quando elenew FileWriter()
é criado. Você está forçando tudo a acontecer duas vezes.FileWriter
seguinte maneira: #new FileWriter(file.getAbsoluteFile(),true)
Usar:
Usar
try()
fechará o fluxo automaticamente. Esta versão é curta, rápida (em buffer) e permite escolher a codificação.Esse recurso foi introduzido no Java 7.
fonte
StandardCharsets.UTF_8
vez da string "utf-8" (isso evita falhas de digitação)...new OutputStreamWriter(new FileOutputStream("myFile.txt"), StandardCharsets.UTF_8)...
-java.nio.charset.StandardCharsets
é introduzida no java 7Aqui estamos inserindo uma string em um arquivo de texto:
Podemos facilmente criar um novo arquivo e adicionar conteúdo a ele.
fonte
Como o autor não especificou se eles exigem uma solução para versões Java que foram EoL'd (tanto pela Sun quanto pela IBM, e estas são tecnicamente as JVMs mais difundidas), e devido ao fato de que muitas pessoas parecem ter respondido ao pergunta do autor antes de ser especificado que é um arquivo de texto (não binário) , decidi fornecer minha resposta.
Em primeiro lugar, o Java 6 geralmente chegou ao fim da vida útil e, como o autor não especificou que ele precisa de compatibilidade com legados, acho que significa automaticamente o Java 7 ou superior (o Java 7 ainda não foi aprovado pela IBM). Portanto, podemos ver o tutorial de E / S do arquivo: https://docs.oracle.com/javase/tutorial/essential/io/legacy.html
Bem, isso exclui o java.io.File. Se um arquivo não puder ser gravado / anexado, talvez você nem saiba o porquê.
Podemos continuar consultando o tutorial: https://docs.oracle.com/javase/tutorial/essential/io/file.html#common
Se você tiver todas as linhas que escreverá (anexa) no arquivo de texto com antecedência , a abordagem recomendada é https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html# Você pode usar o seguinte comando: java.nio.file.Path-java.lang.Iterable-java.nio.charset.Charset-java.nio.file.OpenOption ...-
Aqui está um exemplo (simplificado):
Outro exemplo (anexar):
Se você deseja gravar o conteúdo do arquivo, vá para : https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#newBufferedWriter-java.nio.file.Path-java .nio.charset.Charset-java.nio.file.OpenOption ...-
Exemplo simplificado (Java 8 ou superior):
Outro exemplo (anexar):
Esses métodos exigem um esforço mínimo da parte do autor e devem ser preferidos a todos os outros ao serem gravados em arquivos [texto].
fonte
FileNotFoundException
que é lançado quando a operação falha.Se você deseja ter uma experiência relativamente simples, também pode dar uma olhada no pacote Apache Commons IO , mais especificamente na
FileUtils
classe .Nunca se esqueça de verificar as bibliotecas de terceiros. Joda-Time para manipulação de datas, Apache Commons Lang
StringUtils
para operações comuns de strings e isso pode tornar seu código mais legível.Java é uma ótima linguagem, mas a biblioteca padrão às vezes é um pouco de baixo nível. Poderoso, mas de baixo nível, no entanto.
fonte
FileUtils
é ostatic void write(File file, CharSequence data)
. Exemplo de utilização:import org.apache.commons.io.FileUtils;
FileUtils.write(new File("example.txt"), "string with data");
.FileUtils
também temwriteLines
, o que leva umaCollection
das linhas.Se, por algum motivo, você quiser separar o ato de criar e gravar, o equivalente em Java de
touch
écreateNewFile()
faz uma verificação de existência e um arquivo é criado atomicamente. Isso pode ser útil se você quiser garantir que você foi o criador do arquivo antes de gravá-lo, por exemplo.fonte
touch
no sentido geral, mas em seu uso secundário comum, criar um arquivo sem gravar dados nele. O objetivo documentado do toque é atualizar o registro de data e hora no arquivo. Criar o arquivo se ele não existir é realmente o efeito colateral e pode ser desativado com uma opção.exists()/createNewFile()
seqüências são literalmente um desperdício de tempo e espaço.Aqui estão algumas das maneiras possíveis de criar e gravar um arquivo em Java:
Usando FileOutputStream
Usando FileWriter
Usando PrintWriter
Usando OutputStreamWriter
Para mais informações, consulte este tutorial sobre Como ler e gravar arquivos em Java .
fonte
FileWriter
ou deveriaOutputStreamWriter
ser fechado em um bloco finalmente?Usar:
fonte
A melhor maneira é usar o Java7: o Java 7 apresenta uma nova maneira de trabalhar com o sistema de arquivos, juntamente com uma nova classe de utilitário - Arquivos. Usando a classe Files, podemos criar, mover, copiar, excluir arquivos e diretórios também; também pode ser usado para ler e gravar em um arquivo.
Gravação com FileChannel Se você estiver lidando com arquivos grandes, o FileChannel poderá ser mais rápido que o IO padrão. O código a seguir grava String em um arquivo usando o FileChannel:
Escreva com DataOutputStream
Escreva com FileOutputStream
Vamos agora ver como podemos usar o FileOutputStream para gravar dados binários em um arquivo. O código a seguir converte um String int bytes e grava os bytes no arquivo usando um FileOutputStream:
Escreva com PrintWriter , podemos usar um PrintWriter para escrever texto formatado em um arquivo:
Escreva com BufferedWriter: use BufferedWriter para gravar uma String em um novo arquivo:
anexe uma String ao arquivo existente:
fonte
Eu acho que este é o caminho mais curto:
fonte
Para criar um arquivo sem substituir o arquivo existente:
fonte
fonte
exists()/createNewFile()
seqüências são literalmente um desperdício de tempo e espaço.fonte
exists()/createNewFile()
seqüências são literalmente um desperdício de tempo e espaço.Apenas uma linha!
path
eline
são cordasfonte
lines
. Se for umjava.lang.String
, a chamadagetBytes()
produzirá bytes usando a codificação padrão da plataforma , o que não é muito bom no caso geral.A maneira mais simples de encontrar:
Provavelmente funcionará apenas para 1.7+.
fonte
Vale a pena tentar para o Java 7+:
Parece promissor ...
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
Leitura e gravação de arquivos usando entrada e saída:
fonte
Basta incluir este pacote:
E então você pode usar este código para escrever o arquivo:
fonte
No Java 8, use Arquivos e caminhos e a construção try-with-resources.
fonte
Existem algumas maneiras simples, como:
fonte
bw
está sem uso.Você pode até criar um arquivo temporário usando uma propriedade do sistema , que será independente do sistema operacional em uso.
fonte
Usando a biblioteca Guava do Google, podemos criar e gravar em um arquivo com muita facilidade.
O exemplo cria um novo
fruits.txt
arquivo no diretório raiz do projeto.fonte
Lendo coleção com os clientes e salvando em arquivo, com JFilechooser.
fonte
Existem pelo menos várias maneiras de criar um arquivo e gravá-lo:
Arquivos pequenos (1.7)
Você pode usar um dos métodos de gravação para escrever bytes ou linhas em um arquivo.
Esses métodos cuidam da maior parte do trabalho para você, como abrir e fechar o fluxo, mas não se destinam ao tratamento de arquivos grandes.
Gravando arquivos maiores usando E / S de fluxo buffer (1.7)
O
java.nio.file
pacote suporta o canal de E / S, que move dados em buffers, ignorando algumas das camadas que podem causar gargalo no fluxo de E / S.Essa abordagem é preferencial devido ao seu desempenho eficiente, especialmente ao concluir uma grande quantidade de operações de gravação. As operações em buffer têm esse efeito, pois não precisam chamar o método de gravação do sistema operacional para cada byte, reduzindo as operações de E / S dispendiosas.
Usando a API do NIO para copiar (e criar um novo) um arquivo com um Outputstream (1.7)
Existem também métodos adicionais que permitem copiar todos os bytes de um fluxo de entrada para um arquivo.
FileWriter (texto) (<1.7)
Grava diretamente no arquivo (menos desempenho) e deve ser usado apenas quando o número de gravações for menor. Usado para gravar dados orientados a caracteres em um arquivo.
FileOutputStream (binário) (<1.7)
FileOutputStream destina-se a escrever fluxos de bytes brutos, como dados de imagem.
Com essa abordagem, deve-se considerar sempre escrever uma matriz de bytes em vez de escrever um byte de cada vez. A aceleração pode ser bastante significativa - até 10 vezes maior ou mais. Portanto, é recomendável usar os
write(byte[])
métodos sempre que possível.fonte