Ler matrizes de um arquivo txt e colocá-las em uma variável double[][]

6 respostas
J

Olá denovo,
Estou com uma dúvida quanto à leitura de arquivos. Eu quero saber se tem uma maneira de eu ler um arquivo txt que contém uma matriz e jogá-la em uma variável do tipo double[][]. E se é possível identificar mais de uma matriz no mesmo arquivo txt (depois de uma linha em branco por exemplo).

Por exemplo, digamos que o meu arquivo txt seja:

1.5 2.8 1.0 0.5 0.2 1.9 3.0 3.1 3.0

3.0 1.0 1.0
0.1 0.2 0.3
1.5 1.5 1.5

Eu gostaria que o programa lesse este arquivo e colocasse essas duas matrizes em double a[][] e double b[][] (ou em um array de double[][], para que eu possa ler quantas matrizes eu quiser do mesmo arquivo, e não só duas).

Eu já peguei um exemplo na net de um método que lê arquivos e os imprime na tela, que está funcionando certo no meu programa. Só gostaria de saber como tratar isso que ele leu para jogar dentro das variáveis double[][]. Segue abaixo código do método que lê o arquivo que estou usando.

public void lerArquivo(String arquivo) throws java.io.FileNotFoundException,java.io.IOException{
    
        File file = new File(arquivo);
        FileInputStream fis = null;
        BufferedInputStream bis = null;
        DataInputStream dis = null;

        try {
        fis = new FileInputStream(file);

        // Here BufferedInputStream is added for fast reading.
        bis = new BufferedInputStream(fis);
        dis = new DataInputStream(bis);

        // dis.available() returns 0 if the file does not have more lines.
        while (dis.available() != 0) {

        // this statement reads the line from the file and print it to
            // the console.
            System.out.println(dis.readLine());
        }

        } catch (FileNotFoundException e) {
        e.printStackTrace();
        } catch (IOException e) {
        e.printStackTrace();
        }finally{
            fis.close();
            bis.close();
            dis.close();
        }
    }

Obrigado desde já!

6 Respostas

khaoz

Vou te dar apenas dicas e não resolver seu exercício:

  1. Estude o método split da classe String e aplique em cada linha. Com base no resultado é com você popular sua matriz.
  2. Como você mesmo disse, no seu exemplo, depois da primeira, novas matrizes começam após linhas em branco

Abraço.

maja

Bom dia!!!

O que você irá ler são linhas de string, logo precisará fazer um parse (Double.parseDouble()) para transforma-las .
Para fazer isso que deseja é importante manter um padrão no arquivo, sendo que os números estão separados por um espaço e as matrizes por uma linha em branco.

Eu faria da seguinte forma:

String linha = dis.readLine();

//Separa a string conforme o separador informado
String[] split = linha.split(" ");

Assim no vetor eu tenho as strings com os números e usando o parse terei double, dessa forma:

for(int 1 = 0; i < split.length; i++){

double d = Double.parseDouble(split[i]);

}

Para que possa ler quantas matrizes quiser utilize uma lista: List<Double[][]> lista = new ArrayList<Double[][]>();

O restante da lógica deixo com você, qualquer dúvida posta ai.

khaoz

maja,

Vejo que é seu primeiro post, então aconselho uma lida neste artigo.

Utilizar as tags de formatação do fórum ajudam na legibilidade do seu post, principalmente códigos.

Abraço.

maja

khaoz

Obrigado!!! Irei utilizá-los

J

EDIT

Já descobri o problema. Eu havia definido o tipo de lista errado na classe executável =P

=======

Valeu pela ajuda maja! Me baseando no que você falou consegui pegar os dados do arquivo txt, separá-los em matrizes e guardar em um ArrayList.

Porém tenho uma dúvida. Os métodos que eu criei para a manipulação das matrizes, todos recebem como parâmetro variáveis do tipo double[][]. Como faço para pegar as matrizes do ArrayList para poder usar nos meus métodos.
Tentei assim mas nao funciona:

// A leitura do arquivo funciona normalmente.
ArrayList lista = reader.lerArquivo(arquivo);

//o método pTensorial do objeto oper recebe como parâmetros duas matrizes
//Exemplo: oper.pTensorial(a[][], b[][]);
oper.pTensorial(lista.get(1),lista.get(2));
maja

Pelo que entendi falta definir o tipo do ArrayList como ArrayList<Double[][]>, pois como está ele te retornará tipos Object e seu método precisa de doubles ou fazer um cast quando chamar o get, o que não é muito recomendável.

Criado 1 de outubro de 2012
Ultima resposta 3 de out. de 2012
Respostas 6
Participantes 3