Как написать на второй или определенной строке файла TEXT в java? [Дубликат]

21
задан Eveno 18 November 2013 в 06:15
поделиться

6 ответов

Протестировано и работает

public static void replaceSelected(String replaceWith, String type) {
    try {
        // input the file content to the StringBuffer "input"
        BufferedReader file = new BufferedReader(new FileReader("notes.txt"));
        String line;
        StringBuffer inputBuffer = new StringBuffer();

        while ((line = file.readLine()) != null) {
            inputBuffer.append(line);
            inputBuffer.append('\n');
        }
        String inputStr = inputBuffer.toString();

        file.close();

        System.out.println(inputStr); // check that it's inputted right

        // this if structure determines whether or not to replace "0" or "1"
        if (Integer.parseInt(type) == 0) {
            inputStr = inputStr.replace(replaceWith + "1", replaceWith + "0"); 
        }
        else if (Integer.parseInt(type) == 1) {
            inputStr = inputStr.replace(replaceWith + "0", replaceWith + "1");
        } 

        // check if the new input is right
        System.out.println("----------------------------------\n"  + inputStr);

        // write the new String with the replaced line OVER the same file
        FileOutputStream fileOut = new FileOutputStream("notes.txt");
        fileOut.write(inputStr.getBytes());
        fileOut.close();

    } catch (Exception e) {
        System.out.println("Problem reading file.");
    }
}

public static void main(String[] args) {
    replaceSelected("Do the dishes", "1");   
}

Содержимое исходного текстового файла:

Сделайте блюда0 Подайте собаке0 Очистите мою комнату1

Выход:

Сделайте посуду0 Подайте собаке0 Очистите мою комнату1 ------------------------- --------- Сделайте блюда1 Подайте собаке0 Очистите мою комнату1

Содержимое нового текстового файла:

Сделайте блюда1 Подайте собаке0 Очистил мою комнату1


И как примечание, если текстовый файл был:

Делать блюда1 Подавать собаку0 Очистил мою комнату1

, и вы использовали метод replaceSelected("Do the dishes", "1");, он просто не изменит файл.

26
ответ дан Michael Yaworski 25 August 2018 в 03:08
поделиться

как заменить строки :) как я делаю сначала arg будет filename второй целевой строкой третьей строкой, которую нужно заменить вместо targe

public class ReplaceString{
      public static void main(String[] args)throws Exception {
        if(args.length<3)System.exit(0);
        String targetStr = args[1];
        String altStr = args[2];
        java.io.File file = new java.io.File(args[0]);
        java.util.Scanner scanner = new java.util.Scanner(file);
        StringBuilder buffer = new StringBuilder();
        while(scanner.hasNext()){
          buffer.append(scanner.nextLine().replaceAll(targetStr, altStr));
          if(scanner.hasNext())buffer.append("\n");
        }
        scanner.close();
        java.io.PrintWriter printer = new java.io.PrintWriter(file);
        printer.print(buffer);
        printer.close();
      }
    }
0
ответ дан amar 25 August 2018 в 03:08
поделиться

Ну, вам нужно будет получить файл с JFileChooser, а затем прочитать строки файла с помощью сканера и функции hasNext ()

http://docs.oracle.com /javase/7/docs/api/javax/swing/JFileChooser.html

после того, как вы сделаете это, вы можете сохранить строку в переменной и манипулировать содержимым.

0
ответ дан Corjava 25 August 2018 в 03:08
поделиться

Я собирался ответить на этот вопрос. Затем я увидел, что он стал отмеченным как дубликат этого вопроса, после того как я написал код, поэтому я собираюсь опубликовать свое решение здесь.

Помня, что вам нужно переписать текст файл. Сначала я прочитал весь файл и сохранил его в строке. Затем я сохраняю каждую строку как индекс строкового массива, ex line one = массив index 0. Затем я редактирую индекс, соответствующий строке, которую вы хотите отредактировать. Как только это будет сделано, я объединю все строки в массиве в одну строку. Затем я пишу новую строку в файл, который пишет поверх старого содержимого. Не беспокойтесь о потере старого контента, поскольку он был снова написан с помощью редактирования. ниже - код, который я использовал.

public class App {

public static void main(String[] args) {

    String file = "file.txt";
    String newLineContent = "Hello my name is bob";
    int lineToBeEdited = 3;

    ChangeLineInFile changeFile = new ChangeLineInFile();
    changeFile.changeALineInATextFile(file, newLineContent, lineToBeEdited);



}

}

