从 Java 中的 TXT 文件导入数据作为数组
Import Data as Array from TXT File in Java
我想使用 Java 从 .txt 文件导入这样的数据。
我想将其导入为 数组。数据class是这样的:
class SolidStateDrive {
String brand;
String model;
int capacityInGB;
}
所以如果来自 txt 文件的数组是硬编码的,那就是这样的:
ssd[0].brand = Samsung;
ssd[1].brand = Adata;
ssd[0].model = Evo970;
ssd[1].model = SU650;
ssd[0].capacityInGB = 512;
ssd[1].capacityInGB 240;
问题是,当我尝试读取 .txt 文件时,它只能存储第一行的 1 个数据。如果超过一个,就会报错 ArrayOutOfBound Exception.
我正在使用 while 循环,因此只要 nextLine 不为空,它就会循环。这是我的代码:
int n = 0;
SolidStateDrive[] ssd = new SolidStateDrive[n+1];
try {
BufferedReader br = new BufferedReader(new FileReader("SSD.txt"));
String line = null;
while((line = br.readLine()) != null) {
String tmp[] = line.split("\t");
ssd[n] = new SolidStateDrive();
ssd[n].brand = tmp[0];
ssd[n].model = tmp[1];
ssd[n].capacityInGB = Integer.parseInt(tmp[2]);
n++;
}
br.close();
} catch(IOException ex) {
ex.printStackTrace();
}
更新:我已经试过了,但也没用
SolidStateDrive[] ssd = new SolidStateDrive[2];
该文件中的完整代码:pastebin
您在pastebin 中发布的代码出现ArrayOutOfBounds 异常;你有一个循环 n+1 次的 for 循环,它总是比阵列中的 SSD 数量多 1。这是有问题的 for 循环:
for (int j=0; j<=n; j++) {
System.out.println(j+ "\t" +ssd[j].brand+ "\t" +ssd[j].model+ "\t" +ssd[j].capacityInGB);
}
要修复它,只需将 <=
更改为 <
,这样循环会上升到 n
,但不包括 n
,因为您是从 0 而不是 1 开始的. 它应该是这样的:
for (int j = 0; j < n; j++) {
System.out.println(j + "\t" + ssd[j].brand + "\t" + ssd[j].model + "\t" + ssd[j].capacityInGB);
}
问题出在分割线String tmp[] = line.split("\t");
。
从 txt 中提取第一行 ssd[0].brand = Samsung;
split 的输出与输入相同 ssd[0].brand = Samsung;
。
while ((line = br.readLine()) != null) {
String tmp[] = line.split("\t");
ssd[n] = new SolidStateDrive();
ssd[n].brand = tmp[0];
ssd[n].model = tmp[1];
ssd[n].capacityInGB = Integer.parseInt(tmp[2]);
n++;
}
所以 tmp[]
将只包含 tmp[0] = ssd[0].brand = Samsung;
。
当您尝试访问 tmp[1]
时,您将获得
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1.
您的问题的解决方案,
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class ReadData {
public static void main(String[] str) {
readData();
}
public static void readData() {
List<SolidStateDrive> ssd = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader("SSD.txt"))) {
ssd = br.lines().map(s-> {
String[] tmp = s.split("\s+");
return new SolidStateDrive(tmp[0], tmp[1], Integer.parseInt(tmp[2]));
}).collect(Collectors.toList());
} catch (IOException ex) {
ex.printStackTrace();
}
ssd.stream().forEach(System.out::println);
}
}
class SolidStateDrive {
String brand;
String model;
int capacityInGB;
public SolidStateDrive(String brand, String model, int capacityInGB) {
super();
this.brand = brand;
this.model = model;
this.capacityInGB = capacityInGB;
}
@Override
public String toString() {
return "SolidStateDrive [brand=" + brand + ", model=" + model + ", capacityInGB=" + capacityInGB + "]";
}
}
我想使用 Java 从 .txt 文件导入这样的数据。
我想将其导入为 数组。数据class是这样的:
class SolidStateDrive {
String brand;
String model;
int capacityInGB;
}
所以如果来自 txt 文件的数组是硬编码的,那就是这样的:
ssd[0].brand = Samsung;
ssd[1].brand = Adata;
ssd[0].model = Evo970;
ssd[1].model = SU650;
ssd[0].capacityInGB = 512;
ssd[1].capacityInGB 240;
问题是,当我尝试读取 .txt 文件时,它只能存储第一行的 1 个数据。如果超过一个,就会报错 ArrayOutOfBound Exception.
我正在使用 while 循环,因此只要 nextLine 不为空,它就会循环。这是我的代码:
int n = 0;
SolidStateDrive[] ssd = new SolidStateDrive[n+1];
try {
BufferedReader br = new BufferedReader(new FileReader("SSD.txt"));
String line = null;
while((line = br.readLine()) != null) {
String tmp[] = line.split("\t");
ssd[n] = new SolidStateDrive();
ssd[n].brand = tmp[0];
ssd[n].model = tmp[1];
ssd[n].capacityInGB = Integer.parseInt(tmp[2]);
n++;
}
br.close();
} catch(IOException ex) {
ex.printStackTrace();
}
更新:我已经试过了,但也没用
SolidStateDrive[] ssd = new SolidStateDrive[2];
该文件中的完整代码:pastebin
您在pastebin 中发布的代码出现ArrayOutOfBounds 异常;你有一个循环 n+1 次的 for 循环,它总是比阵列中的 SSD 数量多 1。这是有问题的 for 循环:
for (int j=0; j<=n; j++) {
System.out.println(j+ "\t" +ssd[j].brand+ "\t" +ssd[j].model+ "\t" +ssd[j].capacityInGB);
}
要修复它,只需将 <=
更改为 <
,这样循环会上升到 n
,但不包括 n
,因为您是从 0 而不是 1 开始的. 它应该是这样的:
for (int j = 0; j < n; j++) {
System.out.println(j + "\t" + ssd[j].brand + "\t" + ssd[j].model + "\t" + ssd[j].capacityInGB);
}
问题出在分割线String tmp[] = line.split("\t");
。
从 txt 中提取第一行 ssd[0].brand = Samsung;
split 的输出与输入相同 ssd[0].brand = Samsung;
。
while ((line = br.readLine()) != null) {
String tmp[] = line.split("\t");
ssd[n] = new SolidStateDrive();
ssd[n].brand = tmp[0];
ssd[n].model = tmp[1];
ssd[n].capacityInGB = Integer.parseInt(tmp[2]);
n++;
}
所以 tmp[]
将只包含 tmp[0] = ssd[0].brand = Samsung;
。
当您尝试访问 tmp[1]
时,您将获得
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1.
您的问题的解决方案,
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class ReadData {
public static void main(String[] str) {
readData();
}
public static void readData() {
List<SolidStateDrive> ssd = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader("SSD.txt"))) {
ssd = br.lines().map(s-> {
String[] tmp = s.split("\s+");
return new SolidStateDrive(tmp[0], tmp[1], Integer.parseInt(tmp[2]));
}).collect(Collectors.toList());
} catch (IOException ex) {
ex.printStackTrace();
}
ssd.stream().forEach(System.out::println);
}
}
class SolidStateDrive {
String brand;
String model;
int capacityInGB;
public SolidStateDrive(String brand, String model, int capacityInGB) {
super();
this.brand = brand;
this.model = model;
this.capacityInGB = capacityInGB;
}
@Override
public String toString() {
return "SolidStateDrive [brand=" + brand + ", model=" + model + ", capacityInGB=" + capacityInGB + "]";
}
}