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

JavaIO?BufferedReader和BufferedWriter使用及說明

 更新時間:2022年12月26日 10:10:18   作者:藍藍223  
這篇文章主要介紹了JavaIO?BufferedReader和BufferedWriter使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

BufferedReader和BufferedWriter簡介

為了提高字符流讀寫的效率,引入了緩沖機制,進行字符批量的讀寫,提高了單個字符讀寫的效率。

BufferedReader用于加快讀取字符的速度,BufferedWriter用于加快寫入的速度

BufferedReader和BufferedWriter類各擁有8192個字符的緩沖區(qū)。當BufferedReader在讀取文本文件時,會先盡量從文件中讀入字符數(shù)據(jù)并放滿緩沖區(qū),而之后若使用read()方法,會先從緩沖區(qū)中進行讀取。

如果緩沖區(qū)數(shù)據(jù)不足,才會再從文件中讀取,使用BufferedWriter時,寫入的數(shù)據(jù)并不會先輸出到目的地,而是先存儲至緩沖區(qū)中。如果緩沖區(qū)中的數(shù)據(jù)滿了,才會一次對目的地進行寫出。

BufferedReader

BufferedReader是為了提供讀的效率而設計的一個包裝類,它可以包裝字符流??梢詮淖址斎肓髦凶x取文本,緩沖各個字符,從而實現(xiàn)字符、數(shù)組和行的高效讀取。

構造方法

方法描述
BufferedReader(Reader in)創(chuàng)建一個使用默認大小輸入緩沖區(qū)的緩沖字符輸入流。
BufferedReader(Reader in, int sz)創(chuàng)建一個使用指定大小輸入緩沖區(qū)的緩沖字符輸入流。

成員方法

方法描述
int read()讀取單個字符。
int read(char[] cbuf, int off, int len)將字符讀入數(shù)組的某一部分。
String readLine()讀取一個文本行。
long skip(long n)跳過字符。
boolean ready()判斷此流是否已準備好被讀取。
void close()關閉該流并釋放與之關聯(lián)的所有資源。
void mark(int readAheadLimit)標記流中的當前位置。
boolean markSupported()判斷此流是否支持 mark() 操作(它一定支持)。
void reset()將流重置到最新的標記。

讀取文件實例

讀取文件: 一個字符一個字符的讀取

int read()方法,每次可以讀取到一個字符(以int 類型表示),不過因為返回的是int類型的,所以要強制類型轉(zhuǎn)換成char類型才能打印該字符。

public static void printByFileReader(String filePath) throws IOException
{
? ? BufferedReader reader=new BufferedReader(
? ? ? ? ? ? new FileReader(filePath)
? ? ? ? ? ? );
? ? if(!reader.ready())
? ? {
? ? ? ? System.out.println("文件流暫時無法讀取");
? ? ? ? return;
? ? }
? ? int result=0;
? ? while((result=reader.read())!=-1)
? ? {
? ? ? ? //因為讀取到的是int類型的,所以要強制類型轉(zhuǎn)換
? ? ? ? System.out.print((char)result);
? ? }
? ? reader.close();
}

讀取文件:一個數(shù)組一個數(shù)組的讀取

int read(char[] cbuf, int off, int len)方法,每次讀取len個字符放到字符數(shù)組cbuf中,從數(shù)組cbuf的下表off開始放,返回的是每次讀取的字符個數(shù)。

public static void printByFileReaderChars(String filePath) throws IOException
{
? ? BufferedReader reader=new BufferedReader(
? ? ? ? ? ? new FileReader(filePath)
? ? ? ? ? ? );
? ? if(!reader.ready())
? ? {
? ? ? ? System.out.println("文件流暫時無法讀取");
? ? ? ? return;
? ? }
? ? int size=0;
? ? char[] cbuf=new char[20];
? ? while((size=reader.read(cbuf, 0, cbuf.length))!=-1)
? ? {
? ? ? ? System.out.print(new String(cbuf,0,size));
? ? }
? ? reader.close();
}

