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

java中使用Files.readLines()處理文本中行數(shù)據(jù)方式

 更新時間:2021年12月09日 11:30:38   作者:PM-YANG  
這篇文章主要介紹了java中使用Files.readLines()處理文本中行數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

使用Files.readLines()處理文本中行數(shù)據(jù)

開發(fā)中遇到對數(shù)據(jù)庫導(dǎo)出到文件里的數(shù)據(jù)進(jìn)行處理,然后對處理后的數(shù)據(jù)再重新寫回文件中,在這個過程中使用到了Files.readLines()方法

/**
 *
 * @param file : existed file
 * @throws IOException
 */
public void lineProcess(File file) throws IOException {
    Files.readLines(file, Charset.defaultCharset(), new LineProcessor() {
        File outFile = new File("outfile");//處理后的數(shù)據(jù)輸出文件
        List<String> lines = new ArrayList<String>();
        @Override
        public boolean processLine(String line) throws IOException {
            String newLine = "";
            //file中的 line數(shù)據(jù)格式:name,age,address -> NAME,AGE,ADDRESS,
            String[] contents = line.split(",");
            for (int i=0;i<contents.length;i++){
                newLine.concat(contents[i].toLowerCase());
            }
            lines.add(newLine);
            //將處理后的數(shù)寫入新的文件 outFile
            FileUtils.writeLines(outFile,lines,true);
            lines.clear();
            return true;
        }
        @Override
        public Object getResult() {
            try{
                FileUtils.writeLines(outFile,lines,true);
            }catch (Exception e){
                e.getCause();
            }
            lines.clear();
            return null;
        }
    });
}

方法中的LineProcessor()實(shí)現(xiàn)對每一行數(shù)據(jù)處理邏輯。

依賴guava

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>19.0</version>
</dependency>

被readLine()折騰了一把

雖然寫IO方面的程序不多,但BufferedReader/BufferedInputStream倒是用過好幾次的,原因是:

它有一個很特別的方法:readLine(),使用起來特別方便,每次讀回來的都是一行,省了很多手動拼接buffer的瑣碎;

它比較高效,相對于一個字符/字節(jié)地讀取、轉(zhuǎn)換、返回來說,它有一個緩沖區(qū),讀滿緩沖區(qū)才返回;一般情況下,都建議使用它們把其它Reader/InputStream包起來,使得讀取數(shù)據(jù)更高效。

對于文件來說,經(jīng)常遇到一行一行的,特別相符情景。

這次是在藍(lán)牙開發(fā)時,使用兩個藍(lán)牙互相傳數(shù)據(jù)(即一個發(fā)一個收),bluecove這個開源組件已經(jīng)把數(shù)據(jù)讀取都封裝成InputStream了,也就相當(dāng)于平時的IO讀取了,很自然就使用起readLine()來了。

發(fā)數(shù)據(jù)

BufferedWriter output = new BufferedWriter(new OutputStreamWriter(conn.openOutputStream())); 
int i = 1;
String message = "message " + i;
while(isRunning) {
    output.write(message+"/n"); 
    i++;
}

讀數(shù)據(jù)

BufferedReader input = new BufferedReader(new  InputStreamReader(m_conn.openInputStream()));
String message = "";
String line = null;
while((line = m_input.readLine()) != null) {
    message += line;
}
System.out.println(message);

上面是代碼的節(jié)選,使用這段代碼會發(fā)現(xiàn)寫數(shù)據(jù)時每次都成功,而讀數(shù)據(jù)側(cè)卻一直沒有數(shù)據(jù)輸出(除非把流關(guān)掉)。經(jīng)過折騰,原來這里面有幾個大問題需要理解:

誤以為readLine()是讀取到?jīng)]有數(shù)據(jù)時就返回null(因?yàn)槠渌黵ead方法當(dāng)讀到?jīng)]有數(shù)據(jù)時返回-1),而實(shí)際上readLine()是一個阻塞函數(shù),當(dāng)沒有數(shù)據(jù)讀取時,就一直會阻塞在那,而不是返回null;因?yàn)閞eadLine()阻塞后,System.out.println(message)這句根本就不會執(zhí)行到,所以在接收端就不會有東西輸出。要想執(zhí)行到System.out.println(message),一個辦法是發(fā)送完數(shù)據(jù)后就關(guān)掉流,這樣readLine()結(jié)束阻塞狀態(tài),而能夠得到正確的結(jié)果,但顯然不能傳一行就關(guān)一次數(shù)據(jù)流;另外一個辦法是把System.out.println(message)放到while循環(huán)體內(nèi)就可以。

readLine()只有在數(shù)據(jù)流發(fā)生異常或者另一端被close()掉時,才會返回null值。

如果不指定buffer大小,則readLine()使用的buffer有8192個字符。在達(dá)到buffer大小之前,只有遇到"/r"、"/n"、"/r/n"才會返回。

