2015-05-20 5 views
0

я столкнулся при слиянии двух файлов в одном (с общим содержанием)Как написать строку данных по линии из двух файлов в общий файл в 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 
+0

Итак, вы хотите получить линии, которые являются общими в обоих файлах? – Kartic

+0

Да, точно. Я буду рад за вашу помощь. –

ответ

1

Вы находитесь в непосредственной близости от решения, но делаете ошибку. т.е. вы читаете по 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(); 
} 

MORE

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

+0

ДА! Ваш ответ мне очень помог! Большое спасибо! –

+0

Удовольствие мое @ КириллКраснобаев – Sarz

1

Вы используете разделитель сканера по умолчанию, который является пробельные. Вы должны установить разделитель в конец строки (или «\ г» и/или «\ п»), как это

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")); 

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

+0

Спасибо за помощь. –

1

Вы должны хранить содержимое двух файлов в двух 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 содержит все данные, что вам нужно.

+0

Ваш ответ точен, но цикл является обязательным в этом случае, так как он хочет, чтобы он записывался в файл. – Sarz

+0

Да, конечно. Но я предполагаю, что главной проблемой было определение общих строк в обоих файлах (как упоминалось в разделе комментариев), я попытался сосредоточиться только на этой области. Спасибо за ваш вклад. – Kartic

+0

Спасибо за помощь. –