输出首先打印,第二个打印输出。字符串大小设置不正确

时间:2016-08-02 21:30:36

标签: java string random-access

我一直在编写这个程序,它应该为输入的人建立帐户,将它们的信息保存在一起作为一个“superString”字符串,因此可以从txt文件中编写和读取。我以为我把它全部放在了一起,但在测试了各种输入然后回读之后,似乎没有正确设置字符串长度。

如果我只想要帐号1,它会打印出帐号1 如果我添加更多帐户然后尝试仅打印帐户1,它将打印帐户1和2的一部分。

输出根据输入的大小而变化,即使我在其中放置具有严格大小的循环。

我一直在寻找同样的问题太长时间了,希望我只是忽略了一个简单的修复。任何人都可以帮我解决这个问题吗?

public class FirstTr {

    private static Scanner input = new Scanner(System.in);

    public static void main(String[] args) throws FileNotFoundException, IOException 
    {

        File loc = new File("C:\\Users\\Desktop\\Exc2.1.txt");
        RandomAccessFile store = new RandomAccessFile(loc, "rw");
        for(int i=0; i<20; i++)
        {
            String dummy = "12345678901234567890123456789012345678901234567890123456789012345678901";
            store.writeUTF(dummy);
        }


        String userChoice = GettingUserInput();
        System.out.println("The choice you entered: " +userChoice);


        while(true){
            if(userChoice.equals("new"))
            {
                String playerID = PlayerIDMethod();
                System.out.println("The playerID you entered: " +playerID);

                String playerName = PlayerNameMethod();
                System.out.println("The playerName you entered: " +playerName);

                String playerTeamName = PlayerTeamNameMethod();
                System.out.println("The playerTeamName you entered: " +playerTeamName);

                String playerSkillLevel = PlayerSkillLevelMethod();
                System.out.println("The playerSkillLevel you entered: " +playerSkillLevel);

                String todaysDate = TodaysDateMethod();
                System.out.println("The date you entered: " +todaysDate);

                String superString = "";
                superString = playerID + playerName+ playerTeamName + playerSkillLevel + todaysDate;
                //System.out.println("Combined string is: "+superString);
                int playerIDDigit = Integer.parseInt(playerID);
                store.seek((playerIDDigit-1)*73);
                store.writeUTF(superString);
                System.out.println("Length of string: " +superString.length());
                userChoice = GettingUserInput();

            }
            if(userChoice.equals("old"))
            {
                System.out.println("Please enter player ID: ");
                String desiredID = input.next();
                int recLocation;
                recLocation = Integer.parseInt(desiredID);
                store.seek((recLocation-1)*73);
                String printed = store.readUTF();
                System.out.println("String: "+printed);
                userChoice = GettingUserInput();
            }
            if(userChoice.equals("end"))
            {
                System.out.println("Program Closed.");
                store.close();
                System.exit(0);
            }

        }

    }



    public static String GettingUserInput()
    {
        System.out.println("Please type in a command: new, old, or end to exit");
        String userChoice = input.next();

        while(!userChoice.equals("New") && !userChoice.equals("new") && !userChoice.equals("Old") && !userChoice.equals("old") && !userChoice.equals("End") && !userChoice.equals("end"))
        {
            System.out.println("Looks like you didn't enter a correct choice.");
            System.out.println("Please type in a command: new, old or end");
            userChoice = input.next();
        }

        return userChoice;
    }


    public static String PlayerIDMethod()
    {
        String playerID = "";
        Boolean loop = true;
        while(loop)
        {
            try
            {
                System.out.println("Please input Player ID: ");
                playerID = input.next();
                int playerIDDigit = Integer.parseInt(playerID);

                if (playerID.length()> 5){
                    playerID.substring(0,5);
                }

                if (playerID.length()< 5){
                    StringBuilder paddedName = new StringBuilder(playerID);
                    while(paddedName.length()<5){
                        paddedName.append(" ");
                    }
                    playerID = paddedName.toString();
                }

                while(Pattern.matches("[a-zA-Z]+", playerID)|| playerID.startsWith("-")|| playerIDDigit>20 || playerIDDigit<0)
                {
                    System.out.println("Player ID cannot have characters, negatives, and must be within 1-20!");
                    System.out.println("Please input Player ID: ");
                    playerID = input.next();

                }

                loop = false;

            }
            catch(Exception e)
            {
                System.out.println("No way Hosay! Only Integers!");
            }


        }
        return playerID;
    }