И класс.

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;

public class ChangeLineInFile {

public void changeALineInATextFile(String fileName, String newLine, int lineNumber) {
        String content = new String();
        String editedContent = new String();
        content = readFile(fileName);
        editedContent = editLineInContent(content, newLine, lineNumber);
        writeToFile(fileName, editedContent);

    }

private static int numberOfLinesInFile(String content) {
    int numberOfLines = 0;
    int index = 0;
    int lastIndex = 0;

    lastIndex = content.length() - 1;

    while (true) {

        if (content.charAt(index) == '\n') {
            numberOfLines++;

        }

        if (index == lastIndex) {
            numberOfLines = numberOfLines + 1;
            break;
        }
        index++;

    }

    return numberOfLines;
}

private static String[] turnFileIntoArrayOfStrings(String content, int lines) {
    String[] array = new String[lines];
    int index = 0;
    int tempInt = 0;
    int startIndext = 0;
    int lastIndex = content.length() - 1;

    while (true) {

        if (content.charAt(index) == '\n') {
            tempInt++;

            String temp2 = new String();
            for (int i = 0; i < index - startIndext; i++) {
                temp2 += content.charAt(startIndext + i);
            }
            startIndext = index;
            array[tempInt - 1] = temp2;

        }

        if (index == lastIndex) {

            tempInt++;

            String temp2 = new String();
            for (int i = 0; i < index - startIndext + 1; i++) {
                temp2 += content.charAt(startIndext + i);
            }
            array[tempInt - 1] = temp2;

            break;
        }
        index++;

    }

    return array;
}

private static String editLineInContent(String content, String newLine, int line) {

    int lineNumber = 0;
    lineNumber = numberOfLinesInFile(content);

    String[] lines = new String[lineNumber];
    lines = turnFileIntoArrayOfStrings(content, lineNumber);

    if (line != 1) {
        lines[line - 1] = "\n" + newLine;
    } else {
        lines[line - 1] = newLine;
    }
    content = new String();

    for (int i = 0; i < lineNumber; i++) {
        content += lines[i];
    }

    return content;
}

private static void writeToFile(String file, String content) {

    try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "utf-8"))) {
        writer.write(content);
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

private static String readFile(String filename) {
    String content = null;
    File file = new File(filename);
    FileReader reader = null;
    try {
        reader = new FileReader(file);
        char[] chars = new char[(int) file.length()];
        reader.read(chars);
        content = new String(chars);
        reader.close();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    return content;
}

}
1
ответ дан holycatcrusher 25 August 2018 в 03:08
поделиться

Если замена имеет разную длину:

  1. Прочитайте файл до тех пор, пока не найдете нужную вам строку.
  2. Считать в памяти часть после текст, который вы хотите заменить, все это.
  3. Усекать файл в начале части, которую вы хотите заменить.
  4. Записать замену.
  5. Write остаток файла из шага 2.

Если замена имеет одинаковую длину:

  1. Прочитайте файл, пока не найдете строку, которую хотите заменить.
  2. Установить положение файла для начала части, которую вы хотите заменить.
  3. Записать замену, переписать часть файла.

Это лучшее, что вы можете получите, с ограничениями на ваш вопрос. Однако, по крайней мере, этот пример заменяет строку той же длины, поэтому второй способ должен работать.

Также следует учитывать: строки Java - это текст Unicode, а текстовые файлы - это байты с некоторой кодировкой. Если кодировка UTF8, а ваш текст не является латинским (или простой 7-разрядный ASCII), вам нужно проверить длину закодированного байтового массива, а не длину строки Java.

1
ответ дан hyde 25 August 2018 в 03:08
поделиться

С Java 7 это очень просто и интуитивно понятно.

List<String> fileContent = new ArrayList<>(Files.readAllLines(FILE_PATH, StandardCharsets.UTF_8));

for (int i = 0; i < fileContent.size(); i++) {
    if (fileContent.get(i).equals("old line")) {
        fileContent.set(i, "new line");
        break;
    }
}

Files.write(FILE_PATH, fileContent, StandardCharsets.UTF_8);

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

FILE_PATH представляет Path файла.

23
ответ дан Tuupertunut 25 August 2018 в 03:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: