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

【Java IO流】字節(jié)流和字符流的實(shí)例講解

 更新時(shí)間:2017年09月15日 09:08:37   作者:云開(kāi)的立夏  
下面小編就為大家?guī)?lái)一篇【Java IO流】字節(jié)流和字符流的實(shí)例講解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

字節(jié)流和字符流

對(duì)于文件必然有讀和寫(xiě)的操作,讀和寫(xiě)就對(duì)應(yīng)了輸入和輸出流,流又分成字節(jié)和字符流。

1.從對(duì)文件的操作來(lái)講,有讀和寫(xiě)的操作——也就是輸入和輸出。

2.從流的流向來(lái)講,有輸入和輸出之分。

3.從流的內(nèi)容來(lái)講,有字節(jié)和字符之分。

這篇文章先后講解IO流中的字節(jié)流和字符流的輸入和輸出操作。

一、字節(jié)流

1)輸入和輸出流

首先,字節(jié)流要進(jìn)行讀和寫(xiě),也就是輸入和輸出,所以它有兩個(gè)抽象的父類InputStream、OutputStream。

InputStream抽象了應(yīng)用程序讀取數(shù)據(jù)的方式,即輸入流。
OutputStream抽象了應(yīng)用程序?qū)懗鰯?shù)據(jù)的方式,即輸出流。

2)讀寫(xiě)結(jié)束

在字節(jié)流中當(dāng)讀寫(xiě)結(jié)束,達(dá)到文件結(jié)尾時(shí),稱為EOF = End或者讀到-1就讀到結(jié)尾。

3)輸入流基本方法

首先我們要清楚輸入流是什么。比如通過(guò)我們的鍵盤(pán)在文本文件上輸入內(nèi)容,這個(gè)過(guò)程鍵盤(pán)充當(dāng)?shù)木褪禽斎肓?,而不是輸出流。因?yàn)殒I盤(pán)的功能是將內(nèi)容輸入到系統(tǒng),系統(tǒng)再寫(xiě)入到文件上。以下是輸入流的基本方法read():

 int b = in.read(); //讀取一個(gè)字節(jié)無(wú)符號(hào)填充到int低八位。-1是EOF。
 in.read(byte[] buf); //讀取數(shù)據(jù)填充到字節(jié)數(shù)組buf中。返回的是讀到的字節(jié)個(gè)數(shù)。
 in.read(byte[] buf,int start, int size)//讀取數(shù)據(jù)到字節(jié)數(shù)組buf從buf的start位置開(kāi)始存放size長(zhǎng)度分?jǐn)?shù)據(jù)

其中in是InputStream抽象類的實(shí)例,可以發(fā)現(xiàn)這個(gè)方法和RandomAccessFile類中的read()方法差不多,因?yàn)閮烧叨际峭ㄟ^(guò)字節(jié)來(lái)讀取的。

4)輸出流基本方法

輸出流是進(jìn)行寫(xiě)的操作,其基本操作方法是write(),可以將此方法與輸入read()方法一 一去對(duì)應(yīng),更好理解。

out.write(int b)//寫(xiě)出一個(gè)byte到流,b的低8位
out.write(byte[] buf)//將buf字節(jié)數(shù)組都寫(xiě)到流
out.write(byte[] buf, int start,int size) //字節(jié)數(shù)組buf從start位置開(kāi)始寫(xiě)size長(zhǎng)度的字節(jié)到流

了解了InputStream、OutputStream的基本操作方法后,再來(lái)看看它們兩個(gè)的“孩子”FileInputStream和FileOutputStream。

這兩個(gè)子類具體實(shí)現(xiàn)了在文件上讀取和寫(xiě)入數(shù)據(jù)的操作,日程編程中更多的是使用這兩個(gè)類。

二、FileInputStream和FileOutputStream類的使用

-----------------FileInputStream類的使用

1.使用read()方法讀取文件

