объединение двух файлов с массивом

#java #arrays #file-io #boolean

#java #массивы #file-io #логическое

Вопрос:

Я новичок в 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]) amp;amp; 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;
}
}
  

Ответ №1:

память [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;

однако строка 1 всегда равна нулю, потому что вы использовали ее раньше в цикле, который заканчивался, когда строка 1 равна нулю.

Я полагаю, вы намеревались написать **memory[i] = line2;** в приведенном выше коде 🙂

Комментарии:

1. ДА. вы правы. Я так и предполагал. Я изменил его, но все равно выдает исключение nullpointerexception в той же строке. 🙁

Ответ №2:

Вы должны убедиться, что вы еще не дошли до конца файла. Во всех циклах, где у вас есть lineX = readerX.readLine() , немедленно проверьте, является ли lineX == null и выйти из цикла, если это так.

Отредактируйте мой собственный ответ, потому что код плохо отображается в комментариях.

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

Это line11 то, что здесь (иногда) равно нулю. Если memory[k] его нет в file1, что произойдет?

Комментарии:

1. если memory [k] отсутствует в file1, он просто продолжает чтение до тех пор, пока они не станут одинаковыми или не совпадут. если цикл проверяет все записи в file1 и не находит, то запишите его в output. верно? разве мой подход не в порядке? или это просто проблема с кодом? помогите, пожалуйста.

2. Если его нет в f1, условие цикла while никогда не будет ложным, поэтому оно продолжает чтение до тех пор, пока … ?