一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java中BufferedReader與Scanner讀入的區別詳解

Java中BufferedReader與Scanner讀入的區別詳解

2022-03-07 00:53知行流浪 Java教程

這篇文章主要介紹了Java中BufferedReader與Scanner讀入的區別詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

java.util.Scanner類是一個簡單的文本掃描類,它可以解析基本數據類型和字符串。它本質上是使用正則表達式去讀取不同的數據類型。

Java.io.BufferedReader類為了能夠高效的讀取字符序列,從字符輸入流和字符緩沖區讀取文本。

在Java中,我們都知道Java的標準輸入串是System.in。但是我們卻很少在Java中看到誰使用它,這是因為我們平時輸入的都是一個字符串或者是一個數字等等。而System.in提供的read方法是通過字節來讀取數據的,所以對我們來說不方便處理!

Scanner

在Java SE6提供了一個非常方便的輸入數據的類Scanner,位于java.util包中,這個Scanner的具體用法為Scanner in = new Scanner(System.in)。

通過new創建一個Scanner對象,Scanner需要傳入一個System.in作為參數,這個我們可以看作是Scanner通過其內部機制將System.in包裝起來而實現數據的讀取工作的。

Scanner對象通過一系列的in.nextXxx();方法來讀取相應的基本類型的數據,通過in.hasNextXxx();方法來判斷是否還有下一個數據。

然而,Scanner讀取數據是按空格符(這其中包括空格鍵,Tab鍵,Enter鍵)來分割數據的。

只要遇到其中之一,Scanner的方法就會返回下一個輸入(當然nextLine()方法的結束符為換行符,它會返回換行符之前的數據),這也就是我們會面臨的另一個問題,當我們的輸入數據中有空格時,我們就不會得到我們想要的數據,這樣我們就要考慮到BufferReader來讀取數據!

BufferReader

BufferReader位于java.io包中,使用BufferReader就相對來說沒有那么多方法來讓你選擇!讀取數據比較固定,這樣格式也就相對來說比較單一,只要記住就這一讀取數據的方法。

?
1
BufferedReader br = new BufferedReader (newInputStreamReader(System.in));

這個BufferReader對象通過readLine();方法來讀取數據,readLine()是按Enter回車來讀取一行數據的,只要在回車鍵之前的都會被readLine()方法返回。

readLine()方法返回的是字符串,因此要使用BufferReader輸入一些字符之外的類型的數據,就要相對比較麻煩,需要通過一些XXXX.parseXxx();來轉換相應的數據類型,(例如:int類型的用Integer.parseInt(需要轉換的字符串))。

雖然麻煩一些,但通過BufferReader讀入的效率要比Scanner高一倍,這個差距可想而知,而且讀取的數據越多,效果就越明顯。

需要注意的是使用BufferedReader對象的readLine()方法必須處理java.io.IOException異常。

兩者的對比

1、Scanner提供了一系列nextXxx()方法,當我們確定輸入的數據類型時,使用Scanner更加方便。也正是因為這個BufferedReader相對于Scanner來說要快一點,因為Scanner對輸入數據進行類解析,而BufferedReader只是簡單地讀取字符序列。

2、Scanner和BufferedReader都設置了緩沖區,Scanner有很少的緩沖區(1KB字符緩沖)相對于BufferedReader(8KB字節緩沖),但是這是綽綽有余的。

3、BufferedReader是支持同步的,而Scanner不支持。如果我們處理多線程程序,BufferedReader應當使用。

4、Scanner輸入的一個問題:在Scanner類中如果我們在任何7個nextXXX()方法之后調用nextLine()方法,這nextLine()方法不能夠從控制臺讀取任何內容,并且,這游標不會進入控制臺,它將跳過這一步。nextXXX()方法包括nextInt(),nextFloat(), nextByte(),nextShort(),nextDouble(),nextLong(),next()。

在BufferReader類中就沒有那種問題。這種問題僅僅出現在Scanner類中,由于nextXXX()方法忽略換行符,但是nextLine()并不忽略它。如果我們在nextXXX()方法和nextLine()方法之間使用超過一個以上的nextLine()方法,這個問題將不會出現了;因為nextLine()把換行符消耗了。

程序示例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package com.zxt.base;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
 
