有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

从Java中的TXT文件以数组形式导入数据

我想从中导入这样的数据。txt文件使用Java。 Data in TXT

我想将其作为数组导入。数据类别如下:

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个数据。如果不止一个,它将给出错误ArrayoutOfBond异常

我使用while循环,这样只要nextLine不为null,它就会循环。这是我的代码:

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


共 (2) 个答案

  1. # 1 楼答案

    ArrayOutOfBounds异常发生在您在pastebin中发布的代码中;您有一个for循环,循环n+1次,它总是比阵列中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,因为它是从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);
    }
    
  2. # 2 楼答案

    问题在于拆分行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 + "]";
        }
    }