亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

解決BufferedReader.readLine()遇見的坑

 更新時間:2021年12月09日 10:58:08   作者:南丘xf  
這篇文章主要介紹了解決BufferedReader.readLine()遇見的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

BufferedReader.readLine()遇見的坑

在寫ftp上傳文件至服務器的過程中,有這樣一個判斷:判斷某個文件夾下有多少個文件,內(nèi)容為null的文件不上傳,所以利用BufferedReader讀取文件的內(nèi)容,判斷是否為null,所以用到了BufferedReader.readLine(),結果竟然卡死:txt、word、Excle、Ftp文件等都沒有問題,但是讀取MP3、Rar、zip等文件時,就一直處于卡死狀態(tài),先看代碼:

package com.test;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
 
public class TestCh { 
	public void readDocFileToFtp() {
		String docPath = "H:\\11"; // 文件所在路徑 模擬
		File file;
		try {
			file = new File(docPath);
			File[] files = file.listFiles();
			if (files.length == 0) {
				System.err.println(docPath + "文件夾下沒有任何文件!");
			} else {
				Arrays.sort(files);
				System.err.println("文件數(shù)---" + files.length);
				for (int i = 0; i < files.length; i++) {
					if (files[i].isFile()) {
						InputStreamReader reader;
						reader = new InputStreamReader(new FileInputStream(files[i]));
						BufferedReader br = new BufferedReader(reader);
						String message = "";
						String line = "";
						long startTime = System.currentTimeMillis(); // 獲取開始時間
						while ((line = br.readLine()) != null) {
							message += line;
						}
						br.close();
						long endTime = System.currentTimeMillis(); // 獲取結束時間
						System.out.println("程序運行時間: " + (endTime - startTime) / 1000 + "ms");
 
						String fileName = files[i].getName();
 
						if (message.trim() == null || message.length() == 0) {
							System.err.println(fileName + "文件內(nèi)容為空!");
						} else {
							// 上傳文件
							System.err.println("上傳===============");
						}
					}
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		} 
	}
	
	public static void main(String[] args) {
		TestCh te = new TestCh();
		te.readDocFileToFtp();
	} 
}

然后一直卡死:

我們都知道,readLine()方法是遇到換行符或者是對應流的結束符,該方法才會認為讀到了一行(才會結束其阻塞),讓程序繼續(xù)往下執(zhí)行。但可能因為以前不留意,也沒遇見過這種情況,所以就認為該方法可放心使用

今天踩了這個坑,所以做個筆記

我們可能下意識地認為readLine()讀取到?jīng)]有數(shù)據(jù)時就返回null(因為read()方法當讀到?jīng)]有數(shù)據(jù)時返回-1),而實際上readLine()是一個阻塞函數(shù),當沒有數(shù)據(jù)讀取時,就一直會阻塞在那,而不是返回null。

readLine()只有在數(shù)據(jù)流發(fā)生異?;蛘吡硪欢吮籧lose()掉時,才會返回null值。

如果不指定buffer大小,則readLine()使用的buffer有8192個字符。

在達到buffer大小之前,只有遇到"/r"、"/n"、"/r/n"才會返回。

