Как перезаписать предыдущее содержимое FileWriter в Java

Привет, у меня есть 3 класса: первый и второй класс — это вычисления, а третий — это место, где я сохраняю данные из первых 2 классов в текстовый файл. Я пытаюсь повторно использовать свой метод, который записывает вычисленные значения из первого и второго класса в текстовый файл, используя FileWriter и BufferedWriter.

Итак, у меня есть что-то вроде этого:
1) первый класс выполняет вычисления
2) затем использует 3-й класс writeDetected, чтобы сохранить его в текстовом файле
3) 2-й класс выполняет вычисления
4) затем использует 3-й класс снова используя writeDetected

Все работает, за исключением случаев, когда я хотел сохранить расчеты, которые я сделал во 2-м классе. Содержимое текстового файла содержит предыдущие (расчеты первого класса) + расчеты второго класса. Я хотел иметь файл с расчетами первого класса и еще один файл с расчетами второго класса. Любые идеи о том, как я должен это сделать?

отредактировано:

Просто для иллюстрации:
это должно выглядеть примерно так:
класс 1 {1,2,3,4}
класс 2 {5,6,7,8}


На данный момент у меня есть
класс 1 {1,2,3,4}
класс 2 {1,2,3,4,5,6,7,8}

это мой код:

public void writeDetected(){
    Scanner getFileName = new Scanner(System.in);

    //Enter file name here for first class then after calculation of  
    // 2nd class enter another file name
    String getInp = getFileName.nextLine();
    try{
        FileWriter theFile = new FileWriter(getInp);
        BufferedWriter readBuf = new BufferedWriter (theFile); 
        String convDoubleToString;

        for (Double getVal: detected){
            convDoubleToString = getVal.toString();

            readBuf.write(convDoubleToString);
            readBuf.newLine();
        }

        readBuf.close();

    }

    catch (IOException e){
        System.out.println(e);
    }
}

person dimas    schedule 07.06.2012    source источник
comment
Это имеет значение? Но чтобы удовлетворить ваше любопытство, я не просто учусь программировать на Java.   -  person dimas    schedule 08.06.2012
comment
да, это важно, потому что люди пытаются по-разному отвечать на домашние вопросы, чтобы помочь человеку учиться. в вашем случае, если вы хотите записать в 2 разных файла, вам следует использовать 2 разных имени файла. Кроме того, вы всегда должны закрывать потоковые ресурсы в блоках finally.   -  person jtahlborn    schedule 08.06.2012
comment
Исходный код, который я дал, будет запрашивать имя файла перед сохранением каких-либо данных, и я написал точную последовательность выше. Поэтому у меня нет проблем с тем, чтобы называть каждый файл по-разному. Но спасибо за ответ, я, наконец, сохраню ваш совет по закрытию потоков внутри.   -  person dimas    schedule 08.06.2012


Ответы (2)


Попробуй это,

Отправлено path из calling method as Argument в Parameters of the called method, таким образом вы можете записать содержимое файла в любой файл, который хотите (Here вызываемый метод будет writeMyFile(String path) )

Eg:

public void writeMyFile(String path){

Scanner scan = new Scanner(System.in);

File f = new File(path);

FileWriter fr = new FileWriter(f);

BufferedWriter br  = new BufferedWriter(fr);

while(true){  // its a continuos loop, so better handle it the way u want it

 br.write(new Scanner(System.in).nextLine());

 } 
}
person Kumar Vivek Mitra    schedule 08.06.2012
comment
привет tnx за ответ, просто есть вопрос, что здесь в то время как (b)? это должно быть в то время как (br)? - person dimas; 08.06.2012
comment
также каково значение логического isDone здесь? Я не думаю, что он использовался в образце, который ты мне дал. - person dimas; 08.06.2012
comment
Извините, это была часть механизма управления циклом... это была моя программа командной строки, значение b управляет циклом while. Я забыл удалить его, так как я взял фрагмент из моей кодовой базы. Теперь я удалил его.. так что я надеюсь, что теперь все в порядке - person Kumar Vivek Mitra; 08.06.2012

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

person Logan    schedule 08.06.2012
comment
Привет, Логан, спасибо за ответ, у меня нет проблем с присвоением имени классу файла, связанному с каждым классом. Но мне просто нужно избавиться от содержимого ранее написанного класса, потому что я использую тот же метод для их написания. Я отредактировал свой вопрос с образцом, чтобы сделать его более понятным. - person dimas; 08.06.2012
comment
Возможно, после того, как writedetected будет завершено, вам нужно очистить обнаруженные файлы. Это какая-то коллекция? Поскольку это то, что использует ваш цикл for для записи, проблема в том, что он все еще содержит содержимое из первого класса. Попробуйте удалить обнаруженные после завершения записи. - person Logan; 08.06.2012
comment
Обнаружен ArrayList‹Double›, и да, я очистил его от предыдущих значений, прежде чем использовать тот же метод записи для сохранения класса 2. Поэтому я подозреваю, что это как-то связано с FileWriter или BufferedWriter и как очистить эти буферизованные или сохраненные файлы, хранящиеся временно. Я читал в документации по Java о flush() и close(), что он сохраняет эти временные файлы в памяти. Но я могу ошибаться, поэтому надеюсь на любые мысли по этому поводу. - person dimas; 08.06.2012
comment
Добавьте system.out.printline в свой цикл for, чтобы показать значение для каждой записи. Выведите ту же переменную, которую вы используете в команде записи. Этот массив должен содержать предыдущие значения. Ваши авторы создают новые объекты в вашем методе, поэтому я не думаю, что проблема в них. - person Logan; 08.06.2012
comment
да, я использую clear() для обнаружения. Я уверен, что у них нет значений, потому что я напечатал обнаруженный ArrayList, и он показывает только обнаруженные []. Я напечатал его после сохранения расчета файла для класса 1. - person dimas; 08.06.2012
comment
Распечатайте каждое значение перед записью, чтобы убедиться. Возможно, этот цикл обрабатывает больше, чем вы ожидаете. Также закройте файл, на всякий случай, если это вызывает это. - person Logan; 08.06.2012
comment
У вас есть только 1 выходной файл? Если так, то это проблема. Java добавляет к файлу, если он уже существует. Запустите f.remove() после объявления вашего файла, чтобы сначала удалить его. - person Logan; 08.06.2012
comment
Да, я также пытался закрыть Buffer и Writer, а также пытался установить логические значения Writer по-прежнему. У меня есть два файла, см. мою последовательность выше, пронумерованную 1-4. Я написал разные имена файлов для каждого класса, поэтому внутри метода записи есть сканер. Мой единственный другой вариант - просто создать два метода записи, по одному для каждого класса. Но мне очень хотелось узнать, как повторно использовать этот метод записи, потому что на всякий случай у меня будет более 100 таких классов. Я также не могу создать метод записи 100. - person dimas; 08.06.2012
comment
Добавьте систему из println перед записью. Это, по крайней мере, укажет, откуда берется содержимое файла. Вставьте результаты, если можете. Я сделал что-то похожее на это, но я передаю имя файла и массив в качестве параметров моему методу записи. Затем я создаю файл с именем файла и записываю в него содержимое массива в своем методе записи. Очень похоже на то, что у вас. - person Logan; 08.06.2012