2016-10-05 5 views
2

Я пытаюсь взять некоторые данные пользователя и обработать их в своей программе. Для этого используется класс Scanner, как показано ниже.Прочитайте большой ввод через сканер

Scanner scan = new Scanner(System.in); 
System.out.print("Input : "); 
String input = scan.nextLine(); 

// Process the Data 

scan.close(); 

Программа отлично работает с небольшим количеством данных. Но если длина входной строки огромна (~ 100 тыс. Символов), сканер перестает отвечать на запросы и не может читать какие-либо данные.

Есть ли другой способ или обходной путь для решения этой проблемы?

Примечание: Это не возможный способ хранения данных в файле и чтения оттуда. Было бы неплохо прочитать фрагменты данных из файла. Но, к сожалению, такой реализации в моем приложении нет.

EDIT: Как уже упоминалось ранее, мне нужно читать данные непосредственно от пользователя (а не из файла). Во всяком случае, уже пытался использовать BufferReader. Но, похоже, не может читать некоторые данные около 100 тыс. Символов.

Вот такой код.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 

System.out.print("Input : "); 

String input = br.readLine(); 

// Remaining Code 
+0

использовать потоки для чтения больших данных –

+0

'BufferedReader br = new BufferedReader (новый InputStreamReader (System.in));' –

+0

Пробовал использовать BufferedReader()? – FallAndLearn

ответ

0

Ну, это поведение может быть нормальным, вам нужно подождать немного, прежде чем код сканера что-нибудь сделает. Это большой вклад, и я предполагаю, что ОС должна помещать его где-то, поэтому есть определенное количество времени между моментом нажатия клавиши ввода и моментом, когда JVM может ее прочитать.

Вы должны сравнить его, чтобы узнать, сколько времени чтения изменяется в зависимости от вашего ввода.

Я сделал код, который считывает символ на символ из ввода. Это не является хорошим решением, поскольку это, конечно, медленнее (и грязнее), чем при использовании nextLine(), но она покажет, как быстро это буферизация и чтения на компьютере:

public static void main(String[] args) { 
    Scanner scan = new Scanner(System.in); 
    Log.d("Input : "); 

    StringBuilder test = new StringBuilder(); 

    String input = ""; 
    long measure = 0; 
    while(input != null){ 
     input = scan.findInLine("."); // Should consume input one char per one char. 

     measure++; 
     if(input != null) 
      test.append(input.charAt(0)); 

     if(measure == 1 || measure % 1000 == 0) // displays the reading time of first reads and the next thousand ones 
      Log.d("Reading at:"+measure); 

    } 
    Log.d("End"); 
    scan.close(); 

    Log.d("size: "+test.toString().length()); 
    } 
} 

(примечание: вы можете заменить Log.d(yourString) по System.out.println(new Date() +":" +yourString))

Протестируйте это на своем компьютере и постепенно увеличивайте вход. Я не уверен, что ответ линейный. Он хорошо работает с 50000 символом, но на самом деле он довольно длинный с 100 000 (все же, всего за несколько минут до того, как я могу прочитать первый персонаж).

Редакция:

Редактирование: время между чтением также увеличивается с размером ввода ... требуется 1000 секунд для чтения 1000 символов с вводом 100 000 символов (и несколькими секундами с 50 000). При таком раскладе потребуется больше 2 часов, чтобы прочитать все.

Я не уверен, что зацикливание на System.in.read(); может иметь лучшие результаты (я не знаю, какой символ конца строки, однако ... \EOF может быть?), Но вы все равно можете попробовать это тоже. Опять же, я не думаю, что это хорошее решение, но, читая комментарий, это все, что у вас осталось.

Смежные вопросы