У меня есть эти два класса: Contact
и Phonebook
:Чтение из текстового файла и создания массива объектов Java
public class Contact implements Comparable<Contact> {
private String name;
String[] numbers;
private final int NUMBER_LIMIT = 5;
}
public class Phonebook {
private final int CONTACT_LIMIT = 250;
Contact[] contacts;
}
Я хочу, чтобы преобразовать данные из обоих классов String
и сохранить его в текстовый файл , Для этого я написал следующие функции:
public class Contact {
@Override
public String toString() {
StringBuilder str = new StringBuilder();
int len = numbers.length;
str.append(name);
str.append(System.lineSeparator());
str.append(len);
str.append(System.lineSeparator());
for (int i = 0; i < len; i++) {
str.append(numbers[i]);
if (i != len - 1)
str.append(System.lineSeparator());
}
return str.toString();
}
}
public class Phonebook {
@Override
public String toString() {
StringBuilder str = new StringBuilder();
for (int i = 0, n = contacts.length; i < n; i++) {
str.append(contacts[i].toString());
if (i != n - 1) str.append(System.lineSeparator());
}
return str.toString();
}
public static boolean saveAsTextFile(Phonebook phonebook, String path) {
boolean saved = true;
PrintWriter toFile = null;
try {
toFile = new PrintWriter(new FileOutputStream(path));
toFile.println(phonebook.toString());
}
catch (FileNotFoundException e) {
saved = false;
}
finally {
toFile.close();
}
return saved;
}
}
Следующий шаг чтения содержимого из существующего текстового файла и воссоздает объект в телефонной книге. Текстовый файл имеет следующий формат:
Contact name (String)
Number of phone numbers (int)
Phonenumber(s) (String)
В текстовом файле может быть более одного контакта. До сих пор я эту функцию для создания контакта из строки:
public static Contact valueOf(String s) throws InvalidFormatException {
String lineSeparator = System.lineSeparator();
String[] chunks = s.split(lineSeparator);
int len = chunks.length;
if (len < 2) throw new InvalidFormatException();
//System.out.println(Arrays.toString(chunks));
String name = chunks[0];
String[] numbers = new String[Integer.parseInt(chunks[1])];
for (int i = 2; i < len; i++)
numbers[i - 2] = chunks[i];
Contact contact = null;
try {
contact = new Contact(name, numbers);
return contact;
}
catch (Exception e) {
throw new InvalidFormatException();
}
}
И это одно для создания телефонной книги (Это работа в процессе):
public static Phonebook loadFromTextFile(String path) throws FileNotFoundException, InvalidFormatException {
Scanner inputStream = new Scanner(new FileInputStream(path));
ArrayList<String> contactInfo = new ArrayList<String>();
int ctr = 0;
int numContacts;
String contactString = "";
Contact contact = null;
while (inputStream.hasNextLine()) {
contactInfo.add(inputStream.nextLine());
if (ctr == 1) {
numContacts = Integer.parseInt(contactInfo.get(ctr));
for (int j = 0; j < numContacts; j++) {
contactInfo.add(inputStream.nextLine());
}
System.out.println("contactString inside while loop:");
contactString = String.join(System.lineSeparator(), contactInfo);
System.out.println(contactString);
contact = Contact.valueOf(contactString);
contactInfo.clear();
System.out.println("contact inside while loop:");
System.out.println(contact);
ctr = 0;
}
ctr++;
}
Проблема Я что эта функция работает только для одного контакта в файле. Если их несколько, это не сработает. Что я делаю не так? Моя логика такова:
чтения строки из текстового файла и сохранить его в ArrayList
Если отсчитать количество контактов:
- перебирать числа контактов, чтение каждую строку и хранить ее в ArrayList
Когда закончите, преобразуйте содержимое ArrayL ist в String, переместите его в контактString и вызовите Contact.valueOf (String s). Когда я получу эту работу, сохраните полученный контакт в контакте [].
Empty ArrayList и начать снова.
Повторите до EOF
Я не могу понять, что является причиной проблемы. Любая помощь приветствуется.
Примечание: Если это имеет значение, это домашнее задание.
EDIT: Пример файла .txt:
John Doe
3
3124354353
1234324534
5768324242
Alice
1
0547623424
Bob
2
7863257643
3128443552
не будет выполняться цикл while while до конца файла? ctr не является частью его условия –
Фактически, я всегда пропускаю второе имя таким образом. После инструкции 'if'' 'ctr' снова 1, что позволяет пропустить имя контакта перед' numOfContacts'. Я должен только изменить его на 'ctr = -1' –
Фактически он может заходить за пределы. Вы не проверяете 'hasNextLine' в цикле for внутри цикла while. Я считаю, что способ использования 'ctr' приводит к получению только одного контакта. Будет здорово, если вы опубликуете пример текстового файла для этого –