1. 程式人生 > >Java IO流——位元組流

Java IO流——位元組流

1.InputStream、OutputStream

InputStream抽象了應用程式讀取資料的方式
OutputStream抽象了應用程式寫出資料的方式 

2.EOF = End 讀到-1就讀到結尾

3.輸入流基本方法

int  b = in.read();  //讀取一個位元組無符號填充到int低八位.-1是 EOF
in.read(byte[] buf) 
in.read(byte[] buf,int start,int size)

4.輸出流基本方法

out.write(int b);  //寫出一個byte到流,b的低8位
out.write(byte[] buf);  //將buf位元組陣列都寫入到流
out.write(byte[] buf,int start,int size)

5.FileInputStream—>具體實現了在檔案上讀取資料

6.FileOutputStream 實現了向檔案中寫出byte資料的方法

7.DataOutputStream/DataInputStream

對"流"功能的擴充套件,可以更加方面的讀取int,long,字元等型別資料
DataOutputStream
writeInt()/writeDouble()/writeUTF()

8.BufferedInputStream&BufferedOutputStream

這兩個流類位IO提供了帶緩衝區的操作,一般開啟檔案進行寫入
或讀取操作時,都會加上緩衝,這種流模式提高了IO的效能
從應用程式中把輸入放入檔案,相當於將一缸水倒入到另一個缸中:
FileOutputStream--->write()方法相當於一滴一滴地把水“轉移”過
DataOutputStream-->writeXxx()方法會方便一些,相當於一瓢一瓢把水“轉移”過去
BufferedOutputStream--->write方法更方便,相當於一瓢一瓢先放入桶中,再從桶中倒入到另一個缸中,效能提高了
package com.sample.io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class IOUtil {
    /**
     * 讀取指定檔案內容,按照16進位制輸出到控制檯
     * 並且每輸出10個byte換行
     * @param
fileName * 單位元組讀取不適合大檔案,大檔案效率很低 */
public static void printHex(String fileName)throws IOException{ //把檔案作為位元組流進行讀操作 FileInputStream in = new FileInputStream(fileName); int b ; int i = 1; while((b = in.read())!=-1){ if(b <= 0xf){ //單位數前面補0 System.out.print("0"); } System.out.print(Integer.toHexString(b)+" "); //每10個換行 if(i++%10==0){ System.out.println(); } } in.close(); } /** * 批量讀取,對大檔案而言效率高,也是我們最常用的讀檔案的方式 * @param fileName * @throws IOException */ public static void printHexByByteArray(String fileName)throws IOException{ FileInputStream in = new FileInputStream(fileName); byte[] buf = new byte[8 * 1024]; /*從in中批量讀取位元組,放入到buf這個位元組陣列中, * 從第0個位置開始放,最多放buf.length個 * 返回的是讀到的位元組的個數 */ /* int bytes = in.read(buf,0,buf.length);//一次性讀完,說明位元組陣列足夠大 int j = 1; for(int i = 0; i < bytes;i++){ //通過&0xff 將高24位清零 System.out.print(Integer.toHexString(buf[i] & 0xff)+" "); //每10個換行 if(j++%10==0){ System.out.println(); } }*/ int bytes = 0; int j = 1; while((bytes = in.read(buf,0,buf.length))!=-1){ for(int i = 0 ; i < bytes;i++){ System.out.print(Integer.toHexString(buf[i] & 0xff)+" "); if(j++%10==0){ System.out.println(); } } } in.close(); } /** * 檔案拷貝,位元組批量讀取 * @param srcFile * @param destFile * @throws IOException */ public static void copyFile(File srcFile,File destFile)throws IOException{ if(!srcFile.exists()){ throw new IllegalArgumentException("檔案:"+srcFile+"不存在"); } if(!srcFile.isFile()){ throw new IllegalArgumentException(srcFile+"不是檔案"); } 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(); } /** * 進行檔案的拷貝,利用帶緩衝的位元組流 * @param srcFile * @param destFile * @throws IOException */ public static void copyFileByBuffer(File srcFile,File destFile)throws IOException{ if(!srcFile.exists()){ throw new IllegalArgumentException("檔案:"+srcFile+"不存在"); } if(!srcFile.isFile()){ throw new IllegalArgumentException(srcFile+"不是檔案"); } 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();//重新整理緩衝區 } bis.close(); bos.close(); } /** * 單位元組,不帶緩衝進行檔案拷貝 * @param srcFile * @param destFile * @throws IOException */ public static void copyFileByByte(File srcFile,File destFile)throws IOException{ if(!srcFile.exists()){ throw new IllegalArgumentException("檔案:"+srcFile+"不存在"); } if(!srcFile.isFile()){ throw new IllegalArgumentException(srcFile+"不是檔案"); } 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(); } }

DataOutputStream/DataInputStream的使用

package com.sample.io;

import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class DosDemo {
    public static void main(String[] args) throws IOException {
        String file = "demo/dos.dat";
        DataOutputStream dos = new DataOutputStream(
                         new FileOutputStream(file));
        dos.writeInt(10);
        dos.writeInt(-10);
        dos.writeLong(10l);
        dos.writeDouble(10.5);
        //採用utf-8編碼寫出
        dos.writeUTF("中國");
        //採用utf-16be編碼寫出
        dos.writeChars("中國");
        dos.close();
        IOUtil.printHex(file);
    }
}

package com.sample.io;

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;


public class DisDemo {

    /**
     * 把上面寫的內容讀出來
     */
    public static void main(String[] args) throws IOException{
       String file = "demo/dos.dat";
       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();
    }

}