Scanner vs. BufferedReader

前端 未结 12 1717
死守一世寂寞
死守一世寂寞 2020-11-22 02:17

As far I know, the two most common methods of reading character-based data from a file in Java is using Scanner or BufferedReader. I also know that

相关标签:
12条回答
  • 2020-11-22 02:56
    1. BufferedReader will probably give you better performance (because Scanner is based on InputStreamReader, look sources). ups, for reading from files it uses nio. When I tested nio performance against BufferedReader performance for big files nio shows a bit better performance.
    2. For reading from file try Apache Commons IO.
    0 讨论(0)
  • 2020-11-22 02:58

    Scanner is used for parsing tokens from the contents of the stream while BufferedReader just reads the stream and does not do any special parsing.

    In fact you can pass a BufferedReader to a scanner as the source of characters to parse.

    0 讨论(0)
  • 2020-11-22 02:59

    The Main Differences:

    1. Scanner

    • A simple text scanner which can parse primitive types and strings using regular expressions.
    • A Scanner breaks its input into tokens using a delimiter pattern, which by default matches whitespace. The resulting tokens may then be converted into values of different types using the various next methods.

    Example

     String input = "1 fish 2 fish red fish blue fish";
     Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
     System.out.println(s.nextInt());
     System.out.println(s.nextInt());
     System.out.println(s.next());
     System.out.println(s.next());
     s.close(); 
    

    prints the following output:

     1
     2
     red
     blue 
    

    The same output can be generated with this code, which uses a regular expression to parse all four tokens at once:

     String input = "1 fish 2 fish red fish blue fish";
    
     Scanner s = new Scanner(input);
     s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)");
     MatchResult result = s.match();
     for (int i=1; i<=result.groupCount(); i++)
         System.out.println(result.group(i));
     s.close(); `
    


    1. BufferedReader:

      • Reads text from a character-input stream, buffering characters so as to provide for the efficient reading of characters, arrays, and lines.

      • The buffer size may be specified, or the default size may be used. The default is large enough for most purposes.

    In general, each read request made of a Reader causes a corresponding read request to be made of the underlying character or byte stream. It is therefore advisable to wrap a BufferedReader around any Reader whose read() operations may be costly, such as FileReaders and InputStreamReaders. For example,

    BufferedReader in
       = new BufferedReader(new FileReader("foo.in"));
    

    will buffer the input from the specified file. Without buffering, each invocation of read() or readLine() could cause bytes to be read from the file, converted into characters, and then returned, which can be very inefficient. Programs that use DataInputStreams for textual input can be localized by replacing each DataInputStream with an appropriate BufferedReader.

    Source:Link

    0 讨论(0)
  • 2020-11-22 03:03
    1. BufferedReader has significantly larger buffer memory than Scanner. Use BufferedReader if you want to get long strings from a stream, and use Scanner if you want to parse specific type of token from a stream.

    2. Scanner can use tokenize using custom delimiter and parse the stream into primitive types of data, while BufferedReader can only read and store String.

    3. BufferedReader is synchronous while Scanner is not. Use BufferedReader if you're working with multiple threads.

    4. Scanner hides IOException while BufferedReader throws it immediately.

    0 讨论(0)
  • 2020-11-22 03:03

    I prefer Scanner because it doesn't throw checked exceptions and therefore it's usage results in a more streamlined code.

    0 讨论(0)
  • 2020-11-22 03:07

    See this link, following is quoted from there:

    A BufferedReader is a simple class meant to efficiently read from the underling stream. Generally, each read request made of a Reader like a FileReader causes a corresponding read request to be made to underlying stream. Each invocation of read() or readLine() could cause bytes to be read from the file, converted into characters, and then returned, which can be very inefficient. Efficiency is improved appreciably if a Reader is warped in a BufferedReader.

    BufferedReader is synchronized, so read operations on a BufferedReader can safely be done from multiple threads.

    A scanner on the other hand has a lot more cheese built into it; it can do all that a BufferedReader can do and at the same level of efficiency as well. However, in addition a Scanner can parse the underlying stream for primitive types and strings using regular expressions. It can also tokenize the underlying stream with the delimiter of your choice. It can also do forward scanning of the underlying stream disregarding the delimiter!

    A scanner however is not thread safe, it has to be externally synchronized.

    The choice of using a BufferedReader or a Scanner depends on the code you are writing, if you are writing a simple log reader Buffered reader is adequate. However if you are writing an XML parser Scanner is the more natural choice.

    Even while reading the input, if want to accept user input line by line and say just add it to a file, a BufferedReader is good enough. On the other hand if you want to accept user input as a command with multiple options, and then intend to perform different operations based on the command and options specified, a Scanner will suit better.

    0 讨论(0)
提交回复
热议问题