public classSystemInTest {
    private static Scanner sc;
    public static void main(String[] args) {
        // 使用Scanner輸入
        sc = new Scanner(System.in);
        int num1 = sc.nextInt();
        int num2 = sc.nextInt();
        System.out.println("num1 + num2 = "+ (num1+ num2));
 
        // 使用BufferReader輸入
        InputStreamReaderisr = newInputStreamReader(System.in);
        BufferedReaderbr = new BufferedReader(isr);
        try {
            int num3 = Integer.parseInt(br.readLine());
            int num4 = Integer.parseInt(br.readLine());
            System.out.println("num3 + num4 = "+ (num3+ num4));
 
        }catch(NumberFormatException | IOException e) {
            e.printStackTrace();
        }      
       
        // 使用Scanner輸入會遇到的問題
        System.out.println();
        System.out.print("Enter an Integer:");
        int intValue = sc.nextInt();
        System.out.print("Enter a String:");
        StringstrValue = sc.nextLine();
        System.out.printf("You have entered intValue is " + intValue+ " and strValue is " + strValue);
       
        // 問題原因:由于nextXXX()方法忽略換行符,但是nextLine()并不忽略它。所以如果我們在nextXXX()方法后面使用nextLine()將會出現問題
        // 解決方案是:在使用nextXXX()方法后,在使用nextLine()讀取下一行數據前,多使用一個nextLine()用來消耗換行符
        // int intValue = sc.nextInt();
        // sc.nextLine();
        // String strValue = sc.nextLine();
       
        // 或者使用BufferReader不會出現該問題
        System.out.println();
        try {
            System.out.print("Enter an Integer:");
            int intValue1 = Integer.parseInt(br.readLine());
            System.out.print("Enter a String:");
            StringstrValue1 = br.readLine();
            System.out.printf("You have entered intValue1 is " + intValue1+ " and strValue1 is " + strValue1);
           
        }catch(NumberFormatException | IOException e) {
            e.printStackTrace();
        }
    }
}

Java中BufferedReader與Scanner讀入的區別詳解

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/zengxiantao1994/article/details/78056243

延伸 · 閱讀

精彩推薦
  • Java教程詳解shiro緩存機制

    詳解shiro緩存機制

    Shiro提供了類似于Spring的Cache抽象,即Shiro本身不實現Cache,但是對Cache進行了又抽象,方便更換不同的底層Cache實現。下面通過實例代碼給大家分享shiro緩存...

    動力節點9032021-01-06
  • Java教程Mybatis查不到數據查詢返回Null問題

    Mybatis查不到數據查詢返回Null問題

    mybatis突然查不到數據,查詢返回的都是Null,但是 select count(*) from xxx查詢數量,返回卻是正常的。好多朋友遇到這樣的問題不知所措,下面小編通過本教程...

    digdeep4992020-06-07
  • Java教程SpringData @Query和@Modifying注解原理解析

    SpringData @Query和@Modifying注解原理解析

    這篇文章主要介紹了SpringData @Query和@Modifying注解原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    IT-執念5372020-08-27
  • Java教程Java日常練習題,每天進步一點點(40)

    Java日常練習題,每天進步一點點(40)

    下面小編就為大家帶來一篇Java基礎的幾道練習題(分享)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以...

    牛哄哄的柯南12322021-10-22
  • Java教程Java編程簡單應用

    Java編程簡單應用

    本文主要介紹了三個簡單Java小程序———1、HelloWorld(HelloWorld的來源);2、輸出個人信息3、輸出特殊圖案。具有很好的參考價值,下面跟著小編一起來看下...

    瘋狂的牛5472020-08-12
  • Java教程Spring Boot參數校驗及分組校驗的使用教程

    Spring Boot參數校驗及分組校驗的使用教程

    在日常的開發中,參數校驗是非常重要的一個環節,嚴格參數校驗會減少很多出bug的概率,增加接口的安全性,下面這篇文章主要給大家介紹了關于Spring Boot參數...

    江巖9842021-11-12
  • Java教程Spring工廠方法創建(實例化)bean實例代碼

    Spring工廠方法創建(實例化)bean實例代碼

    這篇文章主要介紹了Spring工廠方法創建bean實例代碼,具有一定借鑒價值,需要的朋友可以參考下...

    duanxz9992021-03-17
  • Java教程Java中關于線程安全的三種解決方式

    Java中關于線程安全的三種解決方式

    這篇文章主要介紹了Java中關于線程安全的三種解決方式,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考...

    威斯布魯克.猩猩10702021-12-30
主站蜘蛛池模板: 国产成人啪精品视频站午夜 | 青草草在线观看 | 国产一区在线 | 精品一区二区三区免费视频 | 完整秽淫刺激长篇小说 | 天堂网在线.www天堂在线视频 | 91在线精品老司机免费播放 | 男人肌肌捅女人 | 日韩日日操| 777奇米影视一区二区三区 | 午夜影视在线观看 | 亚洲国产综合久久精品 | 好爽好紧小雪别夹小说 | 日韩成片 | 美国videos | 日韩不卡一区二区三区 | 亚洲美女啪啪 | 日韩成片 | 别停好爽好深好大好舒服视频 | www.毛片在线观看 | 日韩乱淫 | 欧美成人免费观看久久 | 日本哺乳期网站xxxx | 日本中文字幕一区二区高清在线 | 深夜在线看| 国产99精品免费视频看6 | 成人涩涩屋福利视频 | 九九九九视频 | 九九热在线视频 | 好大好热 | 三级伦理在线播放 | 国产亚洲精品激情一区二区三区 | 高清在线免费 | 亚洲AVAV天堂AV在线网爱情 | 息与子中文字幕完整在线 | 无限资源在线观看高清 | 免费视频左左视频 | 日韩美一区二区三区 | 国产精品久久久久a影院 | 男人女人插 | 精品夜夜澡人妻无码AV蜜桃 |