#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 никогда не будет ложным, поэтому оно продолжает чтение до тех пор, пока … ?