Как записать данные двух текстовых файлов в третий файл построчно в Java? - PullRequest
0 голосов
/ 17 марта 2019

Я читаю два файла по разным путям и при чтении не могу записать содержимое второго файла внутри цикла while, это заставляет меня инициализировать переменную, которая описана в программе ниже. Пожалуйста, помогите мне, как это исправить, чтобы получить ожидаемый результат. Заранее спасибо .. !!

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class ReadingFiles 
{

    public static void main(String[] args) throws IOException 
    {
        String inp = "location\\first.txt";
        String two = "location\\second.txt";
        BufferedReader br = new BufferedReader(new FileReader(inp));
        BufferedReader br2 = new BufferedReader(new FileReader(two));

        String st,rt;
        BufferedWriter bw = new BufferedWriter(new FileWriter("location"));
        while((st=br.readLine())!= null || (rt=br2.readLine())!= null )
        {
            bw.write(st);
            bw.newLine();
            /*bw.write(rt);
            bw.newLine();
            System.out.println(rt);*/
            //instance variable rt of type String is forcing me to initialize like 
            //for local variable and throwing nullpointer exception instead of fetching
            //second file contents
        }
        bw.close();
    }

}

Пожалуйста, найдите мою программу выше, я пытаюсь записать содержимое двух текстовых файлов в третий файл. И образец ввода и вывода приведен ниже

input
in file-1   a1a1a1   
            b2b2b2
            c3c3c3

in file-2   d1d1d1
            e2e2e2
            f3f3f3

 output 

  a1a1a1
  d1d1d1
  b2b2b2
  e2e2e2
  c3c3c3
  f3f3f3

Ответы [ 3 ]

0 голосов
/ 17 марта 2019

Вы не закрываете своих читателей, и я бы предпочел try-with-resources вместо явных закрытий. Затем прочитайте каждую строку из ваших соответствующих файлов в бесконечном цикле. Проверьте null для каждого файла отдельно перед записью в выходной буфер и еще раз в конце, чтобы завершить цикл, когда вы исчерпали оба входа. Что-то вроде

try (BufferedReader br = new BufferedReader(new FileReader(inp));
        BufferedReader br2 = new BufferedReader(new FileReader(two));
        BufferedWriter bw = new BufferedWriter(new FileWriter("location"))) {
    while (true) {
        String st = br.readLine();
        if (st != null) {
            bw.write(st);
            bw.newLine();
        }
        String rt = br2.readLine();
        if (rt != null) {
            bw.write(rt);
            bw.newLine();
        }
        if (st == null && rt == null) {
            break;
        }
    }
} catch (IOException e) {
    e.printStackTrace();
}
0 голосов
/ 17 марта 2019

В коде вы допустили несколько ошибок, а также есть более эффективные способы реализации кода. Но за ваше занижение я обновлю ваш существующий код.

1) st и rt должны быть инициализированы. потому что когда первый раз st инициализируется, rt еще не инициализирован.

2) || должно быть &&. потому что вам нужно зациклить, пока все файлы не закончат чтение.

3) st & rt должен быть проверен, если он нулевой или нет.

пожалуйста, проверьте следующий код.

public class ReadingFiles 

{

public static void main(String[] args) throws IOException 
{
    String inp = "first.txt";
    String two = "second.txt";
    BufferedReader br = new BufferedReader(new FileReader(inp));
    BufferedReader br2 = new BufferedReader(new FileReader(two));

    String st,rt="";
    BufferedWriter bw = new BufferedWriter(new FileWriter("location"));
    boolean isCompleted = false;
    while( !isCompleted)
    {
        st=br.readLine() ;
        bw.write(st==null?"":st);
        bw.newLine();
        rt=br2.readLine();
        bw.write(rt==null?"":rt);
        bw.newLine();

        isCompleted = (st==null && rt == null) ? true : false ;

    }
    bw.close();
}

}

0 голосов
/ 17 марта 2019

Я бы сделал это с бесконечным циклом do while вместо while и управлял бы состоянием выхода из цикла в отдельном if внутри моего цикла.

Почему? Поскольку второй условный оператор в вашем заголовке while может не выполняться, поскольку он является или (||), и компилятор игнорирует остальную часть вашего условного оператора, когда первый оператор равен true, и поэтому rt никогда не будет получен инициатор. Вот почему компилятор заставляет вас инициализировать rt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...