讀取文件:一行一行的讀取

String readLine()這個方法一次可以讀取一個文本行,返回的直接就是這一行的字符串,如果讀到行尾了就返回null。

public static void printByFileReaderLine(String filePath) throws IOException
{
? ? BufferedReader reader=new BufferedReader(
? ? ? ? ? ? new FileReader(filePath)
? ? ? ? ? ? );
? ? if(!reader.ready())
? ? {
? ? ? ? System.out.println("文件流暫時無法讀取");
? ? ? ? return;
? ? }
? ? int size=0;
? ? String line;
? ? while((line=reader.readLine())!=null)
? ? {
? ? ? ? System.out.print(line+"\n");
? ? }
? ? reader.close();
}

需要注意的是:reader.readLine()方法返回的一行字符中不包含換行符,所以輸出的時候要自己加上換行符。

BufferedReader比FileReader高級的地方在于這個,F(xiàn)ileReader能一次讀取一個字符,或者一個字符數(shù)組。而BufferedReader也可以,同時BufferedReader還能一次讀取一行字符串。同時,BufferedReader帶緩沖,會比FileReader快很多。

但是FileReader使用項目的編碼來讀取解析字符,不能指定編碼,可能會出現(xiàn)編碼問題,如果要指定編碼可以使用包裝InputStreamReader的BufferedReader。這樣兼顧效率和編碼。

測試上述方法:

public static void main(String[] args) throws IOException
{
? ? String fileutf8="utf8.txt";
? ? String filegbk="gbk.txt";
? ? //一個字符一個字符的讀取
? ? printByFileReader(filegbk);
? ? System.out.println("\n---------------------------------------");
? ? //一個字符數(shù)組一個字符數(shù)組的讀取
? ? printByFileReaderChars(filegbk);
? ? System.out.println("\n---------------------------------------");
? ? //一行一行的讀取
? ? printByFileReaderLine(filegbk);
? ? System.out.println("#########################################");
? ? //一個字符一個字符的讀取
? ? printByFileReader(fileutf8);
? ? System.out.println("\n---------------------------------------");
? ? //一個數(shù)組一個數(shù)組的讀取
? ? printByFileReaderChars(fileutf8);
? ? System.out.println("\n---------------------------------------");
? ? //一行一行的讀取
? ? printByFileReaderLine(fileutf8);
}

運行結果:

gbk file
這里是一句中文
---------------------------------------
gbk file
這里是一句中文
---------------------------------------
gbk file
這里是一句中文
#########################################
utf-8 file
榪欓噷鏄竴鍙ヤ腑鏂?
---------------------------------------
utf-8 file
榪欓噷鏄竴鍙ヤ腑鏂?
---------------------------------------
utf-8 file
榪欓噷鏄竴鍙ヤ腑鏂?

可以看到包裝FileReader的BufferedReader在讀取文件時候如果文件的編碼和項目的編碼不一樣的時候,會出現(xiàn)亂。

亂碼問題

使用包裝InputStreamReader的BufferedReader讀取文件

String file = "utf8.txt";
BufferedReader reader = new BufferedReader(
        new InputStreamReader(new FileInputStream(file), "utf-8"));
char[] cbuf=new char[20];
int size;
while((size=reader.read(cbuf, 0, cbuf.length))!=-1)
{
    System.out.println(new String(cbuf,0,size));
}

運行結果:

utf-8 file
這里是一句中文

這里要弄清楚的是BufferedReader只負責讀到它的內(nèi)部緩沖區(qū)中,而解碼的工作是InputStreamReader完成的。

BufferedWriter

BufferedWriter的API:

構造函數(shù)

方法描述
BufferedWriter(Writer out)創(chuàng)建一個緩沖字符輸出流,使用默認大小的輸出緩沖區(qū)
BufferedWriter(Writer out, int sz)創(chuàng)建一個緩沖字符輸出流,使用給定大小的輸出緩沖區(qū)

