Считать двумерный массив из файла используя BufferedReader
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
reader.readLine();
String[] split = reader.readLine().trim().split(" +");
double[][] arr = new double[split.length][split.length];
String line;
while ((line = reader.readLine()) != null) {
for (int i = 0; i < split.length; i++) {
String[] split2 = reader.readLine().trim().split(" +");
for (int j = 0; j < split.length; j++) {
arr[i][j] = Double.parseDouble(split2[j]);
}
}
}
return arr;
} catch (IOException e) {
System.out.println("Error reading file");
return null;
}
}
Разработать метод, который считывает из текстового файла элементы двумерного массива целых чисел размером NxN элементов.
Примечание: Первая строка файла содержит одно целое число N. Следующие N строк содержат по N действительных чисел - элементы заданного массива.
В общем надо написать это на BufferedReader, надо пропустить первую строку (в ней хранится число 100), а все остальные считать, но в моем варианте выдает ошибку:
Cannot invoke "String.trim()" because the return value of "java.io.BufferedReader.readLine()" is null
Помогите пожалуйста
Ответы (2 шт):
Лучше использовать класс Scanner, в котором можно использовать методы Scanner::nextInt, Scanner::nextDouble, а также Scanner::hasNextDouble, чтобы не выйти за пределы файла в случае, если число строк/данных меньше чем должно быть:
static double[][] readFile(String fileName) throws FileNotFoundException {
try (Scanner sc = new Scanner(new File(fileName))) {
int n = sc.nextInt();
double[][] res = new double[n][n];
for (int i = 0; i < n * n && sc.hasNextDouble(); i++) {
res[i / n][i % n] = sc.nextDouble();
}
return res;
}
}
Если необходимо было воспользоваться именно BufferedReader для чтения файла, то каждую строку можно было бы анализировать при помощи сканера вместо разбивания на массив при помощи String::split:
static double[][] readFile(String fileName) throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {
int n = Integer.parseInt(br.readLine());
double[][] res = new double[n][n];
String line;
int row = 0;
while ((line = br.readLine()) != null) {
Scanner sc = new Scanner(line);
for (int i = 0; i < n && sc.hasNextDouble(); i++) {
res[row][i] = sc.nextDouble();
}
row++;
}
return res;
}
}
public double[][] readTwoDimensionalArray(File file) {
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
double[][] arr = null;
int row = 0;
int size = 0;
reader.readLine();
String line;
while ((line = reader.readLine()) != null) {
String[] split = line.trim().split(" +");
if (arr == null) {
size = split.length;
arr = new double[size][size];
}
for (int col = 0; col < size; col++) {
arr[row][col] = Double.parseDouble(split[col]);
}
row++;
}
return arr;
} catch (IOException e) {
System.out.println("Error reading file");
return null;
}
}