/**
  * 讀取指定文件內(nèi)容,按照16進(jìn)制輸出到控制臺(tái)
  * 并且每輸出10個(gè)byte換行
  * @throws FileNotFoundException 
  */
 public static void printHex(String fileName) throws IOException{
  //把文件作為字節(jié)流進(jìn)行讀操作
  FileInputStream in=new FileInputStream(fileName);
  int b;
  int count=0;//計(jì)數(shù)讀到的個(gè)數(shù)
  while((b=in.read())!=-1){
   if(b<=0xf){
    //單位數(shù)前面補(bǔ)0
    System.out.println("0");
   }
   System.out.print(Integer.toHexString(b& 0xff)+" ");
   if(++count%10==0){
    System.out.println();
   }
  }
  in.close();//一定要關(guān)閉流
 }

運(yùn)行結(jié)果(隨便一個(gè)文件來(lái)測(cè)試的):

注意:

FileInputStream()構(gòu)造函數(shù)可以通過(guò)文件名(String)也可以通過(guò)File對(duì)象。上面的案例是使用文件名來(lái)構(gòu)造的。

(b=in.read())!=-1 通過(guò)讀到-1來(lái)判斷是否讀到文件結(jié)尾。

in.close() 使用完IO流的對(duì)象一定要關(guān)閉流,養(yǎng)成好習(xí)慣很重要。

2.使用read(byte[] buf,int start, int size)方法讀取文件

上述方法只能一個(gè)一個(gè)字節(jié)讀取,對(duì)于較大的文件效率太低,推薦使用這個(gè)方法來(lái)一次性讀取文件。

public static void printHexByBytes(String fileName) throws IOException{
  FileInputStream in=new FileInputStream(fileName);
  byte[] buf=new byte[20*1024];//開(kāi)辟一個(gè)20k大小的字節(jié)數(shù)組
  /*
   * 從in中批量讀取字節(jié),放入到buf這個(gè)字節(jié)數(shù)組中
   * 從第0個(gè)位置開(kāi)始放,最多放buf.length個(gè)
   * 返回的是讀到的字節(jié)個(gè)數(shù)
   */
  //一次性讀完的情況
  int count=in.read(buf, 0, buf.length);
  int j=1;
  for(int i=0;i<count;i++){
   if((buf[i]&0xff)<=0xf){
    //單位數(shù)前面補(bǔ)0
    System.out.print("0");
   }
   System.out.print(Integer.toHexString(buf[i]&0xff)+ " ");
   if(j++%10==0){
    System.out.println();
   }
  }
    in.close();
 }
}

read(byte[] buf,int start, int size)返回的是讀到的字節(jié)個(gè)數(shù),即buf字節(jié)數(shù)組的有效長(zhǎng)度,所以輸出buf數(shù)組時(shí)用的長(zhǎng)度是count而不是buf.length,因?yàn)槲覀儾恢牢募笮『蛿?shù)組大小的關(guān)系,上述方法適用于文件大小不超過(guò)數(shù)組大小的情況下,一次性把文件內(nèi)容讀取到數(shù)組里,這里就有一個(gè)問(wèn)題了,如果文件大小超過(guò)數(shù)組大小,那又該如何讀取才能把文件全部讀完呢??

我們知道讀到-1就是讀到文件末,所以還是利用while循環(huán)重復(fù)讀取直到讀到-1結(jié)束循環(huán),把上述代碼修改后如下:

