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