2015-09-11 67 views
0

因此,我只是在練習我的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); 
     } 
     } 
    } 

} 

林不知道什麼是錯,但任何建議將是有益的,也是我知道的部分代碼是非常糟糕的編程,我將改造,使用線程,什麼不可以因爲這對某些條件有幫助,並且如果寫入文件的方式較短,請隨時提出建議。

回答

0

你需要,只要你寫一個文件使用flush()方法:

例如改變:

BufferedWriter bw = new BufferedWriter(fw); 
bw.write("--> Application has Launched successfully!"); 
bw.newLine(); 
bw.close(); 

到:

BufferedWriter bw = new BufferedWriter(fw); 
bw.write("--> Application has Launched successfully!"); 
bw.newLine(); 
bw.flush(); //add this line 
bw.close(); 

最好的做法是flush只是你之前closebuffer

但是,如果您突然要求關閉應用程序,那麼在編寫之後您可能只需要flush

+0

哼但是flush()做什麼? – NOnfri

+0

@NOnfri方法將字符或字節流中的字符從寫入緩衝區中刷新爲預期的目標。 – nafas

+0

@NOnfri http://www.tutorialspoint.com/java/io/bufferedwriter_flush.htm – nafas

相關問題