Как записать данные построчно из двух файлов в общий файл в Java

Я сталкиваюсь при объединении двух файлов в один (с общим содержимым)

public class myFileReader {

    public static void main(String[] args) throws Exception {

        List<String> firstFileList = new ArrayList<String>();
        List<String> secondFileList = new ArrayList<String>();

        List<String> missingRecordsInFile2 = new ArrayList<String>();

        Scanner firstFile = new Scanner(new FileReader(new File("C://write1.txt")));
        Scanner secondFile = new Scanner(new FileReader(new File("C://write2.txt")));

        FileWriter fWriteOne = new FileWriter(new File("C://read1.txt"));


        while (firstFile.hasNext()) {
            firstFileList.add(firstFile.next());
        }

        while (secondFile.hasNext()) {
            secondFileList.add(secondFile.next());
        }

        try {
            for (String fileOne : firstFileList) {
                boolean value = secondFileList.contains(fileOne);
                if (value) {
                    missingRecordsInFile2.add(fileOne);
                    fWriteOne.write(fileOne);
                    fWriteOne.write(System.getProperty("line.separator"));

                }
            }
        } finally {
            fWriteOne.close();
        }
    }
}

Например:

ФАЙЛ 1:

Yellow wall 
Red Wall 
Green wall
Black wall

ФАЙЛ 2:

 Red Wall
 Black wall
 Brown wall

ФАЙЛ РЕЗУЛЬТАТОВ (Мое желание):

  Red Wall
  Black wall

Но этот код записать в файл как:

ТЕКУЩИЙ ФАЙЛ РЕЗУЛЬТАТОВ:

 Red
 wall
 Black
 wall

3 ответа

Решение

Вы близки к решению, но делаете простую ошибку. то есть вы читаете firstFile.next() который дает вам слово за словом вместо строки за строкой, так как вас интересует строка за строкой nextLine() Подобно:

while (firstFile.hasNext()) {
    firstFileList.add(firstFile.nextLine().trim());
}

while (secondFile.hasNext()) {
    secondFileList.add(secondFile.nextLine().trim());
}

try {
    for (String fileOne : firstFileList) {
        boolean value = secondFileList.contains(fileOne);
        if (value) {
            missingRecordsInFile2.add(fileOne);
            fWriteOne.write(fileOne);
            fWriteOne.write(System.getProperty("line.separator"));
        }
    }
} finally {
    fWriteOne.close();
}

БОЛЬШЕ

Я рекомендую использовать String.Trim() чтобы избежать лишних пробелов после текста, как Red Wall_ не равно Red Wall из-за одного пробела.

Вы используете разделитель сканера по умолчанию, который является пробелом. Вы должны установить разделитель на новую строку ('\r' и / или '\n'), вот так

Scanner firstFile =  new Scanner(new FileReader(new File("C://write1.txt")));
Scanner secondFile =  new Scanner(new FileReader(new File("C://write2.txt")));
firstFile.useDelimiter(Pattern.compile("[\\r\\n]+"));
secondFile.useDelimiter(Pattern.compile("[\\r\\n]+"));

Может быть, вы также можете использовать более простой

myScanner.useDelimiter(System.getProperty( "line.separator" ));

но если у вас есть несколько новых строк в конце строки, вы получите пустые строки в выходном файле.

Вы должны хранить содержимое двух файлов в двух List как вы сделали:

List<String> firstFileList = new ArrayList<String>();
List<String> secondFileList = new ArrayList<String>();

/***** Start : This is dummy data ********/
firstFileList.add("Yellow wall");
firstFileList.add("Red Wall");
firstFileList.add("Green wall");
firstFileList.add("Black wall");

secondFileList.add("Red Wall");
secondFileList.add("Black wall");
secondFileList.add("Brown wall");
/***** End: This is dummy data ********/

firstFileList.retainAll(secondFileList);

Сейчас firstFileList содержит все данные, которые вам нужны.

Другие вопросы по тегам