字節流與字符流

流的概念:

在程序中全部的數據都是以流的形式進行傳輸和保存的,程序須要數據的時候要使用輸入流讀取數據,而當程序須要將數據保存起來的時候,就要使用輸出流完成。

字節流與字符流

在Java.io中操做文件內容的主要有兩大類:字符流和字節流,兩類都分爲輸入和輸出操做。
字節流:
輸出-------OutputStream
輸入-------InputStream
字符流:
輸出-------Writer
輸入-------Reader

操做流程-----以文件操做爲例

1.使用File類打開一個文件
2.經過字節流或字符流的子類,指定輸出的位置(由於其父類爲抽象類)
3.進行讀/寫操做
4.關閉輸入/輸出
注意:
io操做屬於資源操做,在操做結束後必須關閉。
 

字節流的使用概述

字節流主要操做的是byte類型數據,以byte數組爲準,主要操做類就是:
字節流:
輸出流-------OutputStream
輸入流-------InputStream

寫文件:

import java.io.File ;
import java.io.OutputStream ;
import java.io.FileOutputStream ;
public class OutputStreamDemo01{
   public static void main(String args[]) throws Exception{   // 異常拋出,不處理
     // 第1步、使用File類找到一個文件
    File f= new File( "d:" + File.separator + "test.txt") ;   // 聲明File對象
     // 第2步、經過子類實例化父類對象
    OutputStream out = null ;   // 準備好一個輸出的對象
    out = new FileOutputStream(f)    ;   // 經過對象多態性,進行實例化
     // 第3步、進行寫操做
    String str = "Hello World!!!" ;     // 準備一個字符串
     byte b[] = str.getBytes() ;      // 只能輸出byte數組,因此將字符串變爲byte數組
    out.write(b) ;             // 將內容輸出,保存文件
     // 第4步、關閉輸出流
    out.close() ;             // 關閉輸出流
  }
};
import java.io.File ;
import java.io.OutputStream ;
import java.io.FileOutputStream ;
public class OutputStreamDemo02{
   public static void main(String args[]) throws Exception{   // 異常拋出,不處理
     // 第1步、使用File類找到一個文件
    File f= new File( "d:" + File.separator + "test.txt") ;   // 聲明File對象
     // 第2步、經過子類實例化父類對象
    OutputStream out = null ;   // 準備好一個輸出的對象
    out = new FileOutputStream(f)    ;   // 經過對象多態性,進行實例化
     // 第3步、進行寫操做
    String str = "Hello World!!!" ;     // 準備一個字符串
     byte b[] = str.getBytes() ;       // 只能輸出byte數組,因此將字符串變爲byte數組
     for( int i=0;i<b.length;i++){     // 採用循環方式寫入
       out.write(b[i]) ;  // 每次只寫入一個內容
    }
     // 第4步、關閉輸出流
    out.close() ;             // 關閉輸出流
  }
};
import java.io.File ;
import java.io.OutputStream ;
import java.io.FileOutputStream ;
public class OutputStreamDemo03{
   public static void main(String args[]) throws Exception{   // 異常拋出,不處理
     // 第1步、使用File類找到一個文件
    File f= new File( "d:" + File.separator + "test.txt") ;   // 聲明File對象
     // 第2步、經過子類實例化父類對象
    OutputStream out = null ;   // 準備好一個輸出的對象
     out = new FileOutputStream(f,true)    ;  // 此處表示在文件末尾追加內容
     // 第3步、進行寫操做
    String str = "Hello World!!!" ;     // 準備一個字符串
     byte b[] = str.getBytes() ;       // 只能輸出byte數組,因此將字符串變爲byte數組
     for( int i=0;i<b.length;i++){     // 採用循環方式寫入
      out.write(b[i]) ;   // 每次只寫入一個內容
    }
     // 第4步、關閉輸出流
    out.close() ;             // 關閉輸出流
  }
};
import java.io.File ;
import java.io.OutputStream ;
import java.io.FileOutputStream ;
public class OutputStreamDemo04{
   public static void main(String args[]) throws Exception{   // 異常拋出,不處理
     // 第1步、使用File類找到一個文件
    File f= new File( "d:" + File.separator + "test.txt") ;   // 聲明File對象
     // 第2步、經過子類實例化父類對象
    OutputStream out = null ;   // 準備好一個輸出的對象
    out = new FileOutputStream(f, true)    ;   // 此處表示在文件末尾追加內容
     // 第3步、進行寫操做
     String str = "\r\nHello World!!!" ;    // 準備一個字符串 \r\n--表示換行
     byte b[] = str.getBytes() ;       // 只能輸出byte數組,因此將字符串變爲byte數組
     for( int i=0;i<b.length;i++){     // 採用循環方式寫入
      out.write(b[i]) ;   // 每次只寫入一個內容
    }
     // 第4步、關閉輸出流
    out.close() ;             // 關閉輸出流
  }
};
 

讀文件:
import java.io.File ;
import java.io.InputStream ;
import java.io.FileInputStream ;
public class InputStreamDemo03{
   public static void main(String args[]) throws Exception{   // 異常拋出,不處理
     // 第1步、使用File類找到一個文件
    File f= new File( "d:" + File.separator + "test.txt") ;   // 聲明File對象
     // 第2步、經過子類實例化父類對象
    InputStream input = null ;   // 準備好一個輸入的對象
    input = new FileInputStream(f)    ;   // 經過對象多態性,進行實例化
     // 第3步、進行讀操做
     byte b[] = new byte[(int)f.length()] ;    // 數組大小由文件決定
     int len = input.read(b) ;     // 讀取內容
     // 第4步、關閉輸出流
    input.close() ;             // 關閉輸出流\
    System.out.println( "讀入數據的長度:" + len) ;
    System.out.println( "內容爲:" + new String(b)) ;   // 把byte數組變爲字符串輸出
  }
};

以上使用的是byte讀取數據,以下使用read()方法,看代碼
import java.io.File ;
import java.io.InputStream ;
import java.io.FileInputStream ;
public class InputStreamDemo04{
   public static void main(String args[]) throws Exception{   // 異常拋出,不處理
     // 第1步、使用File類找到一個文件
    File f= new File( "d:" + File.separator + "test.txt") ;   // 聲明File對象
     // 第2步、經過子類實例化父類對象
    InputStream input = null ;   // 準備好一個輸入的對象
    input = new FileInputStream(f)    ;   // 經過對象多態性,進行實例化
     // 第3步、進行讀操做
     byte b[] = new byte[( int)f.length()] ;     // 數組大小由文件決定
     for( int i=0;i<b.length;i++){
       b[i] = (byte)input.read() ;    // 讀取內容
    }
     // 第4步、關閉輸出流
    input.close() ;             // 關閉輸出流\
    System.out.println( "內容爲:" + new String(b)) ;   // 把byte數組變爲字符串輸出
  }
};
在不是數據長度的狀況下,要使用一下方法讀取數據
import java.io.File ;
import java.io.InputStream ;
import java.io.FileInputStream ;
public class InputStreamDemo05{
   public static void main(String args[]) throws Exception{   // 異常拋出,不處理
     // 第1步、使用File類找到一個文件
    File f= new File( "d:" + File.separator + "test.txt") ;   // 聲明File對象
     // 第2步、經過子類實例化父類對象
    InputStream input = null ;   // 準備好一個輸入的對象
    input = new FileInputStream(f)    ;   // 經過對象多態性,進行實例化
     // 第3步、進行讀操做
     byte b[] = new byte[1024] ;     // 數組大小由文件決定
     int len = 0 ;    
     int temp = 0 ;       // 接收每個讀取進來的數據
     while((temp=input.read())!=-1){
      // 表示還有內容,文件沒有讀完
      b[len] = (byte)temp ;
      len++ ;
    }
     // 第4步、關閉輸出流
    input.close() ;             // 關閉輸出流\
    System.out.println( "內容爲:" + new String(b,0,len)) ;   // 把byte數組變爲字符串輸出
  }
};

字符流的使用概述

在程序中一個字符等於兩個字節,Java提供了Writer和Reader兩個專門操做字符流的類。
字符輸出流:Writer
字符輸入流:Reader

字符輸出流

 
import java.io.File ;
import java.io.Writer ;
import java.io.FileWriter ;
public class WriterDemo01{
   public static void main(String args[]) throws Exception{   // 異常拋出,不處理
     // 第1步、使用File類找到一個文件
    File f= new File( "d:" + File.separator + "test.txt") ;   // 聲明File對象
     // 第2步、經過子類實例化父類對象
     Writer out = null ;  // 準備好一個輸出的對象
    out = new FileWriter(f)    ;  // 經過對象多態性,進行實例化
    // 第3步、進行寫操做
    String str = "Hello World!!!" ;    // 準備一個字符串
    out.write(str) ;            // 將內容輸出,保存文件
     // 第4步、關閉輸出流
    out.close() ;             // 關閉輸出流
  }
};
 

字符輸入流

 
 
import java.io.File ;
import java.io.Reader ;
import java.io.FileReader ;
public class ReaderDemo01{
   public static void main(String args[]) throws Exception{   // 異常拋出,不處理
     // 第1步、使用File類找到一個文件
    File f= new File( "d:" + File.separator + "test.txt") ;   // 聲明File對象
     // 第2步、經過子類實例化父類對象
    Reader input = null ;   // 準備好一個輸入的對象
    input = new FileReader(f)    ;   // 經過對象多態性,進行實例化
     // 第3步、進行讀操做
     char c[] = new char[1024] ;     // 全部的內容都讀到此數組之中
     int len = input.read(c) ;     // 讀取內容
     // 第4步、關閉輸出流
    input.close() ;             // 關閉輸出流
    System.out.println( "內容爲:" + new String(c,0,len)) ;   // 把字符數組變爲字符串輸出
  }
};
import java.io.File ;
import java.io.Reader ;
import java.io.FileReader ;
public class ReaderDemo02{
   public static void main(String args[]) throws Exception{   // 異常拋出,不處理
     // 第1步、使用File類找到一個文件
    File f= new File( "d:" + File.separator + "test.txt") ;   // 聲明File對象
     // 第2步、經過子類實例化父類對象
    Reader input = null ;   // 準備好一個輸入的對象
    input = new FileReader(f)    ;   // 經過對象多態性,進行實例化
     // 第3步、進行讀操做
     char c[] = new char[1024] ;     // 全部的內容都讀到此數組之中
     int temp = 0 ;   // 接收每個內容
     int len = 0 ;     // 讀取內容
     while((temp=input.read())!=-1){
       // 若是不是-1就表示還有內容,能夠繼續讀取
      c[len] = ( char)temp ;
      len++ ;
    }
     // 第4步、關閉輸出流
    input.close() ;             // 關閉輸出流
    System.out.println( "內容爲:" + new String(c,0,len)) ;   // 把字符數組變爲字符串輸出
  }
};
 

字符流與字節流的區別

字節流在操做的時候,自己是不會用到緩存區的,是與文件自己直接操做( 驗證方法就是將close()省略試試看效果如何),而字符流在操做的時候會用到緩存區,即會使用內存。

在開發中使用字符流和字節流哪一個好?

在全部的硬盤上保存文件或是進行數據傳輸的時候,都是以字節的方式進行的,包括圖片也是用字節完成,而字符是隻有在內存中才會產生的,全部使用字節的時候是最多的。
相關文章
相關標籤/搜索