#java #file #oop #inheritance #vector
#Ява #файл #ООП #наследование #вектор
Вопрос:
Я пишу код, который обновляет файл после каждого изменения, список, из которого он берется, является статическим списком (примечание: раньше он не был статичным, но ошибка все равно произошла). Я использовал флаги, которые показывают мне текущее количество (и размер, если это каким-то образом изменится), но все казалось нормальным. В чем может быть причина этого? Обновление файла было установлено в значение true, и цикл добавлял последний элемент несколько раз. Когда значение обновления файла было изменено на false, цикл переписал весь файл в последний элемент (примеры обоих будут опубликованы ниже).
Класс с методом обновления:
import java.io.*; import java.util.*; public class Users { //Protected variables protected String NAME, ID, PASS, DEP; //Global list protected static List globalList = new List (); //default constructor for Users public Users () { NAME = ""; ID = ""; PASS = ""; DEP = ""; } //Full constructor for Users public Users (String name, String id, String pass, String dep) { this.NAME = name; this.ID = id; this.PASS = pass; this.DEP = dep; } //Parent method meant to be overridden in child classes public boolean authenticate(String a, String b) throws IOException {return false;} //Used to update the files after every change protected void update () { //Three strings to store full lines for the file String full1 = "", full2 = "", full3 = ""; //count variable to be incremented to access different objects in instructors int count1 = 0; //Iterator iterates the vector by amount of objects in it Iterator it1 = globalList.InstructorList.iterator(); //while iterator has next object while (it1.hasNext()amp;amp; count1 lt; globalList.InstructorList.size() ) { //Goes to global list and accesses the instructor list with the element at count, using the iterator here might also work String name = "" globalList.InstructorList.elementAt(count1).getName() "t"; String id = " t" globalList.InstructorList.elementAt(count1).getId() "t"; String pass = " t" globalList.InstructorList.elementAt(count1).getPassword() "t"; String dep = " t" globalList.InstructorList.elementAt(count1).getDep() "t"; String courses = " t" globalList.InstructorList.elementAt(count1).getCourses() "t"; count1 ; //stores the string in full 1 full1 = name id pass dep courses "1n"; } //Same concept as above count1 = 0; Iterator it3 = globalList.StudentList.iterator(); while (it3.hasNext() amp;amp; count1 lt; globalList.StudentList.size()) { String name = "" globalList.StudentList.elementAt(count1).getName() " t"; String id = " t" globalList.StudentList.elementAt(count1).getId() " t"; String pass = " t" globalList.StudentList.elementAt(count1).getPassword() " t"; String dep = " t" globalList.StudentList.elementAt(count1).getDep() " t"; String courses = " t" globalList.StudentList.elementAt(count1).getCourses() " t"; System.out.println ("The count in Student list is now: " count1); System.out.println ("The capa in Student list is now: " globalList.StudentList.capacity()); System.out.println ("The size in Student list is now: " globalList.StudentList.size()); full2 = name id pass dep courses "2n"; count1 ; } //Same concept as above count1 = 0; Iterator it5 = globalList.CourseList.iterator(); while (it5.hasNext() amp;amp; count1 lt; globalList.CourseList.size()) { String dep = " t" globalList.CourseList.elementAt(count1).getDep() " t"; String code = " t" globalList.CourseList.elementAt(count1).getCode() " t"; String name = " t" globalList.CourseList.elementAt(count1).getName() " t"; String section = " t" globalList.CourseList.elementAt(count1).getSection() " t"; String time = " t" globalList.CourseList.elementAt(count1).getTime() " t"; String roomnum = " t" globalList.CourseList.elementAt(count1).getRoomNum() " t"; String instruct = " t" globalList.CourseList.elementAt(count1).getInstruct() " t"; String strt = " t" globalList.CourseList.elementAt(count1).getStrtDate() " t"; String endt = " t" globalList.CourseList.elementAt(count1).getEndDate() " t"; String crdhr = " t" globalList.CourseList.elementAt(count1).getCrdHours() " t"; String reg = " t" globalList.CourseList.elementAt(count1).getRegisterStd() " t"; String curr = " t" globalList.CourseList.elementAt(count1).getCurrentStds() " t"; String max = " t" globalList.CourseList.elementAt(count1).getMaxStds() " t"; full3 = dep code name section time roomnum instruct strt endt crdhr reg curr max "3n"; count1 ; } try { //The false makes sure the file gets overwritten every time its updated PrintWriter fileout1 = new PrintWriter(new FileOutputStream(new File("Instructors.txt"),true)); PrintWriter fileout2 = new PrintWriter(new FileOutputStream(new File("Students.txt"),true)); PrintWriter fileout3 = new PrintWriter(new FileOutputStream(new File("Courses.txt"),true)); fileout1.println(full1); fileout2.println(full2); fileout3.println(full3); fileout1.close(); fileout2.close(); fileout3.close(); } catch (IOException e1) { e1.printStackTrace(); } } }
Один из файлов, установленный в значение true, до и после запуска в классе драйверов:
До:
ПОЛЬЗОВАТЕЛЬ1 1234 5678 КОМПЬЮТЕРНЫЙ КУРС1 нуль нуль нуль
ПОЛЬЗОВАТЕЛЬ2 2939 2428 БИЗНЕС-ноль ноль ноль ноль
ПОЛЬЗОВАТЕЛЬ3 2094 2480 ХИМИЧЕСКИЙ нуль нуль нуль нуль
После:
ПОЛЬЗОВАТЕЛЬ1 1234 5678 КОМПЬЮТЕРНЫЙ КУРС1 нуль нуль нуль
ПОЛЬЗОВАТЕЛЬ2 2939 2428 БИЗНЕС-ноль ноль ноль ноль
ПОЛЬЗОВАТЕЛЬ3 2094 2480 ХИМИЧЕСКИЙ нуль нуль нуль нуль ПОЛЬЗОВАТЕЛЬ3 2094 2480 ХИМИЧЕСКИЙ нуль нуль нуль нуль 2
ПОЛЬЗОВАТЕЛЬ3 2094 2480 ХИМИЧЕСКИЙ нуль нуль нуль нуль 2
ПОЛЬЗОВАТЕЛЬ3 2094 2480 ХИМИЧЕСКИЙ нуль нуль нуль нуль 2
Один из файлов, установленный на false, до и после запуска класса драйвера:
До:
ПОЛЬЗОВАТЕЛЬ1 1234 5678 КОМПЬЮТЕРНЫЙ КУРС1 нуль нуль нуль
ПОЛЬЗОВАТЕЛЬ2 2939 2428 БИЗНЕС-ноль ноль ноль ноль
ПОЛЬЗОВАТЕЛЬ3 2094 2480 ХИМИЧЕСКИЙ нуль нуль нуль нуль
После:
ПОЛЬЗОВАТЕЛЬ3 2094 2480 ХИМИЧЕСКИЙ нуль нуль нуль нуль
ПОЛЬЗОВАТЕЛЬ3 2094 2480 ХИМИЧЕСКИЙ нуль нуль нуль нуль
ПОЛЬЗОВАТЕЛЬ3 2094 2480 ХИМИЧЕСКИЙ нуль нуль нуль нуль
Комментарии:
1. Вы никогда не звоните
next
на свойIterator
s, которым вы вообще не пользуетесь.2. Они далее находятся внутри цикла while, разве это не считается? Куда же мне его тогда девать? @tgdavies
3. Ты звонишь
hasNext
, но никогда не звонишьnext
. Но вы не используете итераторы, поэтому вы можете просто удалить их.4.
//The false makes sure the file gets overwritten every time its updated
но ты проходишь мимоtrue
.5. 1) Будет ли лучше использовать next на итераторе вместо подсчета int? 2) Вы правы, спасибо, хотя ошибка все еще присутствует в другой форме даже после изменения. Я исправлю вопрос сейчас, чтобы показать. @tgdavies