Caros,
Tenho uma matriz de inteiros e necessito escrevê-la em um arquivo .txt como segue:
01001010
01001000
01011101
…
E assim por diante.
O que sei, é que devo criar uma Stream do tipo FileOutputStream. Porém, qual classe devo instanciar para que eu consiga escrever o array no stream como no exemplo acima?
E como lê-la de forma que eu consiga transformá-la em uma matriz de inteiros novamente, resgatando as informações do arquivo?
Voce pode fazer assim
File f = new File("C:\arq.txt");
try{
if(!f.exists())
f.createNewFile();
int[][] array = {{0,1,0,0,1,0,1,0},{0,1,0,0,1,0,0,0},{0,1,0,1,1,1,0,1}};
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file));
out.writeObject(array);
}catch(Throwable e){
e.printStackTrace();
}
Olá
Como alternativa, você pode imprimir o array normalmente no System.out e executar seu programa assim:
java Programa > arquivo_de_saida.txt
Para ler, você pode abrir um BufferedReader:
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
E executar seu programa assim:
java Programa < arquivo_texto.txt
Ou então, você pode usar um FileReader:
BufferedReader bf = new BufferedReader(new FileReader("caminho do arquivo texto"));
Abraços
Certo. Os dados ficam incompreensíveis porque o que foi escrito no arquivo foi o objeto, correto?
Não existem meios de colocar como texto, para que tenhamos acesso ao seu conteúdo?
Deixe explicar a situação:
Preciso desenvolver um programa que leia uma palavra, transforme todos os seus caracteres em binário, armazene em um arquivo txt.
Preciso ter acesso ao conteúdo do arquivo de forma prática, para alterar algum dos caracteres e provocar uma alteração proposital no arquivo.
Depois preciso ler esse arquivo, através de programa JAVA e constatar as mudanças, revertendo os binários em caracteres ou String.
Agradeço desde já!
Seu inteiro por ter mais de um dígito? Se sim, vai precisar ou gravar binários ou um texto com posições fixas ou caracter separador.
Você deve percorrer cada item do seu array bidimensional e grava a informação.
Qual a tua maior dificuldade?
[quote=danieldestro]Seu inteiro por ter mais de um dígito? Se sim, vai precisar ou gravar binários ou um texto com posições fixas ou caracter separador.
Você deve percorrer cada item do seu array bidimensional e grava a informação.
Qual a tua maior dificuldade?[/quote]
Minha maior dificuldade está em gravar os dados no arquivo no seguinte formato ou em algum formato compreensível, onde possamos divisar as linhas do array:
01001010
01001000
01011101
ou
01001010#01001000#01011101
algo assim.
Meus inteiros são apenas 0 e 1. Me aconselharia a trabalhar como, para que eu consiga fazer isso?
Como trabalhar com caracteres verificadores ou tranformar tudo em binários ou bytes para facilitar a escrita e a leitura em arquivos?
File f = new File("C:\arq.txt");
try{
if(!f.exists())
f.createNewFile();
int[][] array = {{0,1,0,0,1,0,1,0},{0,1,0,0,1,0,0,0},{0,1,0,1,1,1,0,1}};
FileWriter out = new FileWriter(file);
for(int i= 0; i< array.length;i++){
for(int j = 0;j<array[i].length;j++)
out.append(array[i][j]);
out.append("\n");
}
out.close();
}catch(Throwable e){
e.printStackTrace();
}
Coloca um \n no final de cada linha, indica quebra de linha …
[quote=Mark_Ameba][code]
File f = new File(“C:\arq.txt”);
try{
if(!f.exists())
f.createNewFile();
int[][] array = {{0,1,0,0,1,0,1,0},{0,1,0,0,1,0,0,0},{0,1,0,1,1,1,0,1}};
FileWriter out = new FileWriter(file);
for(int i= 0; i< array.length;i++){
for(int j = 0;j<array[i].length;j++)
out.append(array[i][j]);
out.append("\n");
}
out.close();
}catch(Throwable e){
e.printStackTrace();
}
[/code][/quote]
O método append() da classe FileWriter não pode receber como parâmetro um inteiro. Esse é o erro retornado. Tentei resolver fazendo um cast para char, porém nada é escrito no arquivo.
Acredito ter encontrado o problema.
Quando mando escrever em um arquivo dados primitivos, tenho resultados como o que segue ao ler o arquivo:
" ?¨õÃ?ª=q?¸Qì"
O que pode ser esse problema? Quando mando escrever em UTF e passo uma String, consigo ler os dados.
Se o resultado estiver dessa forma, posso resgatar as informações mais tarde e terei o mesmo resultado de antes?
Muda isso:
fw.append(array[i][j]);
Por:
fw.append(String.valueOf(array[i][j]);
//Ou:
fw.append(Integer.toString(array[i][j]);
[quote=Mark_Ameba]Muda isso:
fw.append(array[i][j]);
Por:
fw.append(String.valueOf(array[i][j]);
//Ou:
fw.append(Integer.toString(array[i][j]);
[/quote]
Funcionou dessa forma como vc descreveu. O resultado é como segue:
001001101
001000001
001000010
001001011
001000100
001001110
001011010
001001000
001000100
001011000
Abrindo o arquivo txt, não conseguimos visualizar os dados dessa forma, porém, quando colamos em qualquer outro lugar, ele já reconhece o dígito referente à quebra de linha. Esse agora não é o maior dos problemas.
Como vc faria a leitura desses dados, a ponto de conseguir transformá-los em uma matriz de inteiros novamente?
[color=red]Tentei utilizar um: DataOutputStream >> BufferedOutputStream >> FileOutputStream. Porém, a gravação está chegando distorcida ou codificada de alguma forma. Quando mando escrever um tipo primitivo, ele coloca aqueles retêngulos em pé, que na maioria das vezes representam caracteres não identificados.[/color]
Cara eu faria isso só com o FileWriter e escreveria do modo que mostrei,e traria de volta com o Scanner
Lendo linha por linha (scanner.nextLine())depois quebro a string em chars (string.toCharArray()) e trabalho com os valores do char (Maslembresse em converter os chars para byte ou int pois então você vera apenas quadrados ^^
[quote=Mark_Ameba]Cara eu faria isso só com o FileWriter e escreveria do modo que mostrei,e traria de volta com o Scanner
Lendo linha por linha (scanner.nextLine())depois quebro a string em chars (string.toCharArray()) e trabalho com os valores do char (Maslembresse em converter os chars para byte ou int pois então você vera apenas quadrados ^^[/quote]
Segui seu conselho e agora estou trabalhando na leitura do arquivo. Utilizei um Scanner e agora gravo as linhas em um Vector de String para depois trabalhar o array de Char. É o melhor modo de se fazer isso?
Pergunto pq creio que não temos como saber o número de linhas do arquivo sem percorrê-lo inteiro para contar, temos? Pq tenho que saber o número de linhas do arquivo para declarar o array de inteiros.
Se conseguisse saber o número de linhas do arquivo antes, não seria necessária a instância de Vector. Porém, se para saber isso eu necessitar percorrer o arquivo inteiro, creio que o Vector seja mais vantajoso. Tem algum palpite?
Realmente não sei como descobrir quantas linhas tem o arquivo.
Use o Vector mesmo,mas não use a classe Vector e sim List.