【问题标题】:Java - having trouble with capturing data from text fileJava - 从文本文件中捕获数据时遇到问题
【发布时间】:2016-08-24 14:41:57
【问题描述】:

嗯.. 我尽力解释,但是我可以.. 好吧.. 我有这个 text/dat 文件,里面有数据。当我运行代码时,此错误消息“错误!用户名或密码不正确!”尽管用户名和密码已经在文件中。下面是代码、输出和文件。

这是 GameModule.java 的代码:

public void run()
    {
        System.out.println("FISHING PAIR GAME LOGIN");
        Utility.printLine(50);
    System.out.println();

        ArrayList<Player> players = new ArrayList<>();
        Scanner myScanner=null;
        try {
            myScanner = new Scanner (new File("players.dat"));
            while (myScanner.hasNextLine())
            {

                String data = myScanner.nextLine();

                String [] dataSplit = data.split("\\|");
                Player existingPlayer = new Player (dataSplit[0], dataSplit[1],dataSplit[2], Integer.parseInt(dataSplit[3]));
                players.add(existingPlayer);
            }


        }   catch(FileNotFoundException ex) {

            System.out.println("Error! File - players.dat not found!");
        }

        myScanner.close();
        //End of read file into array

        Scanner input = new Scanner (System.in);
        boolean exist = false;

        System.out.print("Enter Login name > ");
        String userName = input.nextLine();

        System.out.print("Enter Password > ");
        String userPW = input.nextLine();
        System.out.println();
        for (int i=0; i < players.size(); i++) {
            //Verifies user login name and password
            if (players.get(i).getLoginName().equalsIgnoreCase(userName)&&(players.get(i).checkPassword(userPW)))
            {
                char continueGame='y';
                //Loop for allowing player to continue the game
                while(continueGame=='y'||continueGame=='Y') {
                    //Ensure player have sufficient chips to play the game
                    if (players.get(i).getScores()>0) {
                        //Game function which returns the chips of the player after the game
                        players.get(i).setScores(startGame(players.get(i).getLoginName(), players.get(i).getScores()));
                        System.out.print("Next Game? (Y/N) > ");
                        continueGame = input.next().charAt(0);
                    } else {
                        continueGame = 'n';
                        System.out.println("Sorry you do not have enough chips.");
                    }
                }
                System.out.println("Thank you for playing, see you again!");
                exist = true;
            }       
         }
        //If user id or password does not match or incorrect
         if (exist == false) {
            System.out.println("Error! incorrect username or password!");
         }

       //Write array into file
         try {
            PrintWriter fileOut = new PrintWriter("players.dat");
            //BufferedWriter fileOut = new BufferedWriter(new FileWriter("players.dat", false));
            for (int i = 0; i < players.size(); i++) {
             fileOut.println(players.get(i).getLoginName() + "|" + players.get(i).getHashPass() + "|" + players.get(i).getDate() + "|" 
                                + players.get(i).getScores());
             //fileOut.printLn();
            }
             fileOut.close();
             //System.out.println("Data saved");

         } catch (IOException e) {
             System.out.println("Failed to open file");   
         }
    }

Player 是另一个 java 文件/类。 startGame() 是 GameModule 中的一个方法。

正如您所看到的代码,它首先检查 player.dat 是否存在。然后进入登录部分。在登录过程中,它会检查用户名和/或密码是否在文件中。

这是输出:

FISHING PAIR GAME LOGIN
--------------------------------------------------
Enter Login name> IcePeak
Enter Password> p1

Error! incorrect username or password!

在 player.dat 文件中--

冰峰|p1|-|10

蓝骑士|p2|-|10

黑色游侠|p3|-|10

淘金者|p4|-|10

“-”表示登录日期。由于球员是新人,所以没有日期。

好吧,您可以看到 IcePeak 和密码 p1 已经存储在该文件中,但我收到了该错误消息。我已经逐行重新阅读了所有代码,甚至重新输入了代码。我忘记了我尝试过的另一件事。我什至删除了该文件并使用相同的信息重新创建它。但我仍然收到相同的错误消息。我只是不知道也不明白出了什么问题:(

所以请帮帮我,谢谢:)

编辑 - 添加 Player.java

/**
 * CSCI213 Assignment 1
 * ------------------
 * File name: Player.java
 * Author: Kanak Priya Selvarani
 * UOW Student number: 4641619
 * Description: Player class. This class contains player's details which will be saved in players.dat file.
 */