readLine()的實(shí)質(zhì)(下面是從JDK源碼摘出來的)

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); //實(shí)質(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"來進(jìn)行數(shù)據(jù)處理。

在Java I/O書上也說了:

public String readLine() throws IOException
This method returns a string that contains a line of text from a text file. /r, /n, and /r/n are assumed to be line breaks and are not included in the returned string. This method is often used when reading user input from System.in, since most platforms only send the user's input to the running program after the user has typed a full line (that is, hit the Return key).
readLine() has the same problem with line ends that DataInputStream's readLine() method has; that is, the potential to hang on a lone carriage return that ends the stream . This problem is especially acute on networked connections, where readLine() should never be used.

小結(jié),使用readLine()一定要注意

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

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

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

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

相關(guān)文章

  • SpringBoot整合EasyCaptcha實(shí)現(xiàn)圖形驗(yàn)證碼功能

    SpringBoot整合EasyCaptcha實(shí)現(xiàn)圖形驗(yàn)證碼功能

    這篇文章主要介紹了SpringBoot整合EasyCaptcha實(shí)現(xiàn)圖形驗(yàn)證碼功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-02-02
  • java泛型基本知識及通用方法

    java泛型基本知識及通用方法

    這篇文章主要介紹了java泛型基礎(chǔ)知識及通用方法,從以下幾個方面介紹一下java的泛型: 基礎(chǔ), 泛型關(guān)鍵字, 泛型方法, 泛型類和接口,感興趣的可以了解一下
    2019-04-04
  • idea替換快捷鍵,批量處理對象的操作

    idea替換快捷鍵,批量處理對象的操作

    這篇文章主要介紹了idea替換快捷鍵,批量處理對象的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • IntelliJ IDEA優(yōu)化配置的實(shí)現(xiàn)

    IntelliJ IDEA優(yōu)化配置的實(shí)現(xiàn)

    這篇文章主要介紹了IntelliJ IDEA優(yōu)化配置的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • SpringBoot中添加監(jiān)聽器及創(chuàng)建線程的代碼示例

    SpringBoot中添加監(jiān)聽器及創(chuàng)建線程的代碼示例

    這篇文章主要介紹了SpringBoot中如何添加監(jiān)聽器及創(chuàng)建線程,文中有詳細(xì)的代碼示例,具有一定的參考價值,需要的朋友可以參考下
    2023-06-06
  • Java方法遞歸與輸入輸出深入探索

    Java方法遞歸與輸入輸出深入探索

    這篇文章主要介紹了Java方法遞歸與輸入輸出的相關(guān)資料,方法遞歸是一種在方法內(nèi)部調(diào)用自身的技術(shù),適用于具有遞歸結(jié)構(gòu)的問題,輸入輸出是Java程序與外部世界交互的橋梁,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • java組件commons-fileupload實(shí)現(xiàn)文件上傳

    java組件commons-fileupload實(shí)現(xiàn)文件上傳

    這篇文章主要介紹了java借助commons-fileupload組件實(shí)現(xiàn)文件上傳,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • SpringMVC源碼解讀之HandlerMapping

    SpringMVC源碼解讀之HandlerMapping

    這篇文章主要介紹了SpringMVC源碼解讀之HandlerMapping 的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • 基于Java實(shí)現(xiàn)Json文件轉(zhuǎn)換為Excel文件

    基于Java實(shí)現(xiàn)Json文件轉(zhuǎn)換為Excel文件

    這篇文章主要為大家詳細(xì)介紹了如何利用Java實(shí)現(xiàn)Json文件轉(zhuǎn)換為Excel文件,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,需要的可以參考一下
    2022-12-12
  • Spring Cloud動態(tài)配置刷新@RefreshScope與@Component的深度解析

    Spring Cloud動態(tài)配置刷新@RefreshScope與@Component的深度解析

    在現(xiàn)代微服務(wù)架構(gòu)中,動態(tài)配置管理是一個關(guān)鍵需求,Spring Cloud 提供了 @RefreshScope 注解,允許應(yīng)用在運(yùn)行時動態(tài)更新配置,而無需重啟服務(wù),本文深入探析Spring Cloud動態(tài)配置刷新@RefreshScope與@Component,感興趣的朋友一起看看吧
    2025-04-04

最新評論

三明市| 巨鹿县| 焦作市| 桂林市| 嵩明县| 镇安县| 历史| 班玛县| 上犹县| 博爱县| 平湖市| 炎陵县| 和顺县| 阳曲县| 清水河县| 图片| 凯里市| 通河县| 应城市| 蒙阴县| 青川县| 临海市| 手游| 南开区| 大名县| 徐水县| 顺平县| 北票市| 中山市| 怀化市| 临安市| 湄潭县| 开鲁县| 班玛县| 彭阳县| 米林县| 雷波县| 福州市| 安徽省| 凉山| 利川市|