首页 > 解决方案 > 为什么 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;
    }

}

标签: java

解决方案


您阅读所有行并将它们添加到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)
    }   

这样,您甚至不必在阅读之前知道要声明多少条记录


推荐阅读