将文件中的数据写入数组

3
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;


public class RF{
    public static void main(String[] args) throws IOException{

        int count = 0;
        FileReader fr = new FileReader("file.txt");
        BufferedReader br = new BufferedReader(fr);
        String line;

        while ((line = br.readLine()) != null){
            //System.out.println(br.readLine());
            count++;
        }
        String []readArray = new String[count];

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

    }
}

我无法将文本文件中的数据写入新数组,该数组从未被填充。我只需要将这些数据写入数组,然后删除一些项目并输出一个新的文本文档。


6
不要使用数组,应该使用动态调整大小的“List”。这样你就不需要两次读取流(你现在做的只是继续读取),如果真的需要一个数组,可以在之后将列表转换为一个数组。 - Sotirios Delimanolis
我正在从C++转换过来,两年前我曾经做过类似的事情,但是现在我无法回想起确切的思考过程。我刚开始接触Java,还不熟悉它的资源。 - CinCity
@CinCity,请不要在标题中添加[solved]。当您将答案标记为已接受时,问题的外观将显示为已解决。 - Marc-Andre
你正在使用Java 7吗? - Marc-Andre
7个回答

2
你所做的是:先完整读取文件,然后在第二个循环中再次使用相同的BufferedReader进行读取。因此,在第二个循环中,你什么也得不到,因为你已经到达了文件的末尾。
因此,要么在第一个循环后关闭BufferedReader并创建另一个,要么像这样做:
    FileReader fr = new FileReader("file.txt");
    BufferedReader br = new BufferedReader(fr);
    String line;

    List<String> list = new ArrayList<String>();
    while ((line = br.readLine()) != null){
        list.add(line);
    }
    br.close();
    // do whatever you have to with this list

现在您可以向此列表中添加/删除元素并编写内容。

好的,这里又出现了一个问题。当我尝试使用List<String> list = new ArrayList<String>();时,我的编译器会报错说找不到符号,并指向ArrayList。 - CinCity
你需要 import java.util.* - Jatin
@CinCity 没问题,很高兴能帮忙 :) - Jatin
嘿,还有一个问题。我正在将新数据写入列表中没有的地方,但是我的编译器无法识别FileWriter。它不是java.util的一部分吗? - CinCity
@CinCity 这是 Java.io -> http://docs.oracle.com/javase/7/docs/api/java/io/FileWriter.html - Marc-Andre

1
这里是您需要的代码:

Here is the code you want instead:

    FileReader fr = new FileReader("file.txt");
    BufferedReader br = new BufferedReader(fr);
    String line;

    List<String> strings = new LinkedList<String>();

    while ((line = br.readLine()) != null){
        strings.add(line);
    }

    for(String string : strings){
        System.out.println(string);
    }

请注意,我使用的是LinkedList而不是字符串数组。

1

其他人已经解释了您的代码有什么问题,我只会提出一个不同的选项。

如果您正在使用Java 7并且文件不太大,则可以将文件的所有行直接加载到List中。

Path filePath = Paths.get("path to your file");
try {
    List<String> contentOfTheFile = Files.readAllLines(filePath,
            Charset.defaultCharset());
} catch (IOException e) {
    //Handle exception here
}

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

这将读取您的文件直到末尾,而无需再次放置数据。

当您在此循环中再次调用readLine()时

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

因为你已经到达文件的末尾,所以在 br 中没有剩余内容可供阅读。


0
问题在于,当你完成计算行数后,

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

你没有更多的行可以阅读...

    for(int i = 0; i < readArray.length; i++){
        readArray[i] = br.readLine(); // You've already readed them all
        System.out.println(readArray[i]);
    }

在填充数组之前,您需要重新启动读取文件(重新创建BufferedReader),或者使用其他方法,例如使用列表来保持计数时的行。


0

这是你的问题:

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

这段代码通过将光标移动到文件末尾来实现。

当您到达此代码时:

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

光标已经在文件末尾。

相反,这样做:

    List<String> lines = new ArrayList<String>();
    while ((line = br.readLine()) != null){
        lines.add(line);
        count++;
    }

如果你真的有某种原因需要将它存储为数组,你可以在最后使用以下代码:
String[] lineArray = lines.toArray(new String[0]);

0

如果你已经读完了文件来进行计数,那么你需要关闭并重新打开文件以便将读取器定位到文件的开头。

或者,可以像@SotiriosDelimanolis在评论中建议的那样,使用列表而不是数组。这不需要事先知道长度,你可以只是添加每一行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接