中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java?IO及BufferedReader.readline()出現的Bug該怎么處理

發布時間:2021-12-09 15:04:57 來源:億速云 閱讀:619 作者:柒染 欄目:開發技術

本篇文章為大家展示了Java IO及BufferedReader.readline()出現的Bug該怎么處理,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

Java IO及BufferedReader.readline()的Bug

IO流

Java?IO及BufferedReader.readline()出現的Bug該怎么處理

:流是一組有序的,有起點和終點的字節集合,是對計算機中數據傳輸的總稱。即數據在兩個設備間的傳輸稱為流,流的本質是數據傳輸

BufferedReader.readline()方法Bug

錯誤代碼:

		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();

原文件:

Java?IO及BufferedReader.readline()出現的Bug該怎么處理

結果:

Java?IO及BufferedReader.readline()出現的Bug該怎么處理

結果控制臺只打印了第二行,最后還報錯了空指針異常

原因:

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

修改后的代碼:

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

結果:

Java?IO及BufferedReader.readline()出現的Bug該怎么處理

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

Java?IO及BufferedReader.readline()出現的Bug該怎么處理

源碼

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 :  只要是處理純文本數據,就優先考慮使用字符流。除此之外都使用字節流。
 *   
 */
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("開始復制:"+now);
//        copyFile();
//        copyByReaderAndWriter1();
        copyByReaderAndWriter2();
        Instant end = Instant.now();
        // Duration  期間Instant          Period  時期  LocalDateTime
        System.out.println("復制完成:"+end+",耗時:"+ Duration.between(now,end));
    }
    /**
     * 使用FileinputStream、FileOutputStream   與原文件一樣
     * 將一個文件復制一份
     */
    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 復制文件
     *
     * readLine() 不用while的判斷只會輸出一行。
     */
    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關閉之后,否則會報錯!
        bufferedWriter.close();
        bufferedReader.close();
        fis.close();
        fos.close();
    }
    /**
     * 字符流
     * 使用BufferedReader、BufferedWriter、FileReader、FileWriter復制文件
     * @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()方法注意問題

一、BufferReader類的readLine()方法

public String readLine():直到程序遇到了換行符或者是對應流的結束符,該方法才會認為讀到了一行,才會結束其阻塞,讓程序繼續往下執行。

注意:讀取到沒有數據時就返回null(因為其它read()方法當讀到沒有數據時返回-1),而實際上readLine()是一個阻塞函數,當沒有數據讀取時,就一直會阻塞在那,而不是返回null。

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

返回:到達流末尾,就返回null。

注意:當循環讀取文件內容時,循環條件的結束要注意使用正確。

錯誤的使用方式:

String valueString = null;
   while (bf.readLine()!=null){        //這樣會造成數據丟失,因為在這里已經調用了readLine()方法,已經讀取了一行,下次調用時,就會丟失一行。
        System.out.println(valueString);
}

正確的解決方法:用一個變量來接收方法的返回值

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

二、DataInputStream類的readUTF()方法

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

上述內容就是Java IO及BufferedReader.readline()出現的Bug該怎么處理,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

铅山县| 九江市| 镇平县| 武义县| 若尔盖县| 惠水县| 安岳县| 黎平县| 金乡县| 华宁县| 鞍山市| 亚东县| 延寿县| 晋宁县| 兰考县| 天柱县| 古浪县| 日照市| 民权县| 临夏市| 三都| 锦州市| 罗山县| 连平县| 会泽县| 拉孜县| 临西县| 文安县| 渭源县| 资源县| 蒙城县| 焦作市| 锡林郭勒盟| 沧源| 尼玛县| 株洲县| 扎赉特旗| 怀柔区| 新蔡县| 北安市| 德昌县|