Мои читатели и авторы в этом методе не закрываются должным образом?

#java

#java

Вопрос:

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

Вставить запись

     public void RegCustomer()
{
    try
    {
        File F = new File("Customer.txt");
        FileWriter fw = new FileWriter(F, true);
        BufferedWriter bw = new BufferedWriter(fw);
        PrintWriter pw = new PrintWriter(bw);
        //PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(F, true)));
        pw.println(this.Name "," this.CheckInDate "," this.CheckOutDate "," this.Floor "," this.RoomID "," this.ICNumber "," this.Contact "," this.Email);
        pw.flush();
        pw.close();
        fw.close();
        bw.close();
    }
    catch(Exception e)
    {
    }
}
 

Удалить запись

 public boolean delcus(String Target)
{
    boolean success = false;
    File F = new File("Customer.txt");
    File Ftc = new File("Temp.txt");
    try
    {
        FileReader fr = new FileReader(F);
        BufferedReader br = new BufferedReader(fr);
        PrintWriter pr = new PrintWriter(Ftc);
        String line = br.readLine();
        while (line!=null)
        {
            String[] wordsinLine = line.split(","); 
            if (wordsinLine[0].equals(Target))
            {
            }
            else
            {
                pr.println(line);
                success = true;
            }

            line = br.readLine();
        }
        if (success)
        {
            pr.flush();
            pr.close();
            br.close();
            fr.close();
        }
    }
    catch (Exception e)
    {
    }
    F.delete();
    File dump = new File("Customer.txt");
    Ftc.renameTo(dump);
    return success;
}
 

У меня есть другой метод, который проверяет несколько условий перед запуском метода insert.

 public int checkroom()
{
    int check = 0;
    int ciDay = this.CheckInDate/10000;
    int ciMonth = (this.CheckInDate/100)%100;
    int coDay = this.CheckOutDate/10000;
    int days = coDay - ciDay;
    String name;
    int Dbcid;
    int Dbcod;
    int DbFloor;
    int DbRoomID;
    
    try
    {
        File F = new File("Customer.txt");
        FileReader Fr = new FileReader(F);
        BufferedReader Reader = new BufferedReader(Fr);
        Scanner Sc = new Scanner(Reader);
        Sc.useDelimiter("[,n]");
        while(Sc.hasNext())
        {
            name = Sc.next();
            Dbcid = Sc.nextInt();
            Dbcod = Sc.nextInt();
            DbFloor = Sc.nextInt();
            DbRoomID = Sc.nextInt();
            
            if (days <= 7)
            {
                if (DbFloor == this.Floor amp;amp; DbRoomID == this.RoomID)
                {
                    int DbcidDay = Dbcid/10000;
                    int DbcidMonth = (Dbcid/100)%100;
                    int DbcodDay = Dbcod/10000;
                    if(ciMonth == DbcidMonth)
                    {
                        if (ciDay >= DbcidDay amp;amp; ciDay < DbcodDay)
                        {
                            check = 2;
                        }
                        else if (coDay >= DbcidDay amp;amp; coDay < DbcodDay)
                        {
                            check = 3;
                        }
                        else if (ciDay <= DbcidDay amp;amp; coDay >= DbcodDay)
                        {
                            check = 4;
                        }
                        else
                        {
                            check = 1;
                        }
                    }
                    else
                    {
                        check = 1;
                    }
                }
                else
                {
                    check =1;
                }
            }
            else
            {
                check =5;
            }
        }
        if(check > 0)
        {
            Sc.close();
            Reader.close();
            Fr.close();
        }
    }
    catch (Exception e)
    {
    }
    return check;
}
 

Комментарии:

1. docs.oracle.com/javase/tutorial/essential/exceptions/…

Ответ №1:

Есть несколько проблем, которые я вижу:

  • Вам нужно закрыть свои потоки в предложении finally (или, что еще лучше, использовать try-with-resource ). В противном случае, если генерируется исключение, прерывающее обычный поток программы, ваш поток не будет закрыт немедленно.
  • Вы должны закрывать только самый внешний объект потока (например, ваш BufferedReader, но не FileReader)
  • Вы проглатываете исключения. По крайней мере, выполните printStackTrace() для перехваченных вами исключений, чтобы вы могли видеть, действительно ли они выбрасываются.
  • Избегайте таких методов, как File.delete(), которые не генерируют исключения в случае ошибки. Вместо этого используйте эквивалентные методы на Files.class , которые генерируют исключения в случае ошибки.

Кстати, хотя это не проблема как таковая, вам не нужно вызывать flush() непосредственно перед close() — последняя автоматически сбрасывается перед закрытием.

Комментарии:

1. Когда вы закрываете самый внешний объект потока (BufferedReader), он автоматически закрывает внутренний поток (средство чтения файлов).

2. @Neil Coffey Спасибо вам за все ваши предложения, как новичок, я постараюсь избежать всех ошибок, которые вы указали. И моя проблема будет решена после прочтения документа, который вы приложили. Я внедрил блок finally, и теперь он работает отлично.