java - Сбой чтения/записи файлов и не работает

Я делаю программу для тех, кто читает/пишет в файл. Я создал его и протестировал, но он вылетает, когда я говорю ему имя. Код:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.util.Scanner;

public class Main {
public static void main(String[] args) throws Exception {

    Scanner scanner = new Scanner(System.in);

    print("Enter a name for the bell: ");
    String bellname = scanner.nextLine();

    FileInputStream fs = new FileInputStream("normbells.txt");
    DataInputStream in = new DataInputStream(fs);
    BufferedReader br = new BufferedReader(new InputStreamReader(in));

    FileWriter fr = new FileWriter("normbells.txt");
    BufferedWriter bw = new BufferedWriter(fr);
    String line;

    while((line = br.readLine()) != null) {
        int index = line.indexOf(":");

        if(index == -1) {}else{
            String name = line.substring(0, index);

            if(bellname.equals(name)) {
                print("This bell name is already taken!");
                line = null;
                return;
            }

            print("Enter a time for the bell (24-hour format, please): ");

            String time = scanner.nextLine();

            String toWrite = name + ":" + time;

            boolean hasFoundNull = false;
            String currentString;

            while(hasFoundNull == false) {
                currentString = br.readLine();

                if(currentString == null) {
                    hasFoundNull = true;
                    bw.write(toWrite);
                }else{}
            }
        }
    }
}

public static void print(String args) {
    System.out.println(args);
}
}

Вот результат: Введите имя для звонка: Durp

Вот содержимое файла: На самом деле файл пустой. Его почему-то стерли. Вот что у него было изначально: Durp:21:00


person cheese5505    schedule 17.04.2012    source источник
comment
Не пытайтесь читать и писать в файл одновременно. Открой, прочитай, закрой. Открой, напиши, закрой.   -  person Andrew Thompson    schedule 17.04.2012
comment
Неа. Просто «прекращено», как сказано в Eclipse.   -  person cheese5505    schedule 17.04.2012
comment
@AndrewThompson Спасибо, попробую. Все равно не работает :/   -  person cheese5505    schedule 17.04.2012
comment
@ Патрик Забыл, попробую. Все равно не работает :/   -  person cheese5505    schedule 17.04.2012
comment
Были ли какие-то части последних двух слов открой, напиши, закрой, которые тебе трудно понять? О_о   -  person Andrew Thompson    schedule 17.04.2012
comment
@cheese5505: Не могли бы вы обновить свой вопрос новым кодом?   -  person Patrick    schedule 17.04.2012
comment
Не смешивайте DataInputStream и BufferedReader, DataInputStream здесь не нужен, я бы его убрал.   -  person Peter Lawrey    schedule 17.04.2012
comment
@Patrick BufferedWriter.close() 'закрывает поток, сначала очищая его'. Вы должны прекратить распространять эту дезинформацию.   -  person user207421    schedule 17.04.2012
comment
@EJP: я просто пытаюсь помочь, не надо грубить   -  person Patrick    schedule 17.04.2012
comment
@Patrick Ваш комментарий содержал дезинформацию, которую вы использовали в других случаях. Сказать так не грубо, это необходимая и стандартная часть любого критического обмена мнениями.   -  person user207421    schedule 17.04.2012
comment
@EJP: я никогда не говорил, что close не вызывает сначала сброс. Я предположил, что OP может попытаться сбросить содержимое перед выходом из приложения.   -  person Patrick    schedule 17.04.2012
comment
@EJP: В других случаях? Вы имеете в виду тот один вопрос о socket.isConnected? Я сожалею, что ошибся..   -  person Patrick    schedule 17.04.2012
comment
@Patrick Поскольку ваш комментарий был таинственным образом удален, проверить это утверждение невозможно: однако я не помню, что в нем было. Тот факт, что это не решило проблему ОП, также имеет значение. Не знаю, сколько раз вас нужно исправлять, но я буду настаивать на исправлении дезинформации везде, где я ее увижу.   -  person user207421    schedule 17.04.2012
comment
@EJP: Да, я удалил оба комментария, так как они были неверными и содержали дезинформацию.   -  person Patrick    schedule 17.04.2012


Ответы (1)


FileWriter также имеет конструктор FileWriter(String, boolean), где логический флаг означает "добавлять". Если вы не укажете его, оно будет ложным, и файл будет очищен перед записью в него.

Итак, замените

fr = new FileWriter("normbells.txt");

с участием

fr = new FileWriter("normbells.txt", true);

и, возможно, это сработает.

person Sorin    schedule 17.04.2012