BufferedReader.readLine () Возвращает ноль в начале, а не в конце файла - PullRequest
0 голосов
/ 23 октября 2011

Я создаю тест на истину / ложь для курса Java, в котором в качестве битовых наборов хранятся ключ ответа и соответствующий массив ответов каждого пользователя. Эти битовые наборы затем сериализуются в постоянные последовательные двоичные файлы, чтобы позднее их можно было оценить другим приложением.

Все отлично работает, за исключением странного исключения из моего первого вызова request.readLine(), который является моим system.in inputtreamreader, который получает ответ пользователя. По какой-то причине он устанавливает нулевой первый ответ независимо от того, что было введено, как если бы он нажал EOF.

CreateTest.java (читает / отображает вопросы из текстового файла, собирает ответы пользователей, сохраняет их в .bin-файле)

public class CreateTest
{
private static BufferedReader request;
private static BufferedReader response;
private static String answers, userName;
private static ObjectOutputStream result;

public static void main(String[] args)
{
    response = new BufferedReader(new InputStreamReader(System.in));
    try
    {
        request = new BufferedReader(new FileReader("test.txt"));
    }
    catch(FileNotFoundException fnfe)
    {
        System.out.println("Test.txt was not found. Please fix your crappy file system.");
        System.exit(1);
    }

    System.out.println("Welcome to THE TEST\n\n" +
                        "Please respond with only \"t\" for true or \"f\" for false.\n" +
                        "This application is case-insensitive.\n" +
                        "DON'T GET EATEN BY THE GRUE!");


    System.out.println("\nPlease enter your name: ");
    try
    {
        userName = response.readLine().replaceAll("\\s", "");
        System.out.println("\n\n");
        result = new ObjectOutputStream(new FileOutputStream(userName + "TestAnswers.bin"));
    }
    catch(IOException e1) { e1.printStackTrace(); }

    try {
            for(int i=0; i<24; i++)
            {
                    System.out.println(request.readLine());
                    recordResponse();   
            }
        System.out.println("Thank you for attempting THE TEST. You probably failed.");
        result.writeObject(new BitMap(answers));
        close();

        } catch (IOException e) { e.printStackTrace(); }
}


public static void recordResponse() throws IOException
{
    String currentAnswer = response.readLine();
    //diagnostic
    System.out.println("Answer: " + answers);
    if(currentAnswer.equals("t")||
       currentAnswer.equals("T")||
       currentAnswer.equals("f")||
       currentAnswer.equals("F"))
    { answers += currentAnswer + " -- "; }
    else 
    {
        System.out.println("What, you can't read or somethin'?. Enter(case-insenstive) T or F only pal." +
                            "Try it again.");
        close();
        System.exit(1);
    }
}

public static void close() throws IOException
{
    request.close();
    response.close();
}

Соответствующий конструктор из BitMap.java (анализирует переданные аргументы в BitSets, предоставляет побитовые операции)

public BitMap(String s) throws IndexOutOfBoundsException,ArithmeticException
{
    try
    {
        if(s.length() > 25) { throw new IndexOutOfBoundsException(); }
        StringTokenizer answers = new StringTokenizer(s);
        for(int i=0; i<bitString.size(); i++)
        {
            String currentToken = answers.nextToken();
            if(currentToken.equals("t") || currentToken.equals("T")) { bitString.set(i); }
            else if(currentToken.equals("f") || currentToken.equals("F")) { bitString.clear(i); }
        }
    }
    catch(IndexOutOfBoundsException ioob){System.out.println("Sorry bub, too many answers.");}
}

Я извиняюсь за массу кода, но думаю, что больше информации лучше, чем недостаточно.

1 Ответ

1 голос
/ 23 октября 2011

Вы не инициализировали answers, поэтому он будет начинаться как nullrecordResponse вы печатаете answers перед обновлением, поэтому после ввода первого ответа вы печатаете null, а затем у вас есть "nullt/f -- t/f ...".

Итак, вы хотите

private static String answers = "", userName;

и диагностика, чтобы быть актуальной, скорее всего, должна идти после обновления:

if(currentAnswer.equals("t")||
   currentAnswer.equals("T")||
   currentAnswer.equals("f")||
   currentAnswer.equals("F"))
{
  answers += currentAnswer + " -- ";
  System.out.println("Answer: " + answers);
}
...