public static void printHexByBytes(String fileName) throws IOException{
  FileInputStream in=new FileInputStream(fileName);
  byte[] buf=new byte[20*1024];//開(kāi)辟一個(gè)20k大小的字節(jié)數(shù)組
  /*
   * 從in中批量讀取字節(jié),放入到buf這個(gè)字節(jié)數(shù)組中
   * 從第0個(gè)位置開(kāi)始放,最多放buf.length個(gè)
   * 返回的是讀到的字節(jié)個(gè)數(shù)
   */
  int j=1;
  //一個(gè)字節(jié)數(shù)組讀不完的情況,用while循環(huán)重復(fù)利用此數(shù)組直到讀到文件末=-1
  int b=0;
  while((b=in.read(buf, 0, buf.length))!=-1){
   for(int i=0;i<b;i++){
    if((buf[i]&0xff)<=0xf){
     //單位數(shù)前面補(bǔ)0
     System.out.print("0");
    }
    System.out.print(Integer.toHexString(buf[i]&0xff)+ " ");
    if(j++%10==0){
     System.out.println();
    }
   }
  }
  in.close();
 }
}

好了,我們用一個(gè)大于數(shù)組的文件來(lái)測(cè)試一下結(jié)果(太長(zhǎng),只截圖末尾):

大家可以比較兩者的不同,第二種優(yōu)化后更適合日常的使用,因?yàn)闊o(wú)論文件大小我們都可以一次性直接讀完。

-----------------FileOutputStream類的使用

FileOutputStream類和FileInputStream類的使用相類似,它實(shí)現(xiàn)了向文件中寫(xiě)出btye數(shù)據(jù)的方法。里面的一些細(xì)節(jié)跟FileInputStream差不多的我就不提了,大家自己可以理解的。

1.構(gòu)造方法

FileOutputStream類構(gòu)造時(shí)根據(jù)不同的情況可以使用不同的方法構(gòu)造,如:

//如果該文件不存在,則直接創(chuàng)建,如果存在,刪除后創(chuàng)建
  FileOutputStream out = new FileOutputStream("demo/new1.txt");//以路徑名稱構(gòu)造
//如果該文件不存在,則直接創(chuàng)建,如果存在,在文件后追加內(nèi)容
   FileOutputStream out = new FileOutputStream("demo/new1.txt",true);
更多內(nèi)容可以查詢API。

2.使用write()方法寫(xiě)入文件

write()方法和read()相似,只能操作一個(gè)字節(jié),即只能寫(xiě)入一個(gè)字節(jié)。例如:

out.wirte(‘A');//寫(xiě)出了‘A'的低八位
int a=10;//wirte只能寫(xiě)八位,那么寫(xiě)一個(gè)int需要寫(xiě)4次,每次八位
out.write(a>>>24);
out.write(a>>>16);
out.write(a>>>8);
out.wirte(a);

每次只寫(xiě)一個(gè)字節(jié),顯然是不效率的,OutputStream當(dāng)然跟InputStream一樣可以直接對(duì)byte數(shù)組操作。

3.使用write(byte[] buf,int start, int size)方法寫(xiě)入文件

意義:把byte[]數(shù)組從start位置到size位置結(jié)束長(zhǎng)度的字節(jié)寫(xiě)入到文件中。

語(yǔ)法格式和read相同,不多說(shuō)明

三、FileInputStream和FileOutputStream結(jié)合案例

了解了InputStream和OutputStream的使用方法,這次結(jié)合兩者來(lái)寫(xiě)一個(gè)復(fù)制文件的方法。

public static void copyFile(File srcFile,File destFile)throws IOException{
  if(!srcFile.exists()){
   throw new IllegalArgumentException("文件:"+srcFile+"不存在");
  }
  if(!srcFile.isFile()){
   throw new IllegalArgumentException(srcFile+"不是一個(gè)文件");
  }
  FileInputStream in =new FileInputStream(srcFile);
  FileOutputStream out =new FileOutputStream(destFile);
  
  byte[] buf=new byte[8*1024];
  int b;
  while((b=in.read(buf, 0, buf.length))!=-1){
   out.write(buf, 0, b);
   out.flush();//最好加上
  }
  in.close();
  out.close();
 }

測(cè)試文件案例:

try {
  IOUtil.copyFile(new File("C:\\Users\\acer\\workspace\\encode\\new4\\test1"), new File("C:\\Users\\acer\\workspace\\encode\\new4\\test2"));
 } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
 }

