最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?IO及BufferedReader.readline()出現(xiàn)的Bug

 更新時(shí)間:2021年12月09日 12:00:27   作者:Liu_Shihao  
這篇文章主要介紹了Java?IO及BufferedReader.readline()出現(xiàn)的Bug,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Java IO及BufferedReader.readline()的Bug

IO流

在這里插入圖片描述

:流是一組有序的,有起點(diǎn)和終點(diǎn)的字節(jié)集合,是對(duì)計(jì)算機(jī)中數(shù)據(jù)傳輸?shù)目偡Q。即數(shù)據(jù)在兩個(gè)設(shè)備間的傳輸稱為流,流的本質(zhì)是數(shù)據(jù)傳輸。

BufferedReader.readline()方法Bug

錯(cuò)誤代碼:

		File testTxt = new File("/Users/LiuShihao/IdeaProjects/netty_demo/src/main/resources/test.txt");
		File file_copy3 = new File("/Users/LiuShihao/IdeaProjects/netty_demo/src/main/resources/test_copy3.txt");
        BufferedReader bufferedReader = new BufferedReader(new FileReader(testTxt));
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file_copy3));
        //readLine() 每次讀取一行
        while (bufferedReader.readLine() != null){
            System.out.println(bufferedReader.readLine());
            bufferedWriter.write(bufferedReader.readLine());
        }
        bufferedWriter.close();
        bufferedReader.close();

原文件:

在這里插入圖片描述

結(jié)果:

在這里插入圖片描述

結(jié)果控制臺(tái)只打印了第二行,最后還報(bào)錯(cuò)了空指針異常

原因:

是代碼中每次調(diào)用readline()方法,就會(huì)向下讀取一行所以錯(cuò)誤代碼中表示的是while 判斷 的第一行不為null,打印的是第二行 ,然后寫(xiě)入的是第三行,在次while判斷的是第四行 有內(nèi)容,打印的是第五行 為null,寫(xiě)入的是第六行也為null,就導(dǎo)致了空指針異常。

修改后的代碼:

	 	String line;
        while ((line = bufferedReader.readLine()) != null){
            System.out.println(line);
            bufferedWriter.write(line);
        }

結(jié)果:

在這里插入圖片描述

注意:只用readline()復(fù)制后的但是和原文件是不同,沒(méi)有了換行符,如果需要可以在while循環(huán)體內(nèi)加上/r/n

在這里插入圖片描述

源碼

package com.lsh.io;
import java.io.*;
import java.time.Duration;
import java.time.Instant;
/**
 * @author :LiuShihao
 * @date :Created in 2021/3/3 11:09 上午
 * @desc :  只要是處理純文本數(shù)據(jù),就優(yōu)先考慮使用字符流。除此之外都使用字節(jié)流。
 *   
 */
