如何在Java程序中重写现有文件?

如何在Java程序中重写现有文件?,java,Java,我正在尝试编写一个程序来管理用户拥有的联系人列表文档。程序应提示用户输入他们希望导入的文件,然后为他们提供显示联系人列表、添加联系人、删除联系人以及保存联系人当前版本的选项。在我尝试输出文件之前,代码中的所有内容都正常工作。我得到一个“FileNotFoundException(系统中的文件太多)”。以下是我目前的代码: import java.io.*; import java.util.Scanner; import java.util.TreeMap; public class Cont

我正在尝试编写一个程序来管理用户拥有的联系人列表文档。程序应提示用户输入他们希望导入的文件,然后为他们提供显示联系人列表、添加联系人、删除联系人以及保存联系人当前版本的选项。在我尝试输出文件之前,代码中的所有内容都正常工作。我得到一个“FileNotFoundException(系统中的文件太多)”。以下是我目前的代码:

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. johndoe@gmail.com): ");
                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: ");
}
}
是否有方法导入文件、进行更改、覆盖该文件并输出/保存?我认为将编辑过的文件输出到同一位置会覆盖它,但显然不会

更新:我收到的确切错误消息如下:

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)
线程“main”java.io.FileNotFoundException:/Users/jesbarba/Desktop/Contacts.txt中的异常(系统中打开的文件太多) 位于java.io.FileOutputStream.open0(本机方法) 在java.io.FileOutputStream.open(FileOutputStream.java:270) 位于java.io.FileOutputStream。(FileOutputStream.java:213) 位于java.io.FileOutputStream。(FileOutputStream.java:101) 位于java.io.PrintWriter(PrintWriter.java:184) 位于ContactList.main(ContactList.java:70) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 位于java.lang.reflect.Method.invoke(Method.java:497) 位于com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
这是在使用intelliJ

时,您需要将
BufferedReader br
PrintWriter outFile
包装到
try with resources语句中,作为下一步,因为否则您永远无法正确关闭文件,这可能是一个问题,尤其是在Windows操作系统上:

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

输出文件的代码在哪里?确切的错误消息是“FileNotFoundException(系统中的文件太多)”还是从其他语言翻译过来的?如果你是并且这是linux/unix,你能运行
LANG=C LC\u ALL=C java ContactList
来获取英文消息吗?@that otherguy更新了问题以反映我收到的确切错误消息。这在我第一次运行该程序时起作用,但现在我无法使用相同的修改过的文件来运行它。我得到了相同的FileNotFoundException,这条领带上写着“没有这样的文件或目录”。我尝试在try语句中包装BufferedReader br。您应该重新启动计算机。启动没有帮助。这很奇怪,我在您的代码中没有看到任何其他可能导致此异常的内容。我的错,我没有正确读取,您得到FileNotFoundException,因为文件contactFile不存在。您应该首先创建一个文件对象,如File=newfile(contactFile);然后测试file.exists()是否返回true
try (PrintWriter outFile = new PrintWriter(contactFile)) {
     outFile.print(contacts.entrySet());
}