0

我的代码应该读取文件并将每一行(每条记录)存储到一个字符串数组中。

我的txt文件是这样的:

FName Lname Number
second secondsecond 22
thired thithird 33
fourth fourfourr 44
fifth fiffif 55

但是,当我运行我的代码时,我的程序不显示每行的第一个字符!像这样显示:

econd secondsecond 22
hired thithird 33
ourth fourfourr 44
ifth fiffif 55

我的代码:

public class ReadfileIntoArray {

String[] columns=new String[]  {"FName","Lname","Number"};
String[] data=new String[100];

public void read() throws IOException{
FileReader fr=new FileReader("D:\\AllUserRecords.txt");
BufferedReader br=new BufferedReader(fr);
String line;  

while((line=br.readLine())!=null){

    for(int i=0;i<=br.read();i++){
        data[i]=br.readLine();
        System.out.println(data[i]);
    }
    }  
br.close();
System.out.println("Data length: "+data.length);
}

public static void main(String[] args) throws IOException{
    ReadfileIntoArray rfta=new ReadfileIntoArray();
    rfta.read();
}
}

我想看到数据长度:5(因为我有五行),但我看到 100!

(我想要抽象表模型的这些信息)

谢谢你。

4

6 回答 6

2

因为您在第二行将数组大小声明为 100。所以你基本上有两个选择,如果文件中的行数不会改变,那么将数组的大小声明为 5。如果它会改变,那么我建议你使用例如ArrayList

List<String> data = new ArrayList<String>();
//in the while loop
data.add(br.readLine());
于 2013-01-05T19:27:35.403 回答
1

您的data数组的大小将始终为 100,因为当您实例化它时 ( String[] data = new String[100]) 会创建一个具有 100 个索引的空白数组。String[]您可以使用 a而不是使用 aList<String>

于 2013-01-05T19:27:24.123 回答
1

您的代码已修改:

public class ReadfileIntoArray {

    String[] columns = new String[] { "FName", "Lname", "Number" };
    String[] data = new String[100];

    public void read() throws IOException {
        FileReader fr = new FileReader("D:\\AllUserRecords.txt");
        BufferedReader br = new BufferedReader(fr);
        String line;

        int i = 0;
        while ((line = br.readLine()) != null) {
            data[i] = line;
            System.out.println(data[i]);
            i++;
        }
        br.close();
        // This is for resize the data array (and data.length reflect new size)
        String[] dataNew = new String[i];
        System.arraycopy(data, 0, dataNew, 0, i);
        data = dataNew;
        System.out.println("Data length: " + data.length);
    }

    public static void main(String[] args) throws IOException {
        ReadfileIntoArray rfta = new ReadfileIntoArray();
        rfta.read();
    }
}
于 2013-01-05T20:28:24.817 回答
0

br.read()从每行的开头读取一个字符,然后br.readLine()阅读其余字符。

这个内循环没有什么意义。

for(int i=0;i<=br.read();i++){
    data[i] = br.readLine();
    System.out.println(data[i]);
}

这应该是你所需要的。如果您不想要第一行,请br.readLine()在循环之前添加一个额外的调用。

int i = 0;
while((line=br.readLine())!=null){
    data[i] = line;
    System.out.println(line);
    i++;
}  

ArrayList<String>如果您不知道需要多少行,您还应该尝试使用动态大小的数据结构来存储字符串(例如)。然后,您可以使用myList.size()来获取行数。

List myList = new ArrayList<String>();
while((line=br.readLine())!=null){
    myLine.add(line);
    System.out.println(line);
}  

System.out.println(myList.size());

//Retrieve the data as a String[].
String[] data = (String[]) myList.toArray();
于 2013-01-05T19:27:13.073 回答
0

在读取行的循环内部,使用 String 方法split处理每一行。不要从阅读器中绘制,因为它会在阅读时向前移动文件指针。您可以使用空格分割

String [] parts = stringName.split("\\s");

然后,您可以完全访问每行中的所有三个项目。

于 2013-01-05T19:36:08.473 回答
0

为什么这么复杂?以下是我的解决方案,供参考。

String line;  
int cnt;

cnt = 0;
while((line = br.readLine()) != null){
    System.out.println(line);
    cnt++;
}

br.close();
System.out.println("Data length: "+cnt);
于 2013-01-05T19:53:10.397 回答