運(yùn)行結(jié)果:

復(fù)制成功!

四、DataInputStream和DataOutputStream的使用

DataInputStream、DataOutputStream 是對(duì)“流”功能的擴(kuò)展,可以更加方便地讀取int,long。字符等類型的數(shù)據(jù)。

對(duì)于DataOutputStream而言,它多了一些方法,如

writeInt()/wirteDouble()/writeUTF()

這些方法其本質(zhì)都是通過(guò)write()方法來(lái)完成的,這些方法都是經(jīng)過(guò)包裝,方便我們的使用而來(lái)的。

1.構(gòu)造方法

以DataOutputStream為例,構(gòu)造方法內(nèi)的對(duì)象是OutputStream類型的對(duì)象,我們可以通過(guò)構(gòu)造FileOutputStream對(duì)象來(lái)使用。

String file="demo/data.txt";
   DataOutputStream dos= new DataOutputStream(new FileOutputStream(file));

2.write方法使用

dos.writeInt(10);
  dos.writeInt(-10);
  dos.writeLong(10l);
  dos.writeDouble(10.0);
  //采用utf-8編碼寫(xiě)出
  dos.writeUTF("中國(guó)");
  //采用utf-16be(java編碼格式)寫(xiě)出
  dos.writeChars("中國(guó)");

3.read方法使用

以上述的寫(xiě)方法對(duì)立,看下面例子用來(lái)讀出剛剛寫(xiě)的文件

String file="demo/data.txt";
  IOUtil.printHex(file);
  DataInputStream dis=new DataInputStream(new FileInputStream(file));
  int i=dis.readInt();
  System.out.println(i);
  i=dis.readInt();
  System.out.println(i);
  long l=dis.readLong();
  System.out.println(l);
  double d=dis.readDouble();
  System.out.println(d);
  String s= dis.readUTF();
  System.out.println(s);
  dis.close();

運(yùn)行結(jié)果:

總結(jié):DataInputStream和DataOutputStream其實(shí)是對(duì)FileInputStream和FileOutputStream進(jìn)行了包裝,通過(guò)嵌套方便我們使用FileInputStream和FileOutputStream的讀寫(xiě)操作,它們還有很多其他方法,大家可以查詢API。

注意:進(jìn)行讀操作的時(shí)候如果類型不匹配會(huì)出錯(cuò)!

五、字節(jié)流的緩沖流BufferredInputStresam&BufferredOutputStresam

這兩個(gè)流類為IO提供了帶緩沖區(qū)的操作,一般打開(kāi)文件進(jìn)行寫(xiě)入或讀取操作時(shí),都會(huì)加上緩沖,這種流模式提高了IO的性能。

從應(yīng)用程序中把輸入放入文件,相當(dāng)于將一缸水倒入另一個(gè)缸中:

FileOutputStream---->write()方法相當(dāng)于一滴一滴地把水“轉(zhuǎn)移”過(guò)去

DataOutputStream---->write()XXX方法會(huì)方便一些,相當(dāng)于一瓢一瓢地把水“轉(zhuǎn)移”過(guò)去

BufferedOutputStream---->write方法更方便,相當(dāng)于一瓢一瓢水先放入一個(gè)桶中(緩沖區(qū)),再?gòu)耐爸械谷氲揭粋€(gè)缸中。提高了性能,推薦使用!

上述提到過(guò)用FileInputStream和FileOutputStream結(jié)合寫(xiě)的一個(gè)拷貝文件的案例,這次通過(guò)字節(jié)的緩沖流對(duì)上述案例進(jìn)行修改,觀察兩者的區(qū)別和優(yōu)劣。

主函數(shù)測(cè)試:

try {
  long start=System.currentTimeMillis();
  //IOUtil.copyFile(new File("C:\\Users\\acer\\Desktop\\學(xué)習(xí)路徑.docx"), new File("C:\\Users\\acer\\Desktop\\復(fù)制文本.docx"));
  long end=System.currentTimeMillis();
  System.out.println(end-start);
 } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }

(1)單字節(jié)進(jìn)行文件的拷貝,利用帶緩沖的字節(jié)流

/*
  * 單字節(jié)進(jìn)行文件的拷貝,利用帶緩沖的字節(jié)流
  */
 public static void copyFileByBuffer(File srcFile,File destFile)throws IOException{
  if(!srcFile.exists()){
   throw new IllegalArgumentException("文件:"+srcFile+"不存在");
  }
  if(!srcFile.isFile()){
   throw new IllegalArgumentException(srcFile+"不是一個(gè)文件");
  }
  BufferedInputStream bis=new BufferedInputStream(new FileInputStream(srcFile));
  BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(destFile));
  int c;
  while((c=bis.read())!=-1){
   bos.write(c);
   bos.flush();//刷新緩沖區(qū)
  }
  bis.close();
  bos.close();
 }

運(yùn)行結(jié)果(效率):

(2)單字節(jié)不帶緩沖進(jìn)行文件拷貝

/*
  * 單字節(jié)不帶緩沖進(jìn)行文件拷貝
  */
 public static void copyFileByByte(File srcFile,File destFile)throws IOException{
  if(!srcFile.exists()){
   throw new IllegalArgumentException("文件:"+srcFile+"不存在");
  }
  if(!srcFile.isFile()){
   throw new IllegalArgumentException(srcFile+"不是一個(gè)文件");
  }
  FileInputStream in=new FileInputStream(srcFile);
  FileOutputStream out=new FileOutputStream(destFile);
  int c;
  while((c=in.read())!=-1){
   out.write(c);
   out.flush();//不帶緩沖,可加可不加
  }
  in.close();
  out.close();
 }

運(yùn)行結(jié)果(效率):

(3)批量字節(jié)進(jìn)行文件的拷貝,不帶緩沖的字節(jié)流(就是上面第三點(diǎn)最初的案例的代碼)

/*
  * 字節(jié)批量拷貝文件,不帶緩沖
  */
 public static void copyFile(File srcFile,File destFile)throws IOException{
  if(!srcFile.exists()){
   throw new IllegalArgumentException("文件:"+srcFile+"不存在");
  }
  if(!srcFile.isFile()){
   throw new IllegalArgumentException(srcFile+"不是一個(gè)文件");
  }
  FileInputStream in =new FileInputStream(srcFile);
  FileOutputStream out =new FileOutputStream(destFile);
  
  byte[] buf=new byte[8*1024];
  int b;
  while((b=in.read(buf, 0, buf.length))!=-1){
   out.write(buf, 0, b);
   out.flush();//最好加上
  }
  in.close();
  out.close();
 }

運(yùn)行結(jié)果(效率):

(4)批量字節(jié)進(jìn)行文件的拷貝,帶緩沖的字節(jié)流(效率最高,推薦使用?。。?/p>

/*
  * 多字節(jié)進(jìn)行文件的拷貝,利用帶緩沖的字節(jié)流
  */
 public static void copyFileByBuffers(File srcFile,File destFile)throws IOException{
  if(!srcFile.exists()){
   throw new IllegalArgumentException("文件:"+srcFile+"不存在");
  }
  if(!srcFile.isFile()){
   throw new IllegalArgumentException(srcFile+"不是一個(gè)文件");
  }
  BufferedInputStream bis=new BufferedInputStream(new FileInputStream(srcFile));
  BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(destFile));
  byte[] buf=new byte[20*1024];
  int c;
  while((c=bis.read(buf, 0, buf.length))!=-1){
   bos.write(buf, 0, c);
   bos.flush();//刷新緩沖區(qū)
  }
  bis.close();
  bos.close();
 }

運(yùn)行結(jié)果(效率):

注意:

批量讀取或?qū)懭胱止?jié),帶字節(jié)緩沖流的效率最高,推薦使用此方法。