String readLine(boolean ignoreLF) throws IOException {
	StringBuffer s = null;
	int startChar;
        synchronized (lock) {
            ensureOpen();
	    boolean omitLF = ignoreLF || skipLF;
	    bufferLoop:
	    for (;;) {
		if (nextChar >= nChars)
		    fill(); //在此讀數(shù)據(jù)
		if (nextChar >= nChars) { /* EOF */
		    if (s != null && s.length() > 0)
			return s.toString();
		    else
			return null;
		}
      ......//其它
}
 
private void fill() throws IOException {
	..../其它
	int n;
	do {
	    n = in.read(cb, dst, cb.length - dst); //實質(zhì)
	} while (n == 0);
	if (n > 0) {
	    nChars = dst + n;
	    nextChar = dst;
	}
    }

通過查看源碼可知,readLine()是調(diào)用了read(char[] cbuf, int off, int len) 來讀取數(shù)據(jù),后面再根據(jù)"/r"或"/n"來進行數(shù)據(jù)處理

所以使用readLine()一定要注意

1.讀入的數(shù)據(jù)要注意有/r或/n或/r/n

2.沒有數(shù)據(jù)時會阻塞,在數(shù)據(jù)流異?;驍嚅_時才會返回null

3.非必要時(socket之類的數(shù)據(jù)流),要避免使用readLine(),以免為了等待一個換行/回車符而一直阻塞

BufferedReader.readLine解析

bufferedreader.readline()加載流程:

br = new BufferedReader(reader,510241024);//設置緩存大小:5M

根據(jù)指定緩存大小,或默認緩存大小,讀取文件內(nèi)容放到緩存中,在將緩存數(shù)據(jù)放在內(nèi)存中進行讀取,等前一批內(nèi)存中的數(shù)據(jù)讀取完成后,

下一批緩存數(shù)據(jù)會放在內(nèi)存中進行讀取;

按行讀取時等待讀取到換行符返回內(nèi)容;

注意:以上內(nèi)容都是自己理解的,僅為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java中l(wèi)ist集合為空或為null的區(qū)別說明

    Java中l(wèi)ist集合為空或為null的區(qū)別說明

    這篇文章主要介紹了Java中l(wèi)ist集合為空或為null的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java guava monitor監(jiān)視器線程的使用詳解

    Java guava monitor監(jiān)視器線程的使用詳解

    工作中的場景中是否存在類似這樣的場景,需要提交的線程在某個觸發(fā)條件下執(zhí)行。本文主要就是使用guava中的monitor來優(yōu)雅的實現(xiàn)帶監(jiān)視器的線程
    2021-11-11
  • 一文讀懂IDEA里面的Artifact到底是什么

    一文讀懂IDEA里面的Artifact到底是什么

    這篇文章主要介紹了IDEA里面的Artifact到底是什么,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-01-01
  • java為移動端寫接口開發(fā)實例

    java為移動端寫接口開發(fā)實例

    本篇文章主要介紹了java如何為移動端寫接口,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Java實現(xiàn)快速排序過程分析

    Java實現(xiàn)快速排序過程分析

    今天小編就為大家分享一篇關于Java實現(xiàn)快速排序過程分析,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • Java?File類的概述及常用方法使用詳解

    Java?File類的概述及常用方法使用詳解

    Java?File類的功能非常強大,下面這篇文章主要給大家介紹了關于Java中File類的概述及常用方法使用,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • java幾種排序算法的實現(xiàn)及簡單分析

    java幾種排序算法的實現(xiàn)及簡單分析

    這篇文章主要介紹了java幾種排序算法的實現(xiàn)及簡單分析,實例分析了插入排序、希爾排序、選擇排序等常用排序算法,并分析了各個算法的優(yōu)劣,需要的朋友可以參考下
    2015-05-05
  • Java中的lambda和stream實現(xiàn)排序

    Java中的lambda和stream實現(xiàn)排序

    這篇文章主要介紹了Java中的lambda和stream實現(xiàn)排序,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • Java Stream 流實現(xiàn)合并操作示例

    Java Stream 流實現(xiàn)合并操作示例

    這篇文章主要介紹了Java Stream 流實現(xiàn)合并操作,結合實例形式詳細分析了Java Stream 流實現(xiàn)合并操作原理與相關注意事項,需要的朋友可以參考下
    2020-05-05
  • Java 中String StringBuilder 與 StringBuffer詳解及用法實例

    Java 中String StringBuilder 與 StringBuffer詳解及用法實例

    這篇文章主要介紹了Java 中String StringBuilder 與 StringBuffer詳解及用法實例的相關資料,需要的朋友可以參考下
    2017-02-02

最新評論