//package assignment1_kanakpriyaselvarani;
package admin;
import admin.User;
import java.util.ArrayList;
//import User.java;

/**
 *
 * @author SONY
 */
public class Player extends User{
    private int scores;
    private String date;
    //private String loginName, hashedPassword;
    ArrayList<Card>cardsOnHand;

    public Player(String loginName, String hashPass, String date, int scores)
    {
        super(loginName,hashPass);
        //this.loginName = loginName;
        //this.hashedPassword = hashedPassword;
        this.scores = scores;
        this.date = date;
        cardsOnHand = new ArrayList<>();
    }

    public String getDate()
    {
        return date;
    }

    public int getScores()
    {
        return scores;
    }

    public void addScores(int scores)
    {
        this.scores+=scores;
    }

    public void deductScores(int scores)
    {
        this.scores-=scores;
    }

    public void setScores(int scores)
    {
        this.scores=scores;
    }

    public int  getNumOfCards()
    {
        return cardsOnHand.size();
    }

    public void addCard(Card card)
    {
        cardsOnHand.add(card);
    }

    public void showCards()
    {
        System.out.println(getLoginName());
        for(Card c:cardsOnHand)
        {
            System.out.print(c+ " ");
        }
        System.out.println("");
    }

    public void showCardsValue()
    {
        System.out.println("Value:"+getTotalCardsValue());
    }

    public int getTotalCardsValue()
    {
        int totalValue=0;

        for(Card c:cardsOnHand)
        {  
            totalValue+=c.getValue();
        }

        return totalValue;        
    }

    //Thinks of the action that a player can take, implements those action as methods...



    public static void main(String []args)
    {
        //testing of getTotalCardsValue()    
        Player p = new Player("tester","","",0);

        Card c1 = new Card("Heart","Ace",1);
        Card c2 = new Card("Heart","Queen",10);

        p.addCard(c1);
        p.addCard(c2);

        p.showCards();
        p.showCardsValue();

        Card c3 = new Card("Heart","3",3);
        p.addCard(c3);
        p.showCards();
        p.showCardsValue();


    }
}

第二次编辑 - User.java

/*
 * CSCI213 Assignment 1
 * -----------------
 * File name: User.java
 * Author: Kanak Priya Selvarani
 * UOW Student Number: 4641619
 * Description: User Class. This is for login name and password of admin and player.
 *
 */
//package assignment1_kanakpriyaselvarani;
//import Utility.java;
package admin;
abstract public class User {

    private String loginName;
    private String hashPass;
    private String date;
    private int scores;

    public User(String loginName,String hashPass)
    {
        this.loginName = loginName;
        this.hashPass = hashPass;
    }


    public String getLoginName()
    {
        return loginName;
    }

    public String getHashPass()
    {
        return hashPass;
    }

    public void setHashPass(String newHashPass)
    {
        this.hashPass = newHashPass;
    }

    public boolean checkPassword(String password)
    {
        boolean status = false;
        String hash = Utility.getHashPass(password);

        if(hashPass.equals(hash))
        {
            status = true;
        }

        return status;
    }

}

【问题讨论】:

  • 尝试将 players.get(i).getLoginName() 放入 System.out.println() 中,然后检查它打印的值是什么,我怀疑 players 是否为空或 loginNamepassword在播放器中设置不正确。
  • 学习使用调试器,逐行执行程序,并检查变量中的值。这将比写这个问题花费更少的时间,并且会为你节省很多天。
  • @hello 显示你的 Player 类
  • @RobertoDeLaParra 我在 Player.java 中添加了
  • @MitulSanghani 我会试试的

标签: java bufferedreader printwriter


【解决方案1】:

我发现了问题所在

在我的 player.dat 文件中,它应该是散列密码而不是普通密码。

由于我的文件链接在一起(多态性),并且所有文件共享 player.dat 文件。另外,这些文件有哈希密码的代码。

谢谢帮助我顺便说一句^^

【讨论】:

    【解决方案2】:

    我怀疑您的输入可能包含不可显示的字符。您使用的 String.equalsIgnoreCase() 应该可以工作,但是如果输入包含“空格或控制”字符,Java 将不会完全匹配它。首先尝试 trim() 它。您应该能够将用户名和密码打印到控制台中,并在其周围加上引号,以便仔细检查。

    我知道这不是答案,但我没有足够的声誉来添加 cmets :(

    【讨论】:

      猜你喜欢
      • 2015-05-23
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 2021-05-19
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多