當(dāng)使用字節(jié)緩沖流時(shí),寫(xiě)入操作完畢后必須刷新緩沖區(qū),flush()。

不使用字節(jié)緩沖流時(shí),flush()可以不加,但是最好加上去。

六、字符流

首先我們需要了解以下概念。

1)需要了解編碼問(wèn)題---->轉(zhuǎn)移至《計(jì)算機(jī)中的編碼問(wèn)題》

2)認(rèn)識(shí)文本和文本文件

java的文本(char)是16位無(wú)符號(hào)整數(shù),是字符的unicode編碼(雙字節(jié)編碼)

文件是byte byte byte...的數(shù)據(jù)序列

文本文件是文本(char)序列按照某種編碼方案(utf-8,utf-16be,gbk)序列化byte的存儲(chǔ)

3)字符流(Reader Writer)

字符的處理,一次處理一個(gè)字符;

字符的底層依然是基本的字節(jié)序列;

4)字符流的基本實(shí)現(xiàn)

InputStreamReader:完成byte流解析成char流,按照編碼解析。

OutputStreamWriter:提供char流到byte流,按照編碼處理。

-------------------------Reader和Writer的基本使用-------------------------------

String file1="C:\\Users\\acer\\workspace\\encode\\new4\\test1";
  String file2="C:\\Users\\acer\\workspace\\encode\\new4\\test2";
  InputStreamReader isr=new InputStreamReader(new FileInputStream(file1));
  OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream(file2));
//  int c;
//  while((c=isr.read())!=-1){
//   System.out.print((char)c);
//  }
  char[] buffer=new char[8*1024];
  int c;
  //批量讀取,放入buffer這個(gè)字符數(shù)組,從第0個(gè)位置到數(shù)組長(zhǎng)度
  //返回的是讀到的字符個(gè)數(shù)
  while((c=isr.read(buffer,0,buffer.length))!=-1){
   String s=new String(buffer,0,c);//將char類型數(shù)組轉(zhuǎn)化為String字符串
   System.out.println(s);
   osw.write(buffer,0,c);
   osw.flush();
   //osw.write(s);
   //osw.flush();
  }
  isr.close();
  osw.close();

注意:

字符流操作的是文本文件,不能操作其他類型的文件?。?/p>

默認(rèn)按照GBK編碼來(lái)解析(項(xiàng)目默認(rèn)編碼),操作文本文件的時(shí)候,要寫(xiě)文件本身的編碼格式(在構(gòu)造函數(shù)時(shí)在后面加上編碼格式)??!

字符流和字節(jié)流的區(qū)別主要是操作的對(duì)象不同,還有字符流是以字符為單位來(lái)讀取和寫(xiě)入文件的,而字節(jié)流是以字節(jié)或者字節(jié)數(shù)組來(lái)進(jìn)行操作的??!

在使用字符流的時(shí)候要額外注意文件的編碼格式,一不小心就會(huì)造成亂碼!

七、字符流的文件讀寫(xiě)流FileWriter和FileReader

跟字節(jié)流的FileInputStream和FileOutputStream類相類似,字符流也有相應(yīng)的文件讀寫(xiě)流FileWriter和FileReader類,這兩個(gè)類主要是對(duì)文本文件進(jìn)行讀寫(xiě)操作。

FileReader/FileWriter:可以直接寫(xiě)文件名的路徑。

