Leitura de Arquivos de Dados em Java

Bom dia! Estou com dificuldades em desenvolver um algoritmo capaz de ler dados numéricos em arquivo no formato .txt. Tenho interesse em ler arquivos com matrizes de valores em .txt e armazenar essas matrizes em arrays como matrizes multidimensionais (matriz), para posteriormente realizar operações matemáticas com os valores (soma de linhas, soma de colunas, entre outras operações). Já li vários posts porém nenhum solucionou o meu problema.
Um exemplo de matriz: A matriz 4x4 abaixo. Porém utilizo matrizes com muitas linhas e colunas.

1 1 22.4
1 2 20
2 1 34.5
2 2 25.4

Já entendi toda a lógica de utilizar os comandos para a leitura dos dados. A minha dificuldade é em armazenar a matriz que está em .txt em um array multidimensional (matriz) semelhante. Segue abaixo o algoritmo por mim utilizado para leitura dos dados. Se alguém puder ajudar fico agradecido.

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

package leituraarq;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class LeituraArq {

public static void main(String[] args) {

try{
FileInputStream arquivo = new FileInputStream(“dados.txt”);
InputStreamReader input = new InputStreamReader(arquivo);
BufferedReader br = new BufferedReader(input);

String linha;

do{
linha = br.readLine();
if(linha != null){

String[] dados = linha.split(" ");

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

System.out.print(dados + " ");
}

}
} while (linha !=null);

}
catch(Exception e) {
System.out.println(“Erro ao ler o arquivo”);
}}}

Segue o exemplo, estou usando um List para gravar os dados:

OBS: Este exercício foi criado para fins didático, não entra em pauta a melhor solução ou o “Designer Patterns” mais adequado.

package file;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;


public class ExemploLeituraArquivo {

    public static void main(String[] args) {

        BufferedReader br = null;
        // Gravar todos os dados do arquivo numa lista
        List<String []> list = new ArrayList<String []>();
        try {

            String str;

            br = new BufferedReader(new FileReader("C:\\dados.txt"));

            while ((str = br.readLine()) != null) {
                
                // Obtem valores separados
                String [] valores = str.split(" ");
                
                list.add(valores);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null)br.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        

        // trabalhando posteriormente
        // soma os valores
        double total = 0.00;
        for(String [] valores : list){
            for (String valor : valores) {
                try {
                    total += Double.parseDouble(valor);
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
            }
            System.out.println("Valor da linha : "+total);
        }    
    }

}

Agradeço a colaboração. Mas acho que vc não entendeu a minha duvida. Para mim pouco importa a parte da operação matemática (soma). A minha duvida é como passar os dados em txt para uma matriz para depois eu poder acessar qualquer posição da matriz.

Por exemplo, se eu ter um arquivo txt com a matriz abaixo. Eu preciso de um algoritmo que transforme em um array assim: matriz = {{1, 1, 20},{1, 2,30},…,{2,3,15}}. Depois como acessar os valores da matriz eu me viro. A minha duvida é como eu jogo depois do split cada valor para a posição correspondente do array multidimensional matriz (6x3) por exemplo.

1 1 20
1 2 30
1 3 50
2 1 66
2 2 25
2 3 15

Bom dia,

O Exemplo acima está da forma que você precisa, um List contém as linhas com os valores que você precisa, para manipular estas informações é melhor utilizar um List, copie o exemplo e testa.

Realmetne retorna, porém eu preciso que conserve a estrutura de matriz, pois dentro da matriz existem identificações além de simples valores. Segue abaixo um algortimo que estou trabalhando porém está com problemas na matriz, pois está retornando em cada linha a ultima linha do arquivo txt. Se algúem puder ajudar a solucionar este problema fico agradecido. O meu arquivo txt possuía uma matriz 6x3

package leituraarq2;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class LeituraArq3 {

public static void main(String[] args) {
try{
FileInputStream arquivo = new FileInputStream(“dados.txt”;
InputStreamReader input = new InputStreamReader(arquivo);

BufferedReader br3 = new BufferedReader(input);

double[][] dados1 = new double[6][3];

double dados2;
String linha;

do {
linha = br3.readLine();

if(linha != null){

String[] dados;
dados = linha.split(" ");

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

for(int j = 0; j < 6 ; j++)

dados1[j] = Double.parseDouble(dados);

}
}

} while (linha !=null);

for(int l = 0; l < 6; l++){
for(int m = 0; m < 3; m++) {

System.out.print(dados1[l][m] + " “);
}
System.out.println(”");
}

}
catch(Exception e) {
System.out.println(“Erro ao ler o arquivo”);
}
}
}

Da para fazer desta maneira

// Convertendo um List para Array
String[][] ar = list.toArray(new String[0][]);

ou pelo índice do List

String[] ar1 = list.get(0);
String[] ar2 = list.get(1);

A vantagem de usar o List, você pode manipular dinamicamente.

Se você conhecer as dimensões da matriz de antemão você pode fazer assim:

Scanner sc = new Scanner(new File("dados.txt"));

final int linhas = 10;
final int colunas = 10;
final int[][] matriz = new int[linhas][colunas];

for(int i = 0 ; i < linhas ; i++){
    for(int j = 0 ; j < colunas ; j++){
        matriz[i][j] = sc.nextDouble();
    }
}

Não compreendi mto bem sua idéia. Pode explicar melhor.

Use .length() para contar a quantidade de números no arquivo,depois implemente uma lógica para pegar cada valor.

Aproveitando a ideia rmendes segue um exemplo que efetua a leitura independente do tamanho do arquivo e no final disponibiliza em uma matriz tipo double.

    public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(new File("C:\\dados.txt"));
        List<double []> list = new ArrayList<double []>();
        
        while (scanner.hasNext()) {
            String [] ar = scanner.nextLine().split(" ");
            double[] parsed = new double[ar.length];
            for (int i = 0; i<ar.length; i++) parsed[i] = Double.valueOf(ar[i]);
            list.add(parsed);
        }
        
        // Resultado final uma matrix com os valores Double
        double[][]matrix = list.toArray(new double[0][]);
    }

Obrigado ninjaerudito e mendes08 a colaboração de vocês foi de grande ajuda!