    public static String PlayerNameMethod ()
    {
        String playerName = "";
        try{
            System.out.println("Enter Player's Name: ");
            playerName = input.next();
            while(Pattern.matches("^\\d+", playerName))
            {
                System.out.println("No cool names include numbers! Try again.");
                System.out.println("Enter Player's Name: ");
                playerName = input.next();
            }
            if (playerName.length()> 26){
                playerName.substring(0,26);
            }

            if (playerName.length()< 26){
                StringBuilder paddedName = new StringBuilder(playerName);
                while(paddedName.length()<26){
                    paddedName.append(" ");
                }
                playerName = paddedName.toString();
            }


        }
        catch(Exception e){
            System.out.println("ERROR PLEASE TRY AGAIN");
        }
        return playerName;

    }



    public static String PlayerTeamNameMethod ()
    {
        String playerTeamName = "";
        try
        {
            System.out.println("Please enter Team name: ");
            playerTeamName = input.next();
            if (playerTeamName.length()> 26){
                playerTeamName.substring(0,26);
                System.out.print("The Player Name is" + playerTeamName);
            }

            if (playerTeamName.length()< 26){
                StringBuilder paddedName = new StringBuilder(playerTeamName);
                while(paddedName.length()<26){
                    paddedName.append(" ");
                }
                playerTeamName = paddedName.toString();
            }
        }
        catch(Exception e)
        {
            System.out.println("ERROR PLEASE TRY AGAIN");
        }
        return playerTeamName;

    }

    public static String PlayerSkillLevelMethod ()
    {
        String playerSkillLevel = "";
        Boolean loop = true;
        while(loop)
        {
            try
            {
                System.out.println("Please enter player skill level between 0 and 99: ");
                playerSkillLevel = input.next();
                while(Pattern.matches("[a-zA-Z]+", playerSkillLevel))
                {
                    System.out.println("Player skill level must be an integer!");
                    System.out.println("Please enter player skill level between 0 and 99: ");
                    playerSkillLevel = input.next();
                }
                loop = false;
            }
            catch(Exception e){
                System.out.println("ERROR PLEASE TRY AGAIN ");
            }
        }
        return playerSkillLevel;


    }

    public static String TodaysDateMethod (){
        String todaysDate = "";
        try{
            System.out.println("Please enter todays date: ");
            todaysDate = input.next();
            if (todaysDate.length()> 9)
            {
                todaysDate = todaysDate.substring(1,9);
            }

            if (todaysDate.length()< 9)
            {
                StringBuilder paddedName = new StringBuilder(todaysDate);
                while(paddedName.length()<26){
                    paddedName = paddedName.append(" ");
                }
                todaysDate = paddedName.toString();
            }
        }

        catch(Exception e){
            System.out.println("ERROR ");

        }
        return todaysDate;
    }

    //CONVERT TO STRING
    public static String RecordtoFile (RandomAccessFile store){
        return null;
    }

    //WRITE INTO FILE AT RECORD LOCATION INDICATED BY ID
    public static String WriteToFile (RandomAccessFile store){
        return null;
    }
}

2 个答案:

答案 0 :(得分:1)

我看到它解决的方法是创建一个带有构造函数的Person类,该构造函数将int idString name作为参数。 此类将采用private void recordToFile方法,您只能在 id 空间 name 格式中每行记录一个人。

另外,在FirstTr课程中,您将拥有一个private Person retrieveFromFile(int id)来验证文件中的每一行,并返回Person给定的id或{{ 1}}如果找不到人。该方法在参数中也可以获得null,但它确实是您的通话。

使用String []的方式也很有用,但你应该决定。

答案 1 :(得分:0)

我发现导致问题的原因。解析时,构成字符串的五个值中的三个已设置为长度为26,因此这已经创建了一个长度为78的字符串。所需的大小为71,当添加其他两个值时,它可以达到80或81.更改解析或添加的字符串以更改超级字符串的长度,不再遇到任何问题。谢谢你的帮助