與InputStreamReader相比壞處:無(wú)法指定讀取和寫(xiě)出的編碼,容易出現(xiàn)亂碼。

 FileReader fr = new FileReader("C:\\Users\\acer\\workspace\\encode\\new4\\test1"); //輸入流
 FileWriter fw = new FileWriter(C:\\Users\\acer\\workspace\\encode\\new4\\test2");//輸出流
char[] buffer=new char[8*1024];
  int c;
  while((c=fr.read(buffer, 0, buffer.length))!=-1){
   fw.write(buffer, 0, c);
   fw.flush();
  }
  fr.close();
  fw.close();

注意:FileReader和FileWriter不能增加編碼參數(shù),所以當(dāng)項(xiàng)目和讀取文件編碼不同時(shí),就會(huì)產(chǎn)生亂碼。 這種情況下,只能回歸InputStreamReader和OutputStreamWriter。

八、字符流的過(guò)濾器BufferedReader&BufferedWriter

字符流的過(guò)濾器有BufferedReader和BufferedWriter/PrintWriter

除了基本的讀寫(xiě)功能外,它們還有一些特殊的功能。

BufferedReader----->readLine 一次讀一行,并不識(shí)別換行
BufferedWriter----->write 一次寫(xiě)一行,需要換行
PrintWriter經(jīng)常和BufferedReader一起使用,換行寫(xiě)入比BufferedWriter更方便

定義方式:

BufferedReader br =new BufferedReader(new InputStreamReader(new FileInputStream(目錄的地址)))
BufferedWriter br =new BufferedWriter(new InputStreamWriter(new FileOutputStream(目錄的地址)))
PrintWriter pw=new PrintWriter(目錄/Writer/OutputStream/File);

使用方法:

//對(duì)文件進(jìn)行讀寫(xiě)操作
  String file1="C:\\Users\\acer\\workspace\\encode\\new4\\test1";
  String file2="C:\\Users\\acer\\workspace\\encode\\new4\\test2";
  BufferedReader br = new BufferedReader(new InputStreamReader(
    new FileInputStream(file1)));
  BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(
    new FileOutputStream(file2)));
String line;
  while((line=br.readLine())!=null){
   System.out.println(line);//一次讀一行,并不能識(shí)別換行
   bw.write(line);
   //單獨(dú)寫(xiě)出換行操作
   bw.newLine();
   bw.flush();
}
    br.close();
  bw.close();
}

在這里我們可以使用PrintWriter來(lái)代替BufferedWriter做寫(xiě)操作,PrintWriter相比BufferedWriter有很多優(yōu)勢(shì):

構(gòu)造函數(shù)方便簡(jiǎn)潔,使用靈活

構(gòu)造時(shí)可以選擇是否自動(dòng)flush

利用println()方法可以實(shí)現(xiàn)自動(dòng)換行,搭配BufferedReader使用更方便

使用方法:

String file1="C:\\Users\\acer\\workspace\\encode\\new4\\test1";
  String file2="C:\\Users\\acer\\workspace\\encode\\new4\\test2";
  BufferedReader br = new BufferedReader(new InputStreamReader(
    new FileInputStream(file1)));
PrintWriter pw=new PrintWriter(file2);
//PrintWriter pw=new PrintWriter(outputStream, autoFlush);//可以指定是否自動(dòng)flush
String line;
  while((line=br.readLine())!=null){
   System.out.println(line);//一次讀一行,并不能識(shí)別換行
   pw.println(line);//自動(dòng)換行
   pw.flush();//指定自動(dòng)flush后不需要寫(xiě)
  }
  br.close();
  pw.close();
}

注意:

可以使用BufferedReader的readLine()方法一次讀入一行,為字符串形式,用null判斷是否讀到結(jié)尾。

使用BufferedWriter的write()方法寫(xiě)入文件,每次寫(xiě)入后需要調(diào)用flush()方法清空緩沖區(qū);PrintWriter在構(gòu)造時(shí)可以指定自動(dòng)flush,不需要再調(diào)用flush方法。

在寫(xiě)入時(shí)需要注意寫(xiě)入的數(shù)據(jù)中會(huì)丟失換行,可以在每次寫(xiě)入后調(diào)用BufferedReader的newLine()方法或改用PrintWriter的println()方法補(bǔ)充換行。

通常將PrintWriter配合BufferedWriter使用。(PrintWriter的構(gòu)造方法,及使用方式更為簡(jiǎn)單)。

