Сканер или InputStreamReader?

Какие преимущества у InputStreamReader по сравнению с Scanner классом?

Сканер мне кажется лучше по всем параметрам.

Почему я должен использовать throws IOException с InputStreamReader?

Например:-

1)

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

2)

Scanner sc=new Scanner(System.in);

Что 1) можно и 2) нельзя?


person Dasyud    schedule 27.10.2018    source источник
comment
docs.oracle.com/javase/tutorial/essential/exceptions/index. html   -  person JB Nizet    schedule 27.10.2018
comment
Халид Шах Я наткнулся на этот ответ, но у меня базовый уровень, и я не получил там то, что искал.   -  person Dasyud    schedule 27.10.2018


Ответы (1)


При использовании Buffered reader нам нужно импортировать пакет java.io, поэтому нам нужно обрабатывать исключения либо с помощью try and catch, либо с помощью throws Exception. Существует один недостаток использования класса Scanner, когда мы используем nextLine после nextInt: он не считывает значения, и вывод отличается от ожидаемого вывода.

// пример сканера

import java.util.Scanner; 

public class c 

{

    public static void main(String args[]) 

    {

        Scanner scn = new Scanner(System.in); 

        System.out.println("Enter an integer"); 

        int a = scn.nextInt(); 

        System.out.println("Enter a String"); 

        String b = scn.nextLine(); 

        System.out.printf("You have entered:- "+ a + " " + "and name as " + b);

    } 


}

Ввод: 2,rajat

Ожидаемый результат: You have entered:-2 and name as rajat

Фактический результат: You have entered:-2 and name as

Он не принимает rajat в строке b, тогда как с классом BufferReader такой проблемы нет.

//пример буферизованного чтения

import java.io.*; 

class c

{

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

    { 

        BufferedReader br = new BufferedReader(new

        InputStreamReader(System.in)); 

        System.out.println("Enter an integer"); 

        int a = Integer.parseInt(br.readLine()); 

        System.out.println("Enter a String"); 

        String b = br.readLine(); 

        System.out.printf("You have entered:- " + a + " and name as " + b); 

    }

}

Введите 2,rajat

Ожидаемый результат: You have entered:-2 and name as rajat

Фактический результат: You have entered:-2 and name as rajat

person Rajat Agrawal    schedule 27.10.2018
comment
Почему эта ошибка возникает с Scanner? - person Dasyud; 27.10.2018
comment
Я думаю, это потому, что строка сломана или уже используется из-за целого числа? Я добавил scn.nextLine(), и теперь он работает нормально. - person Dasyud; 27.10.2018
comment
Хорошо, я разобрался с проблемой. Есть ли другие отличия? - person Dasyud; 27.10.2018
comment
Вы сравниваете яблоки или апельсины @AdityaSoni. InputStreamReader просто читает char из InputStream. Scanner tokenizese — если вы, например, пишете синтаксический анализатор XML, вам не нужна токенизация, вам нужны только данные. Ответ, который я связал, содержит некоторые подробности обо всех различных методах и о том, для чего их можно использовать. Как правило, Scanner намного медленнее из-за токенизации, которую он выполняет, поэтому его следует избегать, если он вам не нужен. - person Boris the Spider; 27.10.2018