#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:
Есть несколько проблем, которые я вижу:
- Вам нужно закрыть свои потоки в предложении finally (или, что еще лучше, использовать try-with-resource ). В противном случае, если генерируется исключение, прерывающее обычный поток программы, ваш поток не будет закрыт немедленно.
- Вы должны закрывать только самый внешний объект потока (например, ваш BufferedReader, но не FileReader)
- Вы проглатываете исключения. По крайней мере, выполните printStackTrace() для перехваченных вами исключений, чтобы вы могли видеть, действительно ли они выбрасываются.
- Избегайте таких методов, как File.delete(), которые не генерируют исключения в случае ошибки. Вместо этого используйте эквивалентные методы на Files.class , которые генерируют исключения в случае ошибки.
Кстати, хотя это не проблема как таковая, вам не нужно вызывать flush() непосредственно перед close() — последняя автоматически сбрасывается перед закрытием.
Комментарии:
1. Когда вы закрываете самый внешний объект потока (BufferedReader), он автоматически закрывает внутренний поток (средство чтения файлов).
2. @Neil Coffey Спасибо вам за все ваши предложения, как новичок, я постараюсь избежать всех ошибок, которые вы указали. И моя проблема будет решена после прочтения документа, который вы приложили. Я внедрил блок finally, и теперь он работает отлично.