it-swarm.com.ru

Изменить содержимое файла с помощью Java

Я хочу удалить некоторое содержимое файла, используя программу Java, как показано ниже. Это метод записи для замены в том же файле, или он должен быть скопирован в другой файл. 

Но его удаление всего содержимого файла.

class FileReplace
{
    ArrayList<String> lines = new ArrayList<String>();
    String line = null;
    public void  doIt()
    {
        try
        {
            File f1 = new File("d:/new folder/t1.htm");
            FileReader fr = new FileReader(f1);
            BufferedReader br = new BufferedReader(fr);
            while (line = br.readLine() != null)
            {
                if (line.contains("Java"))
                    line = line.replace("Java", " ");
                lines.add(line);
            }
            FileWriter fw = new FileWriter(f1);
            BufferedWriter out = new BufferedWriter(fw);
            out.write(lines.toString());
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
    public statc void main(String args[])
    {
        FileReplace fr = new FileReplace();
        fr.doIt();
    }
}
6
Adesh singh

Я бы начал с закрытия читателя и промывки писателя:

public class FileReplace {
    List<String> lines = new ArrayList<String>();
    String line = null;

    public void  doIt() {
        try {
            File f1 = new File("d:/new folder/t1.htm");
            FileReader fr = new FileReader(f1);
            BufferedReader br = new BufferedReader(fr);
            while ((line = br.readLine()) != null) {
                if (line.contains("Java"))
                    line = line.replace("Java", " ");
                lines.add(line);
            }
            fr.close();
            br.close();

            FileWriter fw = new FileWriter(f1);
            BufferedWriter out = new BufferedWriter(fw);
            for(String s : lines)
                 out.write(s);
            out.flush();
            out.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static void main(String args[]) {
        FileReplace fr = new FileReplace();
        fr.doIt();
    }
}
12
Mateusz

Принятый ответ великолепен. Однако существует более простой способ замены содержимого в файле с помощью библиотеки Apache commons-io (commons-io-2.4.jar - вы можете использовать любые последние версии)

private void update() throws IOException{
        File file = new File("myPath/myFile.txt");
        String fileContext = FileUtils.readFileToString(file);
        fileContext = fileContext.replaceAll("_PLACEHOLDER_", "VALUE-TO-BE-REPLACED");
        FileUtils.write(file, fileContext);
 }

Примечание: Брошенный IOException должен быть перехвачен и обработан приложением соответственно.

9
Sandeep Salian

Чтение + запись в тот же файл одновременно не в порядке.

Правка: перефразировать и быть более точным и конкретным - чтение и запись в один и тот же файл, в одном и том же потоке, без надлежащего закрытия читателя (и сброса писателя) не в порядке.

3
acostache

Убедись в:

  • close любой поток, когда он вам больше не нужен
  • В частности перед вновь открыть его для записи.
  • truncate файл, чтобы убедиться, что он сжимается, если вы пишете меньше, чем было.
  • затем напишите вывод
  • пишите отдельные строки, не полагайтесь на toString.
  • flush и close, когда вы закончите писать!

Если вы используете buffered IO, вы всегда должны убедиться, что буфер сброшен в конце, иначе вы можете потерять данные!

2
Anony-Mousse

Я вижу три проблемы.

Сначала вы пишете в out, который я предполагаю, что это System.out, а не поток вывода в файл.

Во-вторых, если вы делаете запись в выходной поток в файл, вам необходимо закрыть его.

В-третьих, метод toString() в ArrayList не собирается записывать файл так, как вы ожидаете. Перейдите по списку и запишите каждый String по одному. Спросите себя, нужно ли вам писать символы новой строки.

0
Qwerky

Принятый ответ немного неправильный. Вот правильный код.

    public class FileReplace {
List<String> lines = new ArrayList<String>();
String line = null;

public void  doIt() {
    try {
        File f1 = new File("d:/new folder/t1.htm");
        FileReader fr = new FileReader(f1);
        BufferedReader br = new BufferedReader(fr);
        while ((line = br.readLine()) != null) {
            if (line.contains("Java"))
                line = line.replace("Java", " ");
            lines.add(line);
        }
        fr.close();
        br.close();

        FileWriter fw = new FileWriter(f1);
        BufferedWriter out = new BufferedWriter(fw);
        for(String s : lines)
             out.write(s);
        out.flush();
                } 
        out.close();
   catch (Exception ex) {
        ex.printStackTrace();
    }
}
0
Ravi K M