Запись файла - PrintStream append

java file-io append

54827 просмотра

2 ответа

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

Есть много Engineers, но он выводит в файл только последний прочитанный элемент.

Например:

Engineer e = new Engineer(firstName,surName,weeklySal);
PrintStream writetoEngineer = new PrintStream(new File ("Engineer.txt"));

//This is not append. Only print. Overwrites the file on each item.
writetoEngineer.append(e.toString() + " "  + e.calculateMontly(weeklySal));
Автор: snnlankrdsm Источник Размещён: 12.11.2019 09:36

Ответы (2)


41 плюса

Я не вижу, где вы закрываете файл. Я тоже не вижу, чтобы ты что-то читал.

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

PrintStream writetoEngineer = new PrintStream(
     new FileOutputStream("Engineer.txt", true)); 

Кстати: e.toString() + " "это почти то же самое, что e + " "за исключением того, что оно не выдает исключение, если e равно нулю.

Автор: Peter Lawrey Размещён: 07.11.2011 10:17

3 плюса

Поскольку данный фрагмент кода не является самостоятельным компилируемым примером (хотя это и простой), я могу только догадываться, что PrintStream создается внутри цикла для каждой итерации коллекции Engineer. Это приведет к усечению файла, как указано в конструкторе javadoc PrintStream:

Параметры:

file - файл для использования в качестве места назначения этого потока печати. Если файл существует, он будет обрезан до нулевого размера; в противном случае будет создан новый файл. Вывод будет записан в файл и помещен в буфер.

попробуйте этот пример кода:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;


public class PrintEngineers {

    public static class Engineer {

        private final String firstName;
        private final String surName;
        private final int weeklySal;

        public Engineer(String firstName, String surName, int weeklySal) {
            super();
            this.firstName = firstName;
            this.surName = surName;
            this.weeklySal = weeklySal;
        }

        public int calculateMonthly() {
            return weeklySal * 4; // approximately
        }

        @Override
        public String toString() {
            return firstName + " " + surName;
        }
    }

    /**
     * @param args
     * @throws FileNotFoundException 
     */
    public static void main(String[] args) throws FileNotFoundException {

        Engineer e1 = new Engineer("first1", "sur1", 100);
        Engineer e2 = new Engineer("first2", "sur2", 200);
        Engineer e3 = new Engineer("first3", "sur3", 300);

        List<Engineer> engineers = new ArrayList<>(3);
        engineers.add(e1);
        engineers.add(e2);
        engineers.add(e3);

        // instanciate PrintStream here, before the loop starts
        PrintStream writetoEngineer = new PrintStream(new File("Engineer.txt"));
        for (Engineer engineer : engineers) {
            // new PrintStream(...) here truncates the file (see javadoc)               //This is not append.Only print.Refresh file on each item 
            writetoEngineer.append(engineer.toString()).append(' ')
                        .append("" + engineer.calculateMonthly()).append('\n'); 

        }
    }

}
Автор: yair Размещён: 07.11.2011 10:50
Вопросы из категории :
32x32