【问题标题】:union of two files with array两个文件与数组的联合
【发布时间】:2011-12-18 00:00:45
【问题描述】:

我是Java初学者。

我正在尝试读取两个文件,然后将它们合并。我应该使用一个大小为 100 的数组。(只允许一个数组)

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

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

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

编辑:好的,现在它没有给出任何异常,但是它没有找到不同的记录并且无法写入它们。我猜最后一个 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;
}
}

【问题讨论】:

    标签: java arrays file-io boolean


    【解决方案1】:

    您必须检查您是否尚未到达文件末尾。在所有有lineX = readerX.readLine() 的循环中,立即检查是否有lineX == null,如果是则跳出循环。

    编辑我自己的答案,因为代码在 cmets 中显示效果不佳。

    while(!line11.equals(memory[k]))
        {
            line11 = buff1.readLine();
        }
    

    line11 在这里(有时)为空。如果memory[k] 不在file1 中,会发生什么?

    【讨论】:

    • 如果 memory[k] 不在 file1 中,它只会继续读取,直到它们相同或不同。如果循环检查 file1 中的所有记录但未找到,则将其写入输出。正确的?我的方法不行吗?还是只是代码问题?请帮忙。
    • 如果不在 f1 中,while 循环的条件永远不会为假,所以它会一直读取直到...?
    【解决方案2】:

    memory[k] 为空。为什么这是空的?因为在这段代码中:

    while((line2 = reader2.readLine()) != null)
            {
                for (int i = 0; i < 100; i++)
                {
                    memory[i] = line1;
                    i++;
    
                    if(i < 100)
                    {
                        line2 = reader2.readLine();
                    }
                }
    

    你说memory[i] = line1;

    line1 但始终为 null,因为您之前在循环中使用过它,该循环在 line1 为 null 时结束。

    我相信你打算在上面的代码中写**memory[i] = line2;** :)

    【讨论】:

    • 是的。你说得对。我是故意的。我改变了它,但仍然在同一行给出了 nullpointerexception。 :(
    猜你喜欢
    • 2012-10-22
    • 1970-01-01
    • 2019-10-02
    • 2023-04-06
    • 2017-09-01
    • 2015-08-01
    • 2018-04-27
    • 2011-11-26
    • 1970-01-01
    相关资源
    最近更新 更多