2016-04-14 3 views
0

Я пытаюсь написать программу, которая управляет документом списка контактов, который пользователь имеет. Программа должна запрашивать у пользователя файл, который они хотят импортировать, а затем предоставить им параметры для отображения списка контактов, добавления контакта, удаления контакта и сохранения текущей версии контакта. Все в моем коде работает до тех пор, пока я не попытаюсь вывести файл. Я получаю «FileNotFoundException (слишком много файлов в системе)». Ниже мой код до сих пор:Как переписать существующий файл в программе Java?

import java.io.*; 
import java.util.Scanner; 
import java.util.TreeMap; 

public class ContactList { 

public static void main (String [] args) throws IOException 
{ 
    String contactFile = null; 
    Scanner input = new Scanner(System.in); 
    System.out.print("Enter name of contact file: "); 
    contactFile = input.next(); 

    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(contactFile))); 
    TreeMap< String, String > contacts = new TreeMap< String, String >(); 
    Contact contact = new Contact(); 

    br.close(); 



    menu(); 
    int userChoice = input.nextInt(); 

    while (userChoice != 4) 
    { 
     if (userChoice == 1) 
     { 

      menu(); 
      userChoice = input.nextInt(); 
     } 

     if (userChoice == 2) 
     { 
      System.out.print("Number of contacts to add: "); 
      int numContacts = input.nextInt(); 

      for (int i = 0; i < numContacts; i++) 
      { 

       contact.setName(input.nextLine()); 
       System.out.print("Enter contact's name (Last name, First name): "); 
       contact.setName(input.nextLine()); 
       contact.setPhoneNumber(input.nextLine()); 
       System.out.print("Enter contact's phone number (xxx-xxx-xxxx): "); 
       contact.setPhoneNumber(input.nextLine()); 
       contact.setEmail(input.nextLine()); 
       System.out.print("Enter contact's email (ex. [email protected]): "); 
       contact.setEmail(input.nextLine()); 

       contacts.put(contact.getName(), contact.remainingInfo()); 
      } 

      menu(); 
      userChoice = input.nextInt(); 
     } 

     if (userChoice == 3) 
     { 
      System.out.print("Enter name of contact you wish to remove (Last name, First name): "); 
      contacts.remove(input.nextLine()); 

      menu(); 
      userChoice = input.nextInt(); 
     } 

    } 

    if (userChoice == 4) 
    { 
     PrintWriter outFile = new PrintWriter(contactFile); 
     outFile.print(contacts.entrySet()); 
    } 

} 

public static void menu() 
{ 
    System.out.println("1 Display Contact List"); 
    System.out.println("2 Add a Contact"); 
    System.out.println("3 Remove a Contact"); 
    System.out.println("4 Save Contact List and Exit"); 
    System.out.print("Command: "); 
} 
} 

И Контактная класс, если это необходимо:

public class Contact { 
private String name; 
private String phoneNumber; 
private String email; 

public void setName(String name) { 
    this.name = name; 
} 

public void setPhoneNumber(String phoneNumber) { 
    this.phoneNumber = phoneNumber; 
} 

public void setEmail(String email) { 
    this.email = email; 
} 

public String getName() 
{ 
    return name; 
} 

public String remainingInfo() 
{ 
    return phoneNumber + " " + email; 
} 

} 

Есть ли способ, чтобы импортировать файл, внести изменения, перезаписать этот файл, и выход/сохранить Это? Я думал, что вывод отредактированного файла в одно и то же место будет перезаписывать его, но, видимо, нет.

Обновление: Сообщение об ошибке я получаю читает:

Exception in thread "main" java.io.FileNotFoundException: /Users/jesbarba/Desktop/Contacts.txt (Too many open files in system) 
at java.io.FileOutputStream.open0(Native Method) 
at java.io.FileOutputStream.open(FileOutputStream.java:270) 
at java.io.FileOutputStream.<init>(FileOutputStream.java:213) 
at java.io.FileOutputStream.<init>(FileOutputStream.java:101) 
at java.io.PrintWriter.<init>(PrintWriter.java:184) 
at ContactList.main(ContactList.java:70) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 

Это при использовании IntelliJ

+0

где ваш код для вывода файла? – ControlAltDel

+0

Является ли «FileNotFoundException (слишком много файлов в системе)» точного сообщения об ошибке или вы переводите его с другого языка? Если это так, и это linux/unix, можете ли вы запустить LANG = C LC_ALL = C java ContactList', чтобы получить английские сообщения? –

+0

@thatotherguy Обновленный вопрос, чтобы отразить точное сообщение об ошибке, которое я получаю. – Jes

ответ

0

вам нужно обернуть не ваш BufferedReader br и ваш PrintWriter outFile в try-with-resources statement в следующем, потому что в противном случае вы никогда не закрыть ваш файлы, которые могут быть проблемой, особенно в ОС Windows:

try (PrintWriter outFile = new PrintWriter(contactFile)) { 
    outFile.print(contacts.entrySet()); 
} 
+0

Это сработало при первом запуске программы, но теперь я не могу запустить ее с тем же измененным файлом. Я получаю тот же FileNotFoundException этот галстук, говорящий «Нет такого файла или каталога». Я попробовал обернуть BufferedReader br в заявлении try. – Jes

+0

Необходимо перезагрузить компьютер –

+0

Перезагрузка не помогла. – Jes