Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Beraldo

[Resolvido] Ler/Escrever Strings com RandomAccessFile

Recommended Posts

Estou com dificuldades para ler e escrever strings em arquivos usando a classe RandomAccessFile.

 

Primeiro tentei entender a diferença entre writeBytes() e writeChars(). Pelo que entendi, o primeiro método salva caracteres com 1 bytes (como em C) e a segunda, em 2 bytes (padrão do Java). Estou certo? É só essa a diferença? E qual delas deve ser utilizada?

 

 

Fiz um teste aqui e o texto é devidamente salvo no arquivo. Porém, não consigo recuperar os dois valores.

 

import java.io.RandomAccessFile;
import java.io.FileNotFoundException;
import java.io.IOException;


public class Test
{

	public static final String FILENAME = "arq.dat";
	
	public static void main( String[] args )
	{
		String str = null, str2 = null;
		Test t = new Test();
		RandomAccessFile raf = t.abrirArquivo( Test.FILENAME, "rw" );
		
		try
		{
			raf.writeBytes( "Beraldo" );
			raf.writeBytes( "Roberto" );
		}
		catch( IOException IOE )
		{
			System.err.println( IOE.getMessage() );
		}
		
		t.fecharArquivo( raf );
		
		
		raf = t.abrirArquivo( Test.FILENAME, "r" );
		
		try
		{
			str = raf.readLine();
			str2 = raf.readLine();
		}
		catch ( IOException IOE )
		{
			System.err.println( IOE.getMessage() );
		}
		
		System.out.println( "Lido do arquivo: " + str + " | " + str2 );
		
		
	}
	/*----------------------------------*/
	
	
	public RandomAccessFile abrirArquivo( String filename, String mode )
	{
		RandomAccessFile raf = null;
		
		try
		{
			raf = new RandomAccessFile( filename, mode );
		}
		catch ( FileNotFoundException FNFE )
		{
			System.err.println( "Arquivo " + filename + "  não encontrado" );
		}
		
		return raf;
	}
	/*----------------------------------------*/
	
	
	public void fecharArquivo( RandomAccessFile raf )
	{
		try
		{
			raf.close();
		}
		catch ( IOException IOE )
		{
			System.err.println( "Erro ao fechar arquivo: " + IOE.getMessage() );
		}
	}
	/*-----------------------------------*/

}

 

Eu deveria usar readChar(), certo? Se sim, terei de fixar tamanhos para as strings, para ler X bytes, que representariam uma string, a fim de saber onde devo finalizar a leitura da string. Estou certo?

 

 

Eu quero tratar tudo como bytes, pois esse é u trecho que fiz para testar. O programa que preciso fazer envolve vários tipos de dados, sendo necessário usar arquivo binário.

 

 

Sugestões? :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu li a documentação dos métodos citados e pelo menos o que fala lá é exatamente o que voce entendeu.

 

Testei o código e ele recuperou o conteúdo do arquivo. Somente um detalhe.

 

O método writeBytes não acrescenta o caracter "\n", portanto para ler com redline voce teria que sempre após um dado inserido colocar o "\n" também

 

Será que é questão de sistema operacional? Aqui leu normalmente.

 

Alteração que eu fiz:

 

       raf.writeBytes( "Beraldo" );
       raf.writeBytes("\n");
       raf.writeBytes( "Roberto" );

resultado:

 

Lido do arquivo: Beraldo | Roberto

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

o readLine funcionou aqui. Mas, como eu citei antes, eu quero tratar o arquivo como binário.

 

Mas, pensando melhor, se eu sempre inserir um \n no final da string, vou poder usar readLine(). Eu não havia pensado nisso... <_<

 

 

O arquivo ficará com \n, mas isso não é, necessariamente, um problema.

 

 

Testei o código abaixo e funcionou perfeitamente:

 

import java.io.RandomAccessFile;
import java.io.FileNotFoundException;
import java.io.IOException;


public class Test
{

	public static final String FILENAME = "arq.dat";
	public static final int STRSIZE = 20;
	public static final int TOTAL = 10;
	
	public static void main( String[] args )
	{
		String str;
		int x;
		Test t = new Test();
		RandomAccessFile raf = t.abrirArquivo( Test.FILENAME, "rw" );
		
		for ( int i = 0; i < Test.TOTAL; i++ )
		{
			try
			{
				raf.writeBytes( new String( "str" + i + "\n" ) );
				raf.writeInt( i );
			}
			catch( IOException IOE )
			{
				System.err.println( IOE.getMessage() );
			}
		}
		
		t.fecharArquivo( raf );
		
		
		raf = t.abrirArquivo( Test.FILENAME, "r" );
		
		for ( int i = 0; i < Test.TOTAL; i++ )
		{
			try
			{
				str = raf.readLine();
				x = raf.readInt();
				System.out.print( x + " | " + str );
			}
			catch( IOException IOE )
			{
				System.err.println( IOE.getMessage() );
			}
		}
	}
	/*----------------------------------*/
	
	
	public RandomAccessFile abrirArquivo( String filename, String mode )
	{
		RandomAccessFile raf = null;
		
		try
		{
			raf = new RandomAccessFile( filename, mode );
		}
		catch ( FileNotFoundException FNFE )
		{
			System.err.println( "Arquivo " + filename + "  não encontrado" );
		}
		
		return raf;
	}
	/*----------------------------------------*/
	
	
	public void fecharArquivo( RandomAccessFile raf )
	{
		try
		{
			raf.close();
		}
		catch ( IOException IOE )
		{
			System.err.println( "Erro ao fechar arquivo: " + IOE.getMessage() );
		}
	}
	/*-----------------------------------*/

}

 

Vou usar isso mesmo.

 

Valeu!

 

[Resolvido]

 

:D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem! Apenas como adicional, digo-lhe que há outras maneiras de se trabalhar com arquivos. Digo isso porque quando estava aprendendo Java só usava RandomAccessFile. Se você parar pra pensar, RandomAccessFile acessa o arquivo diretamente. A cada vez que você manda escrever dados (writeBytes) o objeto acessa o arquivo diretamente pra gravar os dados. A vantagem é que RandomAccessFile se comporta como uma grande matriz de bytes armazenada no arquivo. Você pode tanto efetuar comandos de entrada como de saída.

 

Se você estiver trabalhando com operações repetitivas muito caro acessar o arquivo toda hora pra escrever alguns bytes nele. O ideal seria criar um buffer. Assim o objeto armazenaria todas as alterações e depois acessaria o arquivo uma única vez pra descarregar os dados.

 

Imagine que você tenha um método específico pra ler dados de um arquivo. Neste cenário seria muito melhor fazer desta maneira.

FileInputStream fis = new FileInputStream(new File("url"));
BufferedReader br = new BufferedReader(fis);
br.readLine();
E para escrever existe o objeto FileOutputStream e BufferedWriter.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é, eu li sobre criar buffer. Mas optei por usar RandomAccessFile pois possuiu o método seek(), que me permitiria acessar qualquer parte do arquivo. Algo como usar fwrite/fread e fseek, do C.

 

Fiz isso mais para conhecer manipulação de arquivos em Java. Já vou adaptar o sistema para usar BD. :)

 

 

Mas valeu pela dica. http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.