Lendo de maneira rapida o conteudo de um arquivo

12 respostas
rafael.espiritosanto

Ola!!

Eu gostaria de adicionar o conteudo ao fim de um arquivo.
No entanto gostaria de saber se existe uma maneira facil de faze-lo
sem ter que usar while ou coisas do genero.

O problema neste código é que eu não sei como instanciar um CharBuffer pra poder
ir adicionando conteudo ao arquivo.

File file = new File(nomeArquivo);
		FileWriter fileWriter;
		FileReader fileReader;
		CharBuffer charBuffer = null;
		try {
			file.createNewFile();
			fileReader = new FileReader(file);
			fileReader.read(charBuffer);
			charBuffer.append(conteudo);
			
			fileWriter = new FileWriter(file);
			fileWriter.append(charBuffer);
			fileWriter.append(conteudo);
			fileWriter.flush();
			fileWriter.close();

Alguém pode explicar como utilizar o CharBuffer ou
então postar algum código simples pra ler o conteudo de
um arquivo e poder adicionar conteudo e gravar em disco
sem ter que ficar usando while ou coisa do tipo?

Obrigado!

12 Respostas

Rafael_Nunes

Sem ter que usar um laço eu acho um tanto difícil você encontrar. Mas afinal, qual o problema de se usar?

E utilize BufferedReader/BufferedWriter pra ficar mais performático.

Ou também dá uma olhada no commons.io

Marky.Vasconcelos

Tem também as classe da java.nio, se você procurar tem ótimos tutoriais na internet.

rafael.espiritosanto

Não tem problema algum…
E mais por saber se existe uma maneira mais rápida de se ler e gravar conteudo em arquivo

Rafael_Nunes

A programação geralmente é isso, através de laços.

Quanto ao tempo de processamento e consumo de memória, BufferedWriter/Reader deve ajudar já.

Marky.Vasconcelos

Para ler você pode usar até a classe Scanner

mas continuaria usando o loop

Para escrever direto, depois do arquivo você na hora de criar seu FileWriter passe um segundo argumento como true

new FileWriter(file,true);

Não lembro se é true ou false, mas testa ai que um reescreve no arquivo e o outro depois do final

rafael.espiritosanto

Pow… esse código tá sobrescrevendo o conteúdo. Daí eu só consigo registrar a última operacao

File file = new File(nomeArquivo);
			file.createNewFile();
			FileReader fileReader = new FileReader(file);
			FileWriter fileWriter = new FileWriter(file);
			Scanner scan = new Scanner(fileReader);
			StringBuilder builder = new StringBuilder();
			
			while (scan.hasNext()) {
				builder.append(scan.nextLine() + "\n");
			}
			
			fileReader.close();
			builder.append(conteudo);
			fileWriter.append(builder);
			fileWriter.flush();
			fileWriter.close();
alissin

Rafael, eu uso assim:
para ler:

try { String nomeArquivo = "c:\arquivos\arquivo.txt"; FileReader fin = new FileReader(nomeArquivo); BufferedReader buf = new BufferedReader(fin); String linha; StringTokenizer descLinha; while ((linha = buf.readLine()) != null) { descLinha = new StringTokenizer(linha, "\n"); descLinha.nextToken(); ... } } catch (FileNotFoundException e) { throw new Exception("Não foi possível abrir o arquivo especificado.\nCertifique-se de que o caminho do arquivo config.ini no fonte está correto."); } catch (IOException e) { throw new Exception("Não foi possível abrir o arquivo especificado (IOException)."); } catch (Exception e) { throw new Exception("Não foi possível abrir o arquivo especificado (Exception)."); }

e para escrever:
String nomeArquivo = null; try { File dir = new File("C:\arquivos\"); dir.mkdirs(); nomeArquivo = "C:\arquivos\arquivo.txt"; FileWriter fout = new FileWriter(nomeArquivo); PrintWriter prt = new PrintWriter(fout); StringBuffer arq = new StringBuffer(); arq.append("valor1"+"valor2"+"\n"); prt.println(arq.toString()); prt.close(); } catch (Exception e) { throw e; }

de alguma forma eu uso looping mas nao acho taaao lendo nao.
Espero que possa ajudar!
[]'s

Marky.Vasconcelos
rafael.espiritosanto:
Pow... esse código tá sobrescrevendo o conteúdo. Daí eu só consigo registrar a última operacao
File file = new File(nomeArquivo);
			file.createNewFile();
			FileReader fileReader = new FileReader(file);
			FileWriter fileWriter = new FileWriter(file);
			Scanner scan = new Scanner(fileReader);
			StringBuilder builder = new StringBuilder();
			
			while (scan.hasNext()) {
				builder.append(scan.nextLine() + "\n");
			}
			
			fileReader.close();
			builder.append(conteudo);
			fileWriter.append(builder);
			fileWriter.flush();
			fileWriter.close();

Vocepode passar o File direto para o scan

File file = new File(nomeArquivo);
			file.createNewFile();
			FileWriter fileWriter = new FileWriter(file);
			Scanner scan = new Scanner(file);
			StringBuilder builder = new StringBuilder();
			
			while (scan.hasNext()) {
				builder.append(scan.nextLine() + "\n");
			}
			
			fileReader.close();
			builder.append(conteudo);
			fileWriter.append(builder);
			fileWriter.flush();
			fileWriter.close();
Guitar_Men

Em C agente podia abrir os arquivos no modo APEND, isto é todo conteúdo era adicionado no final do arquivo, deve ter algo parecido em java…

rafael.espiritosanto

Pois é! Tá acontecendo algo muito estranho.
Porque o arquivo tem conteúdo, mas quando chega na parte do loop o código passa direto.
Até modifiquei pra como no exemplo acima mas nada…

File file = new File(nomeArquivo);
			file.createNewFile();   
			FileReader fin = new FileReader(file);
			FileWriter fileWriter = new FileWriter(file);
			BufferedReader buf = new BufferedReader(fin);
			StringBuilder builder = new StringBuilder();
			String linha;
			StringTokenizer descLinha;
			while ((linha = buf.readLine()) != null) {
				descLinha = new StringTokenizer(linha, "\n");
				builder.append(descLinha.nextToken() + "\n");
			}
			builder.append(conteudo);
			fileWriter.append(builder);
			fileWriter.flush();
			fin.close();
			fileWriter.close();
alissin

Olha só fii…

peguei da API…
boolean createNewFile()
Atomically creates a new, empty file named by this abstract pathname if and only if a file with this name does not yet exist.

é o seguinte… acho que vc deve tirar essa linha:
file.createNewFile();

assim, vc passa pra proxima linha, o file que vc instanciou da String nomeArquivo tendeu?!

Creio também que vc nao irá precisar de utilizar o builder não…
o arquivo é de texto certo!?

rafael.espiritosanto

Está linha não é a causa do problema.
Se eu tirar esta linha, quando o programa rodar pela primeira vez vai dar exception pois o arquivo
não existe. Este método cria o arquivo pra mim na primeira vez.

O erro por incrível que pareça é ridículo. Eu instanciava o FileWriter antes de ler o conteúdo
do arquivo, daí ele apagava todo o conteúdo e só gravava a última operação.

Só instanciar o FileWriter depois de já ter lido o conteúdo do arquivo.

Valeu pela ajuda!!!

Criado 13 de março de 2008
Ultima resposta 13 de mar. de 2008
Respostas 12
Participantes 5