成員方法

方法描述
void write(int c)寫入單個字符。
void write(char[] cbuf, int off, int len)寫入字符數(shù)組的某一部分。
void write(String s, int off, int len)寫入字符串的某一部分。
void newLine()寫入一個行分隔符。
void close()關閉此流,但要先刷新它。
void flush()刷新該流的緩沖。

寫文件實例

使用上述三個寫方法寫文件:一個字符一個字符的復制文件

public static void main(String[] args) throws IOException
{
    BufferedWriter writer=new BufferedWriter(new FileWriter("靜夜思.txt"));
    char ch='床';
    //寫入一個字符
    writer.write(ch);
    String next="前明月光,";
    char[] nexts=next.toCharArray();
    //寫入一個字符數(shù)組
    writer.write(nexts,0,nexts.length);
    //寫入換行符
    writer.newLine();//寫入換行符
    String nextLine="疑是地上霜。";
    //寫入一個字符串。
    writer.write(nextLine);
    //關閉流
    writer.close();
}

運行結果,靜夜思.txt:

床前明月光,
疑是地上霜。

應用:復制文本文件

逐個字符復制文件

static void copyByChar(String srcFile, String destFile) throws IOException
{
? ? BufferedReader reader = new BufferedReader(new FileReader(srcFile));
? ? BufferedWriter writer = new BufferedWriter(new FileWriter(destFile));
? ? int ch=0;
? ? //讀取一個字符
? ? while ((ch = reader.read()) != -1)
? ? {
? ? ? ? //寫入一個字符
? ? ? ? writer.write(ch);
? ? }
? ? reader.close();
? ? writer.close();
}

逐個字符數(shù)組復制文件

static void copyByCharArray(String srcFile, String destFile) throws IOException
{
? ? BufferedReader reader = new BufferedReader(new FileReader(srcFile));
? ? BufferedWriter writer = new BufferedWriter(new FileWriter(destFile));
? ? int size=0;
? ? char[] cbuf=new char[20];
? ? //讀取一個字符數(shù)組
? ? while ((size = reader.read(cbuf)) != -1)
? ? {
? ? ? ? //讀入多少寫入多少
? ? ? ? writer.write(cbuf,0,size);
? ? }
? ? reader.close();
? ? writer.close();
}

按行復制文件

static void copyByLine(String srcFile,String destFile) throws IOException
{
? ? BufferedReader reader=new BufferedReader(new FileReader(srcFile));
? ? BufferedWriter writer=new BufferedWriter(new FileWriter(destFile));
? ? String line;
? ? //BufferedReader讀取一行的時候返回的字符串中不包括換行符
? ? //如果有一行字符就返回該行字符串,沒有就返回null
? ? while((line=reader.readLine())!=null)
? ? {
? ? ? ? writer.write(line);
? ? ? ? writer.newLine();//寫換行符
? ? }
? ? reader.close();
? ? writer.close();
}

需要注意的是,BufferedReader的readLine()讀取一行的時候返回的字符串沒有換行符,所以,復制的時候?qū)懳募俏覀兒枚鄬懭胍粋€換行符,使用writer.newLine()方法即可。

測試

public static void main(String[] args) throws IOException
{
? ? String from = "gbk.txt";
? ? String to = "gbk_copy.txt";
? ? String to1 = "gbk_copy1.txt";
? ? String to2 = "gbk_copy2.txt";
? ? copyByChar(from, to);
? ? copyByCharArray(from, to1);
? ? copyByLine(from, to2);
}

源文件gbk.txt:

運行結果:

gbk_copy.txt

gbk file
這里是一句中文

gbk_copy1.txt

gbk file
這里是一句中文

gbk_copy2.txt

gbk file
這里是一句中文

bug:按行復制的時候多寫換行符

