BufferedReader.nextLine () не будет переходить к следующей строке, поэтому я застрял в цикле - PullRequest
2 голосов
/ 16 февраля 2012

Я пытаюсь повторно использовать метод ввода для Scanner(System.in) и BufferedReader(FileReader).Когда пользователь вводит «readfile» в качестве команды, программа добавляет первого человека из файла (т.е. первой строки из файла) в список, но BufferedReader застревает в той же строке и поэтому застревает вбесконечный цикл.
Метод Scanner от ввода с клавиатуры работает как шарм.

    class Menu {
        public static final int ARRAYINDEXFOREMAIL = 3;
        private static final String NEWPERSON = "newperson";
        private static final String FROMFILE = "readfile";
        public static final String READFILE = "saved.txt";
        private Scanner keyboardInput = new Scanner( System.in );
        private String name;
        private String tlf;
        private String[] email;
        private String [] stringTmp;
        private String in;
        private boolean readFromFile = false;

        Menu( boolean fileRead ) {
            if( fileRead ) {
                readFromFile = true;
            }
            else {
                readFromFile = false;
            }
        }

        void run() {
            while(true) {
                System.out.print("\n" + "ordre> ");
                if ( !readFromFile ) {
                    in = keyboardInput.nextLine();
                }
                else {
                    try {
                        BufferedReader fileOut = new BufferedReader(
                                new FileReader( READFILE ) );
                        if( ( in = fileOut.readLine() ) == null ) {
                            readFromFile = false;
                            fileOut.close();
                            break;
                        }
                        else {
                            System.out.println("in stringTmp is: " + in);   // For debugging purposes
                        }
                    }
                    catch (FileNotFoundException filenotfoundexception) {
                        System.out.println("Cannot find file: " + READFILE + " !");
                    }
                    catch (IOException ioexception) {
                        ioexception.printStackTrace();
                    }
                }
                stringTmp = in.split("\\s+");

                if( stringTmp[0].equalsIgnoreCase(NEWPERSON) ) {
                    if( stringTmp.length <= 1 ) {
                        System.out.println("ERROR! Enter one or more parameters..");
                        continue;
                    }
                    else {
                        name = stringTmp[1];
                        tlf = stringTmp[2];
                        if( stringTmp.length > ARRAYINDEXFOREMAIL ) {
                            email = new String[stringTmp.length - ARRAYINDEXFOREMAIL];

                            for( int i = ARRAYINDEXFOREMAIL, j = i - ARRAYINDEXFOREMAIL ; i < stringTmp.length; i++, j++ ) {
                                email[j] = stringTmp[i];
                            }
                        }
                        else {
                            email = new String[0];
                        }
                        mainlist.addPerson( name, tlf, email );
                    }
                }

                else if ( stringTmp[0].equalsIgnoreCase(FROMFILE) ) {
                    Meny m = new Menu( true );
                    m.run();
                }
            }
        }
    }

1 Ответ

7 голосов
/ 16 февраля 2012

Обратите внимание, что в самом цикле вы устанавливаете

BufferedReader fileOut = new BufferedReader(new FileReader( READFILE ) );

Это приведет к созданию нового BufferedReader!
В следующей итерации цикла - вы повторите эту строку, в результате сбросите fileOut - и при вызове fileOut.readLine() - она ​​снова прочитает первую строку.

Вы должны инициализировать fileOut перед циклом, а не в нем, чтобы решить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...