public class FileIO {
    public static File testTxt = new File("/Users/LiuShihao/IdeaProjects/netty_demo/src/main/resources/test.txt");
    public static File catImg = new File("/Users/LiuShihao/IdeaProjects/netty_demo/src/main/resources/cat.jpg");
    public static void main(String[] args) throws Exception {
        Instant now = Instant.now();
        System.out.println("開(kāi)始復(fù)制:"+now);
//        copyFile();
//        copyByReaderAndWriter1();
        copyByReaderAndWriter2();
        Instant end = Instant.now();
        // Duration  期間Instant          Period  時(shí)期  LocalDateTime
        System.out.println("復(fù)制完成:"+end+",耗時(shí):"+ Duration.between(now,end));
    }
    /**
     * 使用FileinputStream、FileOutputStream   與原文件一樣
     * 將一個(gè)文件復(fù)制一份
     */
    public static void  copyFile() throws Exception {
//        File file = new File("/Users/LiuShihao/IdeaProjects/netty_demo/src/main/resources/test.txt");
        File file_copy1 = new File("/Users/LiuShihao/IdeaProjects/netty_demo/src/main/resources/test_copy.txt");
//        File file_copy1 = new File("/Users/LiuShihao/IdeaProjects/netty_demo/src/main/resources/cat_copy.jpg");
        FileInputStream fis = new FileInputStream(testTxt);
        FileOutputStream fos = new FileOutputStream(file_copy1);
        //byte[] bytes = new byte[1024];
        byte[] bytes = new byte[fis.available()];
        int read = fis.read(bytes);
        if (read != -1){
            fos.write(bytes);
        }
        fis.close();
        fos.close();
    }
    /**
     * 字符流
     * 使用FileInputStream、FileOutputStream、InputStreamReader、OutputStreamWriter、BufferedReader、BufferedWriter 復(fù)制文件
     *
     * readLine() 不用while的判斷只會(huì)輸出一行。
     */
    public static void copyByReaderAndWriter1() throws Exception {
//        File testTxt = new File("/Users/LiuShihao/IdeaProjects/netty_demo/src/main/resources/test.txt");
        File file_copy2 = new File("/Users/LiuShihao/IdeaProjects/netty_demo/src/main/resources/test_copy2.txt");
        FileInputStream fis = new FileInputStream(testTxt);
        FileOutputStream fos = new FileOutputStream(file_copy2);
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fis));
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(fos));
        String line;
        while ((line = bufferedReader.readLine()) != null){
            System.out.println(line);
            bufferedWriter.write(line);
        }
        // 注意: fis、fos要在bufferedWriter、bufferedReader關(guān)閉之后,否則會(huì)報(bào)錯(cuò)!
        bufferedWriter.close();
        bufferedReader.close();
        fis.close();
        fos.close();
    }
    /**
     * 字符流
     * 使用BufferedReader、BufferedWriter、FileReader、FileWriter復(fù)制文件
     * @throws Exception
     */
    public static void copyByReaderAndWriter2() throws Exception{
        File file_copy3 = new File("/Users/LiuShihao/IdeaProjects/netty_demo/src/main/resources/test_copy3.txt");
        BufferedReader bufferedReader = new BufferedReader(new FileReader(testTxt));
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file_copy3));
        //readLine() 每次讀取一行
        String line;
        while ((line = bufferedReader.readLine()) != null){
            System.out.println(line);
            bufferedWriter.write(line);
        }
        bufferedWriter.close();
        bufferedReader.close();
    }
}

使用BufferReader類的readLine()方法注意問(wèn)題

BufferReader類的readLine()方法

public String readLine():直到程序遇到了換行符或者是對(duì)應(yīng)流的結(jié)束符,該方法才會(huì)認(rèn)為讀到了一行,才會(huì)結(jié)束其阻塞,讓程序繼續(xù)往下執(zhí)行。

注意:讀取到?jīng)]有數(shù)據(jù)時(shí)就返回null(因?yàn)槠渌黵ead()方法當(dāng)讀到?jīng)]有數(shù)據(jù)時(shí)返回-1),而實(shí)際上readLine()是一個(gè)阻塞函數(shù),當(dāng)沒(méi)有數(shù)據(jù)讀取時(shí),就一直會(huì)阻塞在那,而不是返回null。

讀取一個(gè)文本行,通過(guò)下列字符之一即可認(rèn)為某行已終止:換行 ('\n')、回車 ('\r') 或回車后直接跟著換行。

返回:到達(dá)流末尾,就返回null。

注意:當(dāng)循環(huán)讀取文件內(nèi)容時(shí),循環(huán)條件的結(jié)束要注意使用正確。

錯(cuò)誤的使用方式:

String valueString = null;
   while (bf.readLine()!=null){        //這樣會(huì)造成數(shù)據(jù)丟失,因?yàn)樵谶@里已經(jīng)調(diào)用了readLine()方法,已經(jīng)讀取了一行,下次調(diào)用時(shí),就會(huì)丟失一行。
        System.out.println(valueString);
}

正確的解決方法:用一個(gè)變量來(lái)接收方法的返回值

String valueString = null;
   while ((valueString=bf.readLine())!=null){     //通過(guò)變量來(lái)接收數(shù)據(jù),避免數(shù)據(jù)丟失
        System.out.println(valueString);
}

DataInputStream類的readUTF()方法