細心的朋友可能發(fā)現(xiàn),按行復制的時候,復制的文件會莫名其妙的在文件后面多了一個換行符。這是因為我們每次都在讀到的字符串后面寫一個換行符。

解決辦法:在讀到的字符串前面寫換行符,這樣出現(xiàn)新的問題,就是在文件開頭多出了一個空行,所以加入控制語句,在第一行不寫入換行符,第二行后再寫。

static void copyByLine(String srcFile,String destFile) throws IOException
{
? ? BufferedReader reader=new BufferedReader(new FileReader(srcFile));
? ? BufferedWriter writer=new BufferedWriter(new FileWriter(destFile));
? ? String line;
? ? //BufferedReader讀取一行的時候返回的字符串中不包括換行符
? ? //如果有一行字符就返回該行字符串,沒有就返回null
? ? boolean flag=false;
? ? while((line=reader.readLine())!=null)
? ? {
? ? ? ? if(!flag)
? ? ? ? {
? ? ? ? ? ? flag=true;
? ? ? ? ? ? writer.write(line);
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? writer.newLine();//寫換行符
? ? ? ? ? ? writer.write(line);
? ? ? ? }

? ? }
? ? reader.close();
? ? writer.close();
}

這樣復制的文件就不會多謝換行符了,保證復制的文件和源文件是一模一樣的。

bug:亂碼問題

因為我們使用的是包裝FileReader的BufferedReader,包裝FileWriter的BufferedWriter。所以讀字符,寫字符的時候使用的是默認的字符編碼讀寫的。

所以讀寫文件的時候會出現(xiàn)亂碼,可以使用包裝InputStreamReader的BufferedReader,包裝OutputStreamWriter的BufferedWriter來復制文件,這樣就可以支持各種字符編碼。

實例:gbk編碼的文件復制到utf8編碼的文件中:

static void copyByLineEncoding(String srcFile, String srcEncoding, String destFile,
? ? ? ? String destEncoding)
{
? ? BufferedReader reader = null;
? ? BufferedWriter writer = null;
? ? try
? ? {
? ? ? ? reader = new BufferedReader(new InputStreamReader(
? ? ? ? ? ? ? ? new FileInputStream(srcFile), srcEncoding));
? ? ? ? writer = new BufferedWriter(new OutputStreamWriter(
? ? ? ? ? ? ? ? new FileOutputStream(destFile), destEncoding));
? ? ? ? char[] charArray = new char[512];
? ? ? ? int size;
? ? ? ? while ((size = reader.read(charArray, 0, charArray.length)) != -1)
? ? ? ? {
? ? ? ? ? ? writer.write(charArray, 0, size);
? ? ? ? }

? ? } catch (UnsupportedEncodingException | FileNotFoundException e)
? ? {
? ? ? ? e.printStackTrace();
? ? } catch (IOException e)
? ? {
? ? ? ? e.printStackTrace();
? ? } finally
? ? {
? ? ? ? if (writer != null)
? ? ? ? {
? ? ? ? ? ? try
? ? ? ? ? ? {
? ? ? ? ? ? ? ? writer.close();
? ? ? ? ? ? } catch (IOException e)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? if (reader != null)
? ? ? ? {
? ? ? ? ? ? try
? ? ? ? ? ? {
? ? ? ? ? ? ? ? reader.close();
? ? ? ? ? ? } catch (IOException e)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

main方法:

public static void main(String[] args) throws IOException
{
? ? String from = "gbk.txt";
? ? String to = "copyto_utf8.txt";
? ? copyByLineEncoding(from,"gbk",to,"utf-8");
}

源文件gbk.txt(gbk編碼):

gbk file
這里是一句中文

目標文件copyto_utf8.txt:

utf-8 file
榪欓噷鏄竴鍙ヤ腑鏂?

亂碼是正常的,因為我們的工程目錄用的gbk編碼,把copyto_utf8.txt編碼顯示就好了:

utf-8 file
這里是一句中文

所以使用包裝InputStreamReader的BufferedReader,包裝OutputStreamWriter的BufferedWriter來復制文件的好處就是可以指定復制文件的時候使用的字符編碼,例如上面的復制操作,從gbk編碼的文件中讀取,然后寫入到utf8編碼的文件中去。

總結

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

相關文章

  • 實例分析Java Class的文件結構

    實例分析Java Class的文件結構

    今天把之前在Evernote中的筆記重新整理了一下,發(fā)上來供對java class 文件結構的有興趣的同學參考一下
    2013-04-04
  • MyBatis-Plus QueryWrapper及LambdaQueryWrapper的使用詳解

    MyBatis-Plus QueryWrapper及LambdaQueryWrapper的使用詳解

    這篇文章主要介紹了MyBatis-Plus QueryWrapper及LambdaQueryWrapper的使用詳解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java 由淺入深帶你掌握圖的遍歷

    Java 由淺入深帶你掌握圖的遍歷

    圖的遍歷是指,從給定圖中任意指定的頂點(稱為初始點)出發(fā),按照某種搜索方法沿著圖的邊訪問圖中的所有頂點,使每個頂點僅被訪問一次,這個過程稱為圖的遍歷。遍歷過程中得到的頂點序列稱為圖遍歷序列
    2022-03-03
  • 對Java ArrayList的自動擴容機制示例講解

    對Java ArrayList的自動擴容機制示例講解

    今天小編就為大家分享一篇對Java ArrayList的自動擴容機制示例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • LibrarySystem圖書管理系統(tǒng)(二)

    LibrarySystem圖書管理系統(tǒng)(二)

    這篇文章主要為大家詳細介紹了LibrarySystem圖書管理系統(tǒng)開發(fā)第二篇,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Spring中的MultipartFile詳解

    Spring中的MultipartFile詳解

    這篇文章主要介紹了Spring中的MultipartFile詳解,隨著Spring框架的崛起,使用Spring框架中的MultipartFile來處理文件也是件很方便的事了,今天就為大家?guī)砥饰鯩ultipartFile的神秘面紗,需要的朋友可以參考下
    2024-01-01
  • Java經(jīng)典面試題匯總:Java Web

    Java經(jīng)典面試題匯總:Java Web

    本篇總結的是Java Web相關的面試題,后續(xù)會持續(xù)更新,希望我的分享可以幫助到正在備戰(zhàn)面試的實習生或者已經(jīng)工作的同行,如果發(fā)現(xiàn)錯誤還望大家多多包涵,不吝賜教,謝謝
    2021-07-07
  • Java 數(shù)組差集實例代碼

    Java 數(shù)組差集實例代碼

    這篇文章主要介紹了Java 數(shù)組差集實例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • 關于spring的自定義緩存注解分析

    關于spring的自定義緩存注解分析

    這篇文章主要介紹了關于spring的自定義緩存注解分析,因為所有的key的失效時間都一樣,要想實現(xiàn)不同的key不同的失效時間,就得需要自定義緩存注解,需要的朋友可以參考下
    2023-05-05
  • 解決java?try?throw?exception?finally遇上return?break?continue造成異常丟失

    解決java?try?throw?exception?finally遇上return?break?conti

    這篇文章主要介紹了解決java?try?throw?exception?finally遇上return?break?continue造成異常丟失問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11

最新評論

乌兰察布市| 斗六市| 江安县| 古蔺县| 星子县| 蒙自县| 内乡县| 龙井市| 巴彦淖尔市| 德清县| 榆林市| 萝北县| 祁东县| 麟游县| 虞城县| 田林县| 白沙| 铁岭县| 闽侯县| 梓潼县| 南通市| 饶河县| 诸暨市| 焉耆| 班玛县| 新竹市| 八宿县| 清流县| 喀喇沁旗| 石河子市| 宜州市| 绥中县| 黔江区| 耿马| 淅川县| 广平县| 鲜城| 郁南县| 宽城| 喀喇沁旗| 都兰县|