以上這篇【Java IO流】字節(jié)流和字符流的實(shí)例講解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • MybatisPlus中@TableField注解的使用詳解

    MybatisPlus中@TableField注解的使用詳解

    這篇文章主要介紹了MybatisPlus中@TableField注解的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java 自定義Spring框架與Spring IoC相關(guān)接口分析

    Java 自定義Spring框架與Spring IoC相關(guān)接口分析

    Spring框架是由于軟件開(kāi)發(fā)的復(fù)雜性而創(chuàng)建的。Spring使用的是基本的JavaBean來(lái)完成以前只可能由EJB完成的事情。然而,Spring的用途不僅僅限于服務(wù)器端的開(kāi)發(fā)
    2021-10-10
  • SpringBoot集成quartz實(shí)現(xiàn)定時(shí)任務(wù)詳解

    SpringBoot集成quartz實(shí)現(xiàn)定時(shí)任務(wù)詳解

    最為常用定時(shí)任務(wù)框架是Quartz,并且Spring也集成了Quartz的框架,Quartz不僅支持單實(shí)例方式還支持分布式方式。本文主要介紹Quartz,基礎(chǔ)的Quartz的集成案例本,以及實(shí)現(xiàn)基于數(shù)據(jù)庫(kù)的分布式任務(wù)管理和控制job生命周期
    2022-08-08
  • Java Annotation Overview詳解

    Java Annotation Overview詳解

    這篇文章主要介紹了Java Annotation Overview,需要的朋友可以參考下
    2014-02-02
  • java整數(shù)與byte數(shù)組的轉(zhuǎn)換實(shí)現(xiàn)代碼

    java整數(shù)與byte數(shù)組的轉(zhuǎn)換實(shí)現(xiàn)代碼

    這篇文章主要介紹了java整數(shù)與byte數(shù)組的轉(zhuǎn)換實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • SpringBoot使用外部yml文件的兩種方法

    SpringBoot使用外部yml文件的兩種方法

    這篇文章主要介紹在springboot中如何使用依賴jar包中的yml文件,文中給出了兩種實(shí)現(xiàn)方法,并通過(guò)代碼和圖片講解的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • 深入分析JAVA流程控制語(yǔ)句

    深入分析JAVA流程控制語(yǔ)句

    這篇文章主要介紹了JAVA流程控制語(yǔ)句的的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • java計(jì)算兩個(gè)日期之前的天數(shù)實(shí)例(排除節(jié)假日和周末)

    java計(jì)算兩個(gè)日期之前的天數(shù)實(shí)例(排除節(jié)假日和周末)

    下面小編就為大家?guī)?lái)一篇java計(jì)算兩個(gè)日期之前的天數(shù)實(shí)例(排除節(jié)假日和周末)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • Java如何檢測(cè)當(dāng)前CPU負(fù)載狀態(tài)

    Java如何檢測(cè)當(dāng)前CPU負(fù)載狀態(tài)

    在Java中,直接檢測(cè)CPU負(fù)載狀態(tài)并不像在操作系統(tǒng)命令行中那樣簡(jiǎn)單,因?yàn)镴ava標(biāo)準(zhǔn)庫(kù)并沒(méi)有直接提供這樣的功能,這篇文章主要介紹了java檢測(cè)當(dāng)前CPU負(fù)載狀態(tài)的方法,需要的朋友可以參考下
    2024-06-06
  • SpringCloud Config連接git與數(shù)據(jù)庫(kù)流程分析講解

    SpringCloud Config連接git與數(shù)據(jù)庫(kù)流程分析講解

    springcloud config是一個(gè)解決分布式系統(tǒng)的配置管理方案。它包含了 client和server兩個(gè)部分,server端提供配置文件的存儲(chǔ)、以接口的形式將配置文件的內(nèi)容提供出去,client端通過(guò)接口獲取數(shù)據(jù)、并依據(jù)此數(shù)據(jù)初始化自己的應(yīng)用
    2022-12-12

最新評(píng)論