как поместить текстовый файл в определенную строку второго текстового файла

У меня есть 2 файла, один new.txt, а второй template.txt, мне нужно поместить new.txt в 6-ю строку template.txt, и я не понимаю, как это сделать. давайте покажем вам, что у меня уже есть!

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        File dir = new File(".");

        String source = dir.getCanonicalPath() + File.separator + "new.txt";
        String dest = dir.getCanonicalPath() + File.separator + "template.txt";

        File fin = new File(source);
        FileInputStream fis = new FileInputStream(fin);
        BufferedReader in = new BufferedReader(new InputStreamReader(fis));

        FileWriter fstream = new FileWriter(dest,true);
        BufferedWriter out = new BufferedWriter(fstream);

        String aLine = null;
        while((aLine = in.readLine()) != null){
            out.write(aLine);
            out.newLine();
        }
        in.close();
        out.close();
    }
}

person German Varanytsya    schedule 15.08.2019    source источник
comment
так что не так?   -  person Scary Wombat    schedule 15.08.2019
comment
Проблема @ScaryWombat в том, что я не понимаю, как поместить текст из new.txt в template.txt (6 строк)   -  person German Varanytsya    schedule 15.08.2019
comment
Итак, это inserted после строки 6? Не дописано? В этом случае вам нужно будет открыть оба файла и записать в новый файл.   -  person Scary Wombat    schedule 15.08.2019
comment
@GermanVaranytsya У меня есть идея, от file.readLine до List<String> listOne, затем пройдитесь по этому списку, скопируйте все от listOne до List<String> listTwo, но в это время, когда вы достигнете индекса 5 (шестая строка файла), добавьте то, что вам нужно, из второго файла до listTwo и после этого продолжите копирование с listOne по listTwo   -  person noname    schedule 15.08.2019


Ответы (2)


Файлы не имеют операции «вставки». Вы не можете просто записать что-то в середину файла. Записи происходят с заданным смещением, и они переопределяют все, что уже есть.

Итак, вам нужно создать временный файл, скопировать в него строки 1-5 из new.txt. Затем напишите строку 6 из шаблона, а затем остальную часть new.txt. Когда вы закончите, удалите new.txt и переименуйте временный файл в new.txt.

Если файлы гарантированно будут небольшими, вы можете заменить временный файл буфером в памяти.

person Malt    schedule 15.08.2019
comment
я имею в виду, что я хочу, чтобы весь текст из 1 файла вставлялся во 2 файла 6 строк - person German Varanytsya; 15.08.2019
comment
Хорошо, это не меняет решения. После записи первых 5 строк шаблона во временный файл запишите весь файл new.txt во временный файл. Пропустите любые символы новой строки (\n), которые могут содержаться в new.txt, если вы хотите, чтобы они были в одной строке. - person Malt; 15.08.2019

Псевдокод для комментария выше:

File fileOne = new File("new.txt");
File fileTwo = new File("template.txt");

List<String> listOne = new ArrayList<String>();
List<String> listTwo = new ArrayList<String>();

String s = "";

while((s = fileOne.readLine()) != null){
  listOne.add(s);
}

for(int i = 0; i < listOne.size(); i++){
  if(i == 5){
    String s2 = "";
    while((s2 = fileTwo.readLine()) != null){
      listTwo.add(s);
    }
  }
  listTwo.add(listOne.get(i));
}

Как я уже сказал, это всего лишь псевдокод, поэтому он может не работать, но это будет хорошим упражнением для вас, чтобы заставить его работать. Надеюсь, вы поняли идею, стоящую за этим.

PS. конечно, после того, как вы это сделаете, вы должны записать все данные из listTwo в файл, который вы хотите.

person noname    schedule 15.08.2019
comment
Кстати, я думал, мне нужно 2 массива? может быть, список массивов следует использовать только в случае текстового файла, где мне нужно найти эту 6-ю строку? - person German Varanytsya; 15.08.2019
comment
Я не думал об этом долго, так что наверняка есть лучший способ сделать это, но я хотел только показать вам идею. Как вы это реализуете, полностью зависит от вас. - person noname; 15.08.2019
comment
идея хорошая думаю сейчас попробую - person German Varanytsya; 15.08.2019