java - 为什么 FileReader 不读取超出第一行末尾的内容?
问题描述
我正在尝试使用 FileReader 从文本文件中读取数据。有四行文字。每行具有相同的属性类型(名字、姓氏、dob、ssn 等)。我正在尝试将“”分隔符读取的数据拆分为一个长数组,然后将这些值分配给一个记录 ArrayList。我的逻辑(如果你甚至可以这样称呼它)是,通过这样做,我将拥有一个巨大的字符串数据数组,然后我可以将其分配给记录的 7 个字段中的每一个 - 第一条记录为 0-6,7-第二条记录为 13,第三条记录为 14-20 ......但看起来我的 while 循环在第一行的末尾停止。我在这里感到非常愚蠢,但我无法弄清楚如何让它发挥作用。是的,我知道,我的代码中有很多不好的形式,但我只是想了解一下功能。这里的任何建议将不胜感激。谢谢!
文本文件如下所示:
John Smith 1996.03.07 123-45-6789 Chickenpox BedRest aspirin
Joe Blow 1996.03.07 123-45-6888 Smallpox BedRest Whiskey
Julie Wilson 1996.03.07 123-45-6999 Insomnia Exercise HotPeppers
Wayne Blaine 1942.07.07 123-45-6777 Measles WaitToGetBetter CodLiverOil
这是我的主要内容。
public static void main(String [] args) throws Exception {
String line = "";
BlockRecord record0 = null;
BlockRecord record1 = null;
BlockRecord record2 = null;
BlockRecord record3 = null;
try {
ArrayList<String> data = new ArrayList<String>();
BufferedReader reader = new BufferedReader(new FileReader("BlockInput0.txt"));
while((line = reader.readLine()) != null) {
System.out.println(line);
data.add(line);
}
record0 = new BlockRecord();
record1 = new BlockRecord();
record2 = new BlockRecord();
record3 = new BlockRecord();
record0.setBlockID(new String(UUID.randomUUID().toString()));
record1.setBlockID(new String(UUID.randomUUID().toString()));
record2.setBlockID(new String(UUID.randomUUID().toString()));
record3.setBlockID(new String(UUID.randomUUID().toString()));
//manually set until more functionality is in place
data = line.split(" ");
record0.setFirstName(data[0]);
record0.setLastName(data[1]);
record0.setDob(data[2]);
record0.setSsn(data[3]);
record0.setDiagnosis(data[4]);
record0.setTreatment(data[5]);
record0.setRx(data[6]);
record1.setFirstName(data[7]);
record1.setLastName(data[8]);
record1.setDob(data[9]);
record1.setSsn(data[10]);
record1.setDiagnosis(data[11]);
record1.setTreatment(data[12]);
record1.setRx(data[13]);
record2.setFirstName(data[14]);
record2.setLastName(data[15]);
record2.setDob(data[16]);
record2.setSsn(data[17]);
record2.setDiagnosis(data[18]);
record2.setTreatment(data[19]);
record2.setRx(data[20]);
record3.setFirstName(data[21]);
record3.setLastName(data[22]);
record3.setDob(data[23]);
record3.setSsn(data[24]);
record3.setDiagnosis(data[25]);
record3.setTreatment(data[26]);
record3.setRx(data[27]);
}
}catch(Exception e) {
e.printStackTrace();
}
}
这是我的 BlockRecord 课程:
class BlockRecord{
String firstName;
String lastName;
String ssn;
String dob;
String diagnosis;
String treatment;
String rx;
String seed;
String winner;
String blockID;
String previousHash;
String verificationID = "0";
String uuid = UUID.randomUUID().toString();
String winningHash;
public static KeyPair keyPair;
public static int recordCount;
public String getWinningHash() {
return winningHash;
}
public void setWinningHash(String winningHash) {
this.winningHash = winningHash;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getSsn() {
return ssn;
}
public void setSsn(String ssn) {
this.ssn = ssn;
}
public String getDob() {
return dob;
}
public void setDob(String dob) {
this.dob = dob;
}
public String getDiagnosis() {
return diagnosis;
}
public void setDiagnosis(String diagnosis) {
this.diagnosis = diagnosis;
}
public String getTreatment() {
return treatment;
}
public void setTreatment(String treatment) {
this.treatment = treatment;
}
public String getRx() {
return rx;
}
public void setRx(String rx) {
this.rx = rx;
}
public String getSeed() {
return seed;
}
public void setSeed(String seed) {
this.seed = seed;
}
public String getWinner() {
return winner;
}
public void setWinner(String winner) {
this.winner = winner;
}
public String getBlockID() {
return blockID;
}
public void setBlockID(String blockID) {
this.blockID = blockID;
}
public String getPreviousHash() {
return previousHash;
}
public void setPreviousHash(String previousHash) {
this.previousHash = previousHash;
}
public String getVerificationID() {
return verificationID;
}
public void setVerificationID(String verificationID) {
this.verificationID = verificationID;
}
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
}
解决方案
您阅读所有行并将它们添加到data
循环中的列表中:
while((line = reader.readLine()) != null) {
System.out.println(line);
data.add(line);
}
但是,您只 split line
,这是最后读取的行。
data = line.split(" ");
快速解决:
将所有行合并为一条。然后拆分它。
String mergedLines = "";
while((line = reader.readLine()) != null) {
System.out.println(line);
mergedLines = mergedLines + line;
}
这真的很脏且无效,因为文件已经提供了单独的记录。
更好的解决方案:
BlockRecord
为每一行创建一个而不合并它们。然后将记录存储在列表中。
ArrayList<BlockRecord> allRecords = new ArrayList<String>();
BufferedReader reader = new BufferedReader(new FileReader("BlockInput0.txt"));
while((line = reader.readLine()) != null) {
System.out.println(line);
data = line.split(" ");
BlockRecord record = new BlockRecord()
record.setFirstName(data[0]);
record.setLastName(data[1]);
record.setDob(data[2]);
record.setSsn(data[3]);
record.setDiagnosis(data[4]);
record.setTreatment(data[5]);
record.setRx(data[6]);
allRecords.add(record)
}
这样,您甚至不必在阅读之前知道要声明多少条记录
推荐阅读
- entity-framework - 实体框架后期模型检查
- android - 三星 S3 Tab OpenCV 相机设置图片大小被忽略
- c# - 我无法使用 c# 中的实体框架从数据库中填充我的下拉列表
- node-sass - 如何抑制/修复 Susy 2.0 已弃用的警告
- python - 如何比较 1 个表中对应于日期的 2 个值并在 dyanmo db 中创建另一列
- react-native - 导航:project.testscreen 注册结果为 'undefined'
- selenium - 使用具有相同 selenium 测试的不同页面对象集
- amazon-web-services - 通过 cloudformation 更新现有角色的 iam 策略
- r - 提取由相对于其他相对定位字符定位定义的子字符串
- c# - 使用 ReadPrinter Winspool.Drv 读取打印机数据