每次用户保存库时保存到新的 txt 文件
Saving to new txt file each time library saved by user
如何才能让我的应用程序在每次用户希望保存时保存到新的 .txt 文件,而不是覆盖现有文件?
我有这段代码可以运行并将信息保存到文本文件中:
if(Menu.menuChoice == 1 && Library.ManualList.size() > 0){
Library.displayManualList();
boolean saveYesNo = Console.readYesNo("The ManualKeeper® app is able to save your current library to a '.txt' \nfile in your workspace directory.\n\nWould you like to save the current library? (Y/N):\n");
if(saveYesNo){
try {
FileWriter fw = new FileWriter("Library.txt");
PrintWriter pw = new PrintWriter(fw);
for (int i1 = 0; i1 < Library.ManualList.size(); i1++){
pw.println("-------------------- Index Number: " + i1 + " --------------------");
pw.println(Library.ManualList.get(i1).displayManual());
pw.println("---------------------------------------------------------\n");
}
pw.close();
} catch (IOException e) {
System.out.println("Error! Library unable to save.");
}
System.out.println("\n\n--------------------------------------------------------------------------");
System.out.println("\n Library saved!\n");
System.out.println("--------------------------------------------------------------------------\n");
}
else if(saveYesNo){
System.out.println("\n");
}
理想情况下,我希望文件以编号方式保存,这样用户以后可以轻松select查看要查看的 .txt 文件。
每次都保存到一个新文件,文件名必须是唯一的。
您可以通过多种方式实现这一点。一些想法:
文件名中的日期+时间
将当前日期+时间添加到文件名中,这也将像以前一样提供信息created/saved,并且在列出文件时,较新的文件自然会在列表的末尾。
String name = "Library-"
+ new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss").format(new Date()) + ".txt";
作为替代方案,您可以简单地附加 System.currentTimeMillis()
这将保留自然创建顺序但不会那么好 looking/informative:
String name = "Library-" + System.currentTimeMillis() + ".txt";
文件名中的随机字符串
这可能不太好看,但是例如:
String name = "Library-" + UUID.randomUUID() + ".txt";
文件名中的计数器
想法是在文件名中使用计数器,所以第一个应该是"Library.txt"
,第二个应该是"Library (2).txt"
,第三个应该是"Library (3).txt"
等等
为此,我们必须检查现有文件以确定计数器的下一个值。这是一个如何做的例子。这不是最佳的,但可以完成工作:
public static Path uniqueFile() {
Path file = Paths.get("Library.txt").toAbsolutePath();
if (!Files.exists(file))
return file;
Path folder = file.getParent();
for (int counter = 2; true; counter++) {
file = folder.resolve(String.format("Library (%d).txt", counter));
if (!Files.exists(file))
return file;
}
}
并使用它:
String name = uniqueFile().getFileName().toString();
如果应用程序是用GUI制作的,一个fileDialog会是最好的(如果他想覆盖文件就保存,就好像他想把它保存到一个新文件一样,就像很多应用程序一样)。
在您的情况下,您应该使用计数器并将其添加到文件末尾,如 Library1.txt。
如果重新运行应用程序,当然会重置此计数器变量。它没有被存储。我建议将这个变量(和其他类似的属性)存储在另一个文件中,例如config.txt
您可以阅读此 config.txt 文件(并像我在之前的回答中向您展示的那样对其进行解析)。因此,每次启动应用程序时,您都会读取 config.txt 文件,设置计数器。当然,在退出应用程序之前,您必须将计数器保存到 config.txt 文件。
只是伪代码:
//load at start of application
counter = loaded from config.txt
//save to a new file
FileWriter fw = new FileWriter("Library" + counter++ + ".txt");
//save counter to config.txt file
如何才能让我的应用程序在每次用户希望保存时保存到新的 .txt 文件,而不是覆盖现有文件?
我有这段代码可以运行并将信息保存到文本文件中:
if(Menu.menuChoice == 1 && Library.ManualList.size() > 0){
Library.displayManualList();
boolean saveYesNo = Console.readYesNo("The ManualKeeper® app is able to save your current library to a '.txt' \nfile in your workspace directory.\n\nWould you like to save the current library? (Y/N):\n");
if(saveYesNo){
try {
FileWriter fw = new FileWriter("Library.txt");
PrintWriter pw = new PrintWriter(fw);
for (int i1 = 0; i1 < Library.ManualList.size(); i1++){
pw.println("-------------------- Index Number: " + i1 + " --------------------");
pw.println(Library.ManualList.get(i1).displayManual());
pw.println("---------------------------------------------------------\n");
}
pw.close();
} catch (IOException e) {
System.out.println("Error! Library unable to save.");
}
System.out.println("\n\n--------------------------------------------------------------------------");
System.out.println("\n Library saved!\n");
System.out.println("--------------------------------------------------------------------------\n");
}
else if(saveYesNo){
System.out.println("\n");
}
理想情况下,我希望文件以编号方式保存,这样用户以后可以轻松select查看要查看的 .txt 文件。
每次都保存到一个新文件,文件名必须是唯一的。
您可以通过多种方式实现这一点。一些想法:
文件名中的日期+时间
将当前日期+时间添加到文件名中,这也将像以前一样提供信息created/saved,并且在列出文件时,较新的文件自然会在列表的末尾。
String name = "Library-"
+ new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss").format(new Date()) + ".txt";
作为替代方案,您可以简单地附加 System.currentTimeMillis()
这将保留自然创建顺序但不会那么好 looking/informative:
String name = "Library-" + System.currentTimeMillis() + ".txt";
文件名中的随机字符串
这可能不太好看,但是例如:
String name = "Library-" + UUID.randomUUID() + ".txt";
文件名中的计数器
想法是在文件名中使用计数器,所以第一个应该是"Library.txt"
,第二个应该是"Library (2).txt"
,第三个应该是"Library (3).txt"
等等
为此,我们必须检查现有文件以确定计数器的下一个值。这是一个如何做的例子。这不是最佳的,但可以完成工作:
public static Path uniqueFile() {
Path file = Paths.get("Library.txt").toAbsolutePath();
if (!Files.exists(file))
return file;
Path folder = file.getParent();
for (int counter = 2; true; counter++) {
file = folder.resolve(String.format("Library (%d).txt", counter));
if (!Files.exists(file))
return file;
}
}
并使用它:
String name = uniqueFile().getFileName().toString();
如果应用程序是用GUI制作的,一个fileDialog会是最好的(如果他想覆盖文件就保存,就好像他想把它保存到一个新文件一样,就像很多应用程序一样)。
在您的情况下,您应该使用计数器并将其添加到文件末尾,如 Library1.txt。 如果重新运行应用程序,当然会重置此计数器变量。它没有被存储。我建议将这个变量(和其他类似的属性)存储在另一个文件中,例如config.txt
您可以阅读此 config.txt 文件(并像我在之前的回答中向您展示的那样对其进行解析)。因此,每次启动应用程序时,您都会读取 config.txt 文件,设置计数器。当然,在退出应用程序之前,您必须将计数器保存到 config.txt 文件。
只是伪代码:
//load at start of application
counter = loaded from config.txt
//save to a new file
FileWriter fw = new FileWriter("Library" + counter++ + ".txt");
//save counter to config.txt file