【问题标题】:reading from the file and writing to the file in java从文件中读取并在java中写入文件
【发布时间】:2011-12-18 01:07:49
【问题描述】:

我是 Java 初学者。

这是我的方法:

我正在尝试读取两个文件,然后将它们合并。我应该使用大小为 100 的数组。(只允许一个 array,逐行读写或 arrayList 或其他结构。)

首先,我从file1 读取所有记录,并将它们写入输出,即第三个文件。为此,我一次读取 100 条记录,并使用迭代将它们写入第三个文件。

之后,和第一个文件一样,这次我一次读取第二个文件 100 条记录,并将它们写入memory[]。然后我找到公共记录,如果我从 File2 读取的记录不在 File1 中,我将其写入输出文件。我这样做直到reader2.readLine() 得到null 并在每次迭代中重新打开file1

这是我到目前为止所做的,几乎完成了。任何帮助将不胜感激。

编辑:好的,现在它没有给出任何异常,但是它找不到不同的记录并且无法写入它们。我猜最后一个 for 循环和布尔值不起作用,为什么?我真的需要帮助。感谢您的耐心等待。

import java.io.*;

public class FileUnion
{
private static long startTime, endTime;

public static void main(String[] args) throws IOException 
{
    System.out.println("PROCESSING...");
    reset();
    startTimer();

    String[] memory = new String[100];
    int memorySize = memory.length;

    File file1 = new File("stdlist1.txt");
    BufferedReader reader1 = new BufferedReader(new FileReader(file1));

    File file3 = new File("union.txt");
    BufferedWriter writer = new BufferedWriter(new FileWriter(file3));

    int numberOfLinesFile1 = 0;
    String line1 = null;
    String line11 = null;


    while((line1 = reader1.readLine()) != null)
    {
        for (int i = 0; i < memorySize; )
        {
            memory[i] = line1;
            i++;

            if(i < memorySize)
            {
                line1 = reader1.readLine();
            }
        }

        for (int i = 0; i < memorySize; i++)
        {
            writer.write(memory[i]);
            writer.newLine();
            numberOfLinesFile1++;
        }
    }

    reader1.close();

    File file2 = new File("stdlist2.txt");
    BufferedReader reader2 = new BufferedReader(new FileReader(file2));

    String line2 = null;
    while((line2 = reader2.readLine()) != null)
    {
        for (int i = 0; i < memorySize; )
        {
            memory[i] = line2;
            i++;

            if(i < memorySize)
            {
                line2 = reader2.readLine();
            }
        }

        for (int k = 0; k < memorySize; k++ )
        {
            boolean found = false;
            File f1 = new File("stdlist1.txt");
            BufferedReader buff1 = new BufferedReader(new FileReader(f1));

            for (int m = 0; m < numberOfLinesFile1; m++)
            {
                line11 = buff1.readLine();

                if (line11.equals(memory[k]) && found == false);
                {
                    found = true;
                }

            }
            buff1.close();

            if (found == false)
            {
                writer.write(memory[k]);
                writer.newLine();
            }


        }       
    }

    reader2.close();
    writer.close();

    endTimer();
    long time = duration();
    System.out.println("PROCESS COMPLETED SUCCESSFULLY");
    System.out.println("Duration: " + time + " ms");

}

public static void startTimer()
{
    startTime = System.currentTimeMillis();
}
public static void endTimer()
{
    endTime = System.currentTimeMillis();
}
public static long duration()
{
    return endTime - startTime;
}
public static void reset()
{
    startTime = 0;
    endTime = 0;
}
}

【问题讨论】:

  • 如果stdlist1.txt 的长度少于 100 行,你的代码会发生什么?如果它不是 100 行的倍数,会发生什么?你能用ArrayList&lt;String&gt; 代替String[] 来代替memory 吗?这比使用固定大小的数组要容易得多。
  • 这是我的家庭作业项目,它确保没有少于 100 行的输入文件。而且,如果它不是 100 行的倍数,则 memory[] 将填充一些空值。但我认为这不会是一个问题。

标签: java file-io for-loop


【解决方案1】:

编辑!重做。

