因此,我只是在練習我的java編程,並希望利用它爲自己構建一個小型應用程序,這將使我的工作恢復,並且稍後將能夠創建預算和類似那。現在到代碼本身,所以我查了很多方法來寫入文件在Java中,我已經成功地這樣做,問題是,我使用相同的代碼,工作正常和丹迪......不' t在代碼的特定部分中工作,並且使用我的邏輯和知道當時代碼正在執行的操作,我無法理解它爲什麼不能正常工作,所以我需要有人來幫助檢查這個,看看他們是否抓到了我沒有看到。寫入不在某些區域工作的文件
package jobinfo;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Scanner;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class Login implements ActionListener
{
private JFrame frame;
private JButton loginB, newUserB;
private JTextField JTFUsername;
private JPasswordField JPFPassword;
public Login()
{
frame = new JFrame("JobInfo - Login");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setSize(500,500);
frame.setLayout(null);
newUserB = new JButton("New User");
newUserB.addActionListener(this);
newUserB.setBounds(40,280,100,30);
loginB = new JButton("Login");
loginB.addActionListener(this);
loginB.setBounds(180,280,100,30);
JLabel JLUsername = new JLabel("Username:");
JLUsername.setBounds(100,100,150,30);
JTFUsername = new JTextField();
JTFUsername.setToolTipText("Enter your username");
JTFUsername.setBounds(JLUsername.getBounds().x +70,JLUsername.getBounds().y,150,30);
JLabel JLPassword = new JLabel("Password:");
JLPassword.setBounds(100,150,150,30);
JPFPassword = new JPasswordField();
JPFPassword.setToolTipText("Enter your password");
JPFPassword.setBounds(JLPassword.getBounds().x+ 70, JLPassword.getBounds().y, 150, 30);
frame.add(loginB);
frame.add(newUserB);
frame.add(JLUsername);
frame.add(JTFUsername);
frame.add(JLPassword);
frame.add(JPFPassword);
frame.setVisible(true);
System.out.println("Login Page");
所以這裏我使用併成功寫入文件。在我的日誌文件中,我可以看到Application已成功啓動語句。
try{
FileWriter fw = new FileWriter(
"/Users/credant/Desktop/Programming/JILogs/AppLogs.txt", true);
BufferedWriter bw = new BufferedWriter(fw);
bw.write("--> Application has Launched successfully!");
bw.newLine();
bw.close();
}catch(Exception b)
{
JFrame Dframe = new JFrame();
JOptionPane.showMessageDialog(Dframe,
b.getMessage(),"App Crashed", JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == loginB)
{
try{
因此,這裏是哪裏出了問題,我做的確切samething作爲第一次寫入一個文件,但在檢查我的AppLogs.txt,我從來沒有看到聲明「驗證登錄憑證」,但在IDE控制檯我得到一個「更新的AppLogs.txt」,它的代碼是在文件寫入後出現的.....這是怎麼可能的,我唯一的猜測是文件寫入失敗,並沒有趕上它,所以就像一個沉默的錯誤拋出我猜...雖然我從來沒有聽說過這樣的事情。繼承人另一個循環漏洞,如果你要運行這個代碼,你會看到一個登錄頁面,只有輸入不正確的憑證纔會發生神祕錯誤,但是如果你輸入正確的憑證,日誌文件會得到更新,我們會移動在正常......
FileWriter fw = new FileWriter(
"/Users/credant/Desktop/Programming/JILogs/AppLogs.txt", true);
BufferedWriter bw = new BufferedWriter(fw);
bw.write("--> Verifying Login Credentials");
bw.newLine();
System.out.println("Updated AppLogs.txt");
boolean usernam = false;
boolean passwor = false;
Scanner scan = new Scanner(new File("/Users/credant/Desktop/Programming/JobInfo/AccountDatabase/Accounts.txt"));
while(scan.hasNextLine())
{
try{
String line = scan.nextLine();
if(line.isEmpty())
{
}
else
{
String checkUser[] = line.split(":");
if(checkUser[0].equals("Username"))
{
checkUser[1] = checkUser[1].substring(1);
if(checkUser[1].equals(JTFUsername.getText()))
{
bw.write("--> Username is correct");
bw.newLine();
usernam = true;
}
else
{
bw.write("--> Username is invalid, Displaying Incorrect message");
bw.newLine();
usernam = false;
}
}
else if(checkUser[0].equals("Password"))
{
checkUser[1] = checkUser[1].substring(1);
String password = new String(JPFPassword.getPassword());
if(checkUser[1].equals(password))
{
bw.write("--> Password is correct!");
bw.newLine();
passwor = true;
}
else
{
bw.write("--> Password is invalid, Displaying Incorrect message");
bw.newLine();
passwor = false;
}
}
}
}catch(Exception b)
{
JFrame Dframe = new JFrame();
JOptionPane.showMessageDialog(Dframe,
b.getMessage(),"App Crashed", JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
}
if(usernam == true)
{
if(passwor == true)
{
bw.write("--> Authorization completed, retrieving JobInfo Account page");
bw.newLine();
bw.write("--> Logged in as:"+ JTFUsername.getText());
bw.newLine();
bw.close();
frame.setVisible(false);
}
else
{
bw.write("--> Password is invalid, displaying invalid message.");
bw.newLine();
JLabel invalid = new JLabel("Invaild Credentials, Please try again.");
invalid.setBounds(100, 310 , 100, 30);
invalid.setForeground(Color.red);
frame.add(invalid);
}
}
else if(usernam == false)
{
bw.write("--> Username is invalid, displaying invalid message.");
bw.newLine();
JLabel invalid = new JLabel("Invaild Credentials, Please try again.");
invalid.setBounds(100, 310 , 100, 30);
invalid.setForeground(Color.red);
frame.add(invalid);
}
}catch(Exception b)
{
JFrame Dframe = new JFrame();
JOptionPane.showMessageDialog(Dframe,
b.getMessage(),"App Crashed", JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
}
else if(e.getSource() == newUserB)
{
try{
FileWriter fw = new FileWriter(
"/Users/credant/Desktop/Programming/JILogs/AppLogs.txt", true);
BufferedWriter bw = new BufferedWriter(fw);
bw.write("--> Setting up to add a new User");
bw.newLine();
bw.close();
frame.setVisible(true);
AccountCreation createAccount = new AccountCreation();
createAccount.createAccount();
}catch(Exception b)
{
JFrame Dframe = new JFrame();
JOptionPane.showMessageDialog(Dframe,
b.getMessage(),"App Crashed", JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
}
}
}
林不知道什麼是錯,但任何建議將是有益的,也是我知道的部分代碼是非常糟糕的編程,我將改造,使用線程,什麼不可以因爲這對某些條件有幫助,並且如果寫入文件的方式較短,請隨時提出建議。
哼但是flush()做什麼? – NOnfri
@NOnfri方法將字符或字節流中的字符從寫入緩衝區中刷新爲預期的目標。 – nafas
@NOnfri http://www.tutorialspoint.com/java/io/bufferedwriter_flush.htm – nafas