readUTF讀取的必須是writeUTF()寫(xiě)下的字符串。即DataOutputStream的 writeUTF(String str)方法配套使用

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解決try-catch捕獲異常信息后Spring事務(wù)失效的問(wèn)題

    解決try-catch捕獲異常信息后Spring事務(wù)失效的問(wèn)題

    這篇文章主要介紹了解決try-catch捕獲異常信息后Spring事務(wù)失效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • idea項(xiàng)目文件夾橫向顯示,縱向顯示的解決方法

    idea項(xiàng)目文件夾橫向顯示,縱向顯示的解決方法

    這篇文章主要介紹了idea項(xiàng)目文件夾橫向顯示,縱向顯示的解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 使用Easyexcel實(shí)現(xiàn)不同場(chǎng)景的數(shù)據(jù)導(dǎo)出功能

    使用Easyexcel實(shí)現(xiàn)不同場(chǎng)景的數(shù)據(jù)導(dǎo)出功能

    這篇文章主要為大家詳細(xì)介紹了如何在不同場(chǎng)景下使用Easyexcel實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • 深入分析Android系統(tǒng)中SparseArray的源碼

    深入分析Android系統(tǒng)中SparseArray的源碼

    這篇文章主要介紹了深入分析Android系統(tǒng)中SparseArray的源碼,SparseArray為Java實(shí)現(xiàn),需要的朋友可以參考下
    2015-07-07
  • SpringMVC使用@Valid注解實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證的代碼示例

    SpringMVC使用@Valid注解實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證的代碼示例

    在 Web 開(kāi)發(fā)中,數(shù)據(jù)驗(yàn)證是一個(gè)非常重要的環(huán)節(jié),它可以確保數(shù)據(jù)的合法性和正確性,保護(hù)系統(tǒng)不受到惡意攻擊或用戶誤操作的影響,在 SpringMVC 中,我們可以使用 @Valid 注解來(lái)實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證,所以本文就給大家介紹具體的使用方法,需要的朋友可以參考下
    2023-07-07
  • 詳解Spring Boot對(duì) Apache Pulsar的支持

    詳解Spring Boot對(duì) Apache Pulsar的支持

    Spring Boot通過(guò)提供spring-pulsar和spring-pulsar-reactive自動(dòng)配置支持Apache Pulsar,類路徑中這些依賴存在時(shí),Spring Boot自動(dòng)配置命令式和反應(yīng)式Pulsar組件,PulsarClient自動(dòng)注冊(cè),默認(rèn)連接本地Pulsar實(shí)例,感興趣的朋友一起看看吧
    2024-11-11
  • Springboot之restTemplate的配置及使用方式

    Springboot之restTemplate的配置及使用方式

    這篇文章主要介紹了Springboot之restTemplate的配置及使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • JVM優(yōu)先級(jí)線程池做任務(wù)隊(duì)列的實(shí)現(xiàn)方法

    JVM優(yōu)先級(jí)線程池做任務(wù)隊(duì)列的實(shí)現(xiàn)方法

    這篇文章主要介紹了JVM優(yōu)先級(jí)線程池做任務(wù)隊(duì)列的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • java實(shí)現(xiàn)斗地主發(fā)牌系統(tǒng)

    java實(shí)現(xiàn)斗地主發(fā)牌系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)斗地主發(fā)牌系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • java8新特性之stream的collect實(shí)戰(zhàn)教程

    java8新特性之stream的collect實(shí)戰(zhàn)教程

    這篇文章主要介紹了java8新特性之stream的collect實(shí)戰(zhàn)教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08

最新評(píng)論

高碑店市| 南丰县| 楚雄市| 淳安县| 北安市| 蒙自县| 南江县| 界首市| 大石桥市| 偏关县| 陆良县| 泊头市| 湖州市| 越西县| 翁牛特旗| 盐边县| 冀州市| 宁阳县| 安顺市| 碌曲县| 城步| 武强县| 阜新| 罗城| 连州市| 长沙市| 桐城市| 商都县| 东城区| 斗六市| 贵阳市| 璧山县| 雅安市| 廊坊市| 武隆县| 明星| 克拉玛依市| 金湖县| 盘锦市| 博客| 芜湖县|