我做了一个小型地址簿程序,允许用户:
在您输入一个选项后结束,我希望它继续运行,直到用户说例如5-退出
另一个问题我希望数据写入并读取到data.dat文件
我是完全新的,有些人可以告诉我如何将它分成不同的类并相互继承。
我的代码:
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class AddressBookOperations
{
public static void main(String[] args) throws IOException
{
String s = null;
String s2 = null;
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
// Console in = System.console();
System.out.println(" Please select the required operations.\n"
+ " 1- Add contact\t 2- search contact\t 3- delete contact\t 4- display all contacts\n");
s2 = in.readLine();
if (s2 != null && !(s2.equals("1") || s2.equals("2") || s2.equals("3") || s2.equals("4")))
{
System.out.println("Invalid Operation Selected\n");
System.exit(0);
}
else
{
s = s2;
}
if (s != null)
{
String dataLine;
String data;
if (s.equals("1")) {
System.out.println("Name: ");
dataLine = in.readLine();
data = dataLine;
in = new BufferedReader(new InputStreamReader(System.in));
System.out.println("PhoneNumber: ");
dataLine = in.readLine();
data = data + ":" + dataLine;
writeToFile("C:/AddressBook.bat", data, true, true);
} else if (s.equals("2")) {
System.out.println("Enter Name 0r PhoneNumber: ");
dataLine = in.readLine();
String result = readFromFile("C:/AddressBook.bat", dataLine);
System.out.println("Search Results\n" + result);
} else if (s.equals("3")) {
System.out.println("Enter Name: ");
dataLine = in.readLine();
data = dataLine;
System.out.println("PhoneNumber: ");
dataLine = in.readLine();
data = data + ":" + dataLine;
deleteFromFile("C:/AddressBook.bat", data);
} else if (s.equals("4")) {
String result = readFromFile("C:/AddressBook.bat", null);
System.out.println("Search Results\n" + result);
}
}
}
private static void deleteFromFile(String string, String dataLine) {
String data = readFromFile(string, null);
data = data.replaceAll(dataLine, "");
writeToFile(string, data, false, false);
}
public static boolean writeToFile(String fileName, String dataLine,
boolean isAppendMode, boolean isNewLine) {
if (isNewLine) {
dataLine = "\n" + dataLine;
}
try {
File outFile = new File(fileName);
DataOutputStream dos;
if (isAppendMode) {
dos = new DataOutputStream(new FileOutputStream(fileName, true));
} else {
dos = new DataOutputStream(new FileOutputStream(outFile));
}
dos.writeBytes(dataLine);
dos.close();
} catch (FileNotFoundException ex) {
return (false);
} catch (IOException ex) {
return (false);
}
return (true);
}
/*
* Reads data from a given file
*/
public static String readFromFile(String fileName, String dataLine2) {
String DataLine = "";
String fileData = "";
try {
File inFile = new File(fileName);
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(inFile)));
if (dataLine2 != null)
{
while ((DataLine = br.readLine()) != null)
{
if (DataLine.contains(dataLine2)) {
fileData = DataLine;
}
}
}
else
{
while ((DataLine = br.readLine()) != null)
{
fileData = fileData + "\n" + DataLine;
//System.out.println(DataLine);
}
}
br.close();
}
catch (FileNotFoundException ex)
{
return (null);
} catch (IOException ex)
{
return (null);
}
return (fileData);
}
public static boolean isFileExists(String fileName) {
File file = new File(fileName);
return file.exists();
}
}
答案 0 :(得分:1)
您可以将逻辑包装在while
循环中,该循环在给定boolean
为真时终止,因此您将在执行每个操作后继续返回到开始。例如:
boolean isRunning = true;
while (isRunning) {
//your code here
if (s2.equals("5")) {
isRunning = false;
}
}
您还应该将所有逻辑从main()
移出并转移到从main()
调用的自己的单独函数中。我也不确定你为什么要写一个.bat文件?如果要写入.dat文件,请将扩展名更改为.dat。
答案 1 :(得分:0)
我想你只想要一般的代码审查。以下是我的想法:
1。 Scanner更容易用于控制台输入,因为您可以指定输入类型,例如nextInt()
。要初始化它,只需使用
Scanner sc = new Scanner(System.in);
您可以在程序过程中为每个用户输入使用相同的Scanner
。另外,请记得在程序退出前致电Scanner.close()
。
2。按如下方式初始化BufferedReader
:
// file is a String variable
BufferedReader in = new BufferedReader(new FileReader(file));
类似地,读取文件如下:
BufferedWriter br = new BufferedWriter(new BufferedReader(file));
3。为了使程序保持运行,请练习实现do-while块:
boolean quit = false;
do {
// loop program; when user is finished, set quit = true
} while (!quit)
4。对于基于“请选择所需操作”的条件,请练习实施switch块。
5。通过将控制台界面设置为单独的类(例如AddressBookUI
),分离用于解析用户输入的逻辑和用于在地址簿上操作的逻辑。当它运行时,它应该立即创建AddressBookOperations
类的实例,并根据用户输入从那里调用适当的方法 - AddressBookOperations
应该为每个操作都有一个单独的方法(这也将使你的切换很短)。它还应该有以下private
(但不是static
)变量来存储文件名和BufferedRead / Writer。该类应该有一个带有String filename
参数的构造函数,用于初始化这些变量。
6。在Java中删除文件中的特定行非常棘手。试试这个:
BufferedReader
。BufferedWriter
。