好的,所以要一次使用 100 行,您需要检查 null,否则尝试将 null 写入文件可能会导致错误。

您正在检查文件是否在末尾一次,然后再收集 99 条信息而不检查是否为空。

如果调用此行会怎样:

while((line2 = reader2.readLine()) != null)

文件中只剩下 1 行了?然后您的内存数组包含 99 个 null 实例,您尝试将 null 写入文件 99 次。这是最糟糕的情况。

我真的不知道我们应该为寻求家庭作业帮助的人提供多少帮助,在我熟悉的大多数网站上,这甚至是不允许的。

这里是编写第一个文件的一种方法的示例。

String line1 = reader1.readLine();

boolean end_of_file1 = false;
while(!end_of_file)
{
    for (int i = 0; i < memorySize)
    {
        memory[i] = line1;
        i++;

        if(i < memorySize)
        {
            if((line1 = reader1.readLine()) == null)
            {
                end_of_file1 = true;
            }
        }
    }

    for (int i = 0; i < memorySize; i++)
    {
        if(!memory[i] == null)
        {
            writer.write(memory[i]);
            writer.newLine();
            numberOfLinesFile1++;
        }
    }
}

reader1.close();

一旦你有了它,为了更容易检查副本,创建一个公共静态布尔值来检查文件,然后你可以调用它,它会使代码更清晰。

public static boolean isUsed(String f1, String item, int dist)
{
    BufferedReader buff1 = new BufferedReader(new FileReader(f1));

    for(int i = 0;i<dist;i++)
    {
        String line = buff1.readLine()
        if(line == null){
            return false;
        }
        if(line.equals(item))
        {
            return true;
        }
    }
    return false;
}

然后使用与写入文件1相同的方法,只是在写入每一行之前检查是否!isUsed()

boolean end_of_file2 = false;
memory = new String[memorySize];// Reset the memory, erase old data from file1
int numberOfLinesFile2=0;
String line2 = reader2.readLine();
while(!end_of_file2)
{
    for (int i = 0; i < memorySize; )
    {
        memory[i] = line2;
        i++;

        if(i < memorySize)
        {
            if((line2 = reader2.readLine()) == null)
            {
                end_of_file2 = true;
            }
        }
    }

    for (int i = 0; i < memorySize; i++)
    {
        if(!memory[i] == null)
        {
            //Check is current item was used in file 1.
            if(!isUsed(file1, memory[i], numberOfLinesFile1)){//If not used already
                writer.write(memory[i]);
                writer.newLine();
                numberOfLinesFile2++;
            }
        }
    }
}
reader2.close();
writer.close();

希望这会有所帮助。请注意,我没有提供完整的代码,因为我了解到仅粘贴代码会使复制和粘贴更有可能只使用代码而不理解它。我希望你觉得它有用。

【讨论】:

  • 非常感谢!我知道使用数组很浪费时间,但我必须使用它,因为它是项目的一部分,只允许使用大小为 100 的数组。我应该先写 100 个,然后将它们写到数组的输出中。这就是为什么我不能使用逐行读写或arrayList,因为它应该是固定大小的。我只需要了解为什么它没有给出不同的记录。我尝试了所有方法,但无法解决循环和布尔问题。
  • 我使用 Eclipse。它确实编译,也不例外。但是只写整个第一个文件,意味着它找不到联合。 (在 File2 中找不到但在 File1 中找不到的记录)。谢谢你的回答。
  • 好的。好吧。然后使用您现有的方法,但为了加快检查已使用的速度,您应该将所有项目添加到列表中。这样,您仍然不会为第二行的每一行重新扫描第一个文件。至于100行。这就是它造成问题的地方。您一直阅读直到 reader 为空,但是假设当调用 statment 时,文件中只剩下 15 行。当您使用循环而不检查 null 时,您正在扫描 100 个项目,最后 85 个项目将为 null。这就是 NullPointerException 所在的地方。仅当行号是 100 的倍数时才有效
  • 我稍微改变了我的答案,为它提供了全新的代码,希望这次能有所帮助。抱歉,我之前没看懂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
  • 2021-04-02
相关资源
最近更新 更多