1. 程式人生 > 程式設計 >Java使用I/O流讀取檔案內容的方法詳解

Java使用I/O流讀取檔案內容的方法詳解

本文例項講述了Java使用I/O流讀取檔案內容的方法。分享給大家供大家參考,具體如下:

要利用I/O流讀取檔案內容,首先要掌握InputStream的體系結構。

這個體系中FileInputStream和BufferedInputStream是一定要掌握的,因為使用的頻率比較高。

InputStream的方法:InputStream位於java.io包下

OutputStream的方法:

讀取檔案(程式碼):

package com.jredu.oopch11;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
/**
 * I/O流的概念:資料流向某個物件的資料序列,並且到達這個物件的過程。
 * 輸入流:資料來源資料流向計算機記憶體的過程
 * 輸出流:把資料從程式流向目標資料來源的過程
 * @author Administrator
 *
 */
public class Ch01 {
    /**
     * 讀取檔案內容
     * @param args
     */
    public static void main(String[] args) {
        //InputStream:是一個抽象類
        // \:是一個 轉移符
        //表示磁碟路徑的兩種表示方式:1、\\  2、/
        try {
            //從檔案地址中讀取內容到程式中
            //1、建立連線
            InputStream is = new FileInputStream("E:/iodemo/ch01.txt");
            //2、開始讀取資訊
            /*
            //方法1:一次只讀一個
            System.out.println(is.read());//讀取的是位元組型的:49
            System.out.println((byte)is.read());//50
      */    
            //方法2:定義陣列,迴圈讀取
            //先定義一個位元組陣列存放資料
            byte[] b = new byte[5];//把所有的資料讀取到這個位元組當中
            //宣告一個int儲存每次讀取到的資料
            int i = 0;
            //定義一個記錄索引的變數
            int index = 0;
            //迴圈讀取每個資料
            while((i=is.read())!=-1){//把讀取的資料放到i中
                b[index]=(byte) i;
                index++;
            }
            //把位元組陣列轉成字串
            System.out.println(new String(b));
            //關閉流
            is.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            //系統強制解決的問題:檔案沒有找到
            e.printStackTrace();
        } catch (IOException e) {
            //檔案讀寫異常
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

package com.jredu.oopch11;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
/**
 * I/O流的概念:資料流向某個物件的資料序列,並且到達這個物件的過程。
 * 輸入流:資料來源資料流向計算機記憶體的過程
 * 輸出流:把資料從程式流向目標資料來源的過程
 * @author Administrator
 *
 */
public class Ch02 {
    /**
     * 讀取檔案內容
     * @param args
     */
    public static void main(String[] args) {
        //InputStream:是一個抽象類
        // \:是一個 轉移符
        //表示磁碟路徑的兩種表示方式:1、\\  2、/
        try {
            //從檔案地址中讀取內容到程式中
            //1、建立連線
            InputStream is = new FileInputStream("E:/iodemo/ch01.txt");
            //2、開始讀取資訊    
            //先定義一個位元組陣列存放資料
            byte[] b = new byte[5];//把所有的資料讀取到這個位元組當中
            //完整的讀取一個檔案
            is.read(b);
            //read:返回的是讀取的檔案大小
            //最大不超過b.length,返回實際讀取的位元組個數
            System.out.println(Arrays.toString(b));//讀取的是位元組陣列
            //把位元組陣列轉成字串
            System.out.println(new String(b));
            //關閉流
            is.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            //系統強制解決的問題:檔案沒有找到
            e.printStackTrace();
        } catch (IOException e) {
            //檔案讀寫異常
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

package com.jredu.oopch11;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
/**
 * I/O流的概念:資料流向某個物件的資料序列,並且到達這個物件的過程。
 * 輸入流:資料來源資料流向計算機記憶體的過程
 * 輸出流:把資料從程式流向目標資料來源的過程
 * @author Administrator
 *
 */
public class Ch03 {
    /**
     * 讀取檔案內容
     * @param args
     */
    public static void main(String[] args) {
        //InputStream:是一個抽象類
        // \:是一個 轉移符
        //表示磁碟路徑的兩種表示方式:1、\\  2、/
        try {
            //從檔案地址中讀取內容到程式中
            //1、建立連線
            InputStream is = new FileInputStream("E:/iodemo/ch01.txt");
            //2、開始讀取資訊    
            //先定義一個位元組陣列存放資料
            byte[] b = new byte[is.available()];//把所有的資料讀取到這個位元組當中
            //is.available():返回檔案的大小
    //        while(is.available()==0);//不等於0時才停止迴圈
            //完整的讀取一個檔案
            int off = 0;
            int le = 2;
            while(is.read(b,off,2)!=-1){
                off+=1;
            }
            is.read(b,2);
            //read:返回的是讀取的檔案大小
            //最大不超過b.length,返回實際讀取的位元組個數
            System.out.println(Arrays.toString(b));//讀取的是位元組陣列
            //把位元組陣列轉成字串
            System.out.println(new String(b));
            //關閉流
            is.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            //系統強制解決的問題:檔案沒有找到
            e.printStackTrace();
        } catch (IOException e) {
            //檔案讀寫異常
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

package com.jredu.oopch11;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
public class Ch04 {
    /**
     * 讀取中文字元的檔案
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            /*FileInputStream fis = new FileInputStream("E:/iodemo/ch04.txt");
            //包裝流
            BufferedInputStream bis = new BufferedInputStream(fis);*/
            //包裝流
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:/iodemo/ch04.txt"));
            //讀取檔案內容
            byte[] b = new byte[bis.available()];
            bis.read(b);
            /*char[] c = new char[b.length];
            for (int i = 0; i < c.length; i++) {
                c[i]=(char) b[i];
            }
            System.out.println(Arrays.toString(c));//亂碼
             */        
            System.out.println(Arrays.toString(b));//得到的是位元組
            //String(byte[])把位元組陣列轉成字串
            System.out.println(new String(b));//可以得到中文
            bis.close();//關閉流(關閉bis就可以了)
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

package com.jredu.oopch11;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Ch05 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            //讀取檔案
            FileInputStream fis = new FileInputStream("E:/iodemo/ch01.txt");
            //fis.available():檔案的長度
            byte[] b=new byte[fis.available()];
            //skip:跳過n個位元組後再開始讀取
            fis.skip(5);//跳過前5個
            fis.read(b);
            System.out.println(new String(b));
            fis.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

package com.jredu.oopch11;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Ch06 {
    /**
     * 讀取過程暫停,給當前做一個標記,下一次從標記位置開始讀取
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //讀取過程中暫停
        //給當前做一個標記
        //下一次從標記位置開始讀取
        try {
            BufferedInputStream bis= new BufferedInputStream(new FileInputStream("E:/iodemo/ch06.txt"));
            byte[] b = new byte[bis.available()];
        //    bis.read(b,b.length/2);
            //設定斷點
            bis.mark(bis.read(b,b.length/2));//位置就是讀取的長度
            System.out.println(new String(b));
            System.out.println("暫停讀取....");
            Thread.sleep(2000);//休眠2s
            //休眠後繼續讀
            System.out.println("繼續讀取...");
            //reset:將當前復位的位置設定成上次呼叫mark標記的位置
            bis.reset();
            bis.read(b);
            System.out.println(new String(b));
            bis.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

package com.jredu.oopch11;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.SequenceInputStream;
/**
 * 序列流(集合流)
 * 把n個流合併在一起讀取
 * @author Administrator
 *
 */
public class Ch07 {
    public static void main(String[] args) {
        try {
            //第一個檔案流
            FileInputStream fis1=new FileInputStream("E:/iodemo/ch01.txt");
            //第二個檔案流
            FileInputStream fis2=new FileInputStream("E:/iodemo/ch04.txt");
            //合併到序列流中
            SequenceInputStream sis=new SequenceInputStream(fis1,fis2);
            //方式1
//            //臨時存放資料的陣列
//            int len =fis1.available()+fis2.available();
//            byte[] b=new byte[2*len+1];
//            //把每一次讀取到的臨時資料存放如sb中
////            StringBuffer sb=new StringBuffer();
//            //一次性讀取所有的內容
//            int off=0;
//            int i=0;
//            while((i=sis.read(b,len))!=-1) { 
////                sb.append();
//                off+=i;
//            }
//            System.out.println(new String(b));
            //方式2
            byte[] b=new byte[fis1.available()];
//            StringBuffer sb=new StringBuffer();
//            int i=0;
            while(sis.read(b)!=-1) {
                System.out.println(new String(b));
//                sb.append(new String(b));
            }
//            System.out.println(sb.toString());
            sis.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

package com.jredu.oopch11;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.Vector;
public class Ch08 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            //三個檔案流
            FileInputStream fis1 = new FileInputStream("E:/iodemo/a.txt");
            FileInputStream fis2 = new FileInputStream("E:/iodemo/b.txt");
            FileInputStream fis3 = new FileInputStream("E:/iodemo/c.txt");
            //把三個流新增到集合中
            Vector<FileInputStream> vector = new Vector<>();
            vector.add(fis1);
            vector.add(fis2);
            vector.add(fis3);
        //    vector.elements(); //方法返回的是Enumeration
            //合併到一個序列流中
            SequenceInputStream sis = new SequenceInputStream(vector.elements());
            byte[] b = new byte[fis1.available()+fis2.available()+fis3.available()];
            //讀取
            int off=0;
            //vector.get(i).available():一個檔案的長度
            for (int i = 0; i < vector.size(); i++) {
                //off:陣列當中存放資料的起始下標的位置
                off+=sis.read(b,vector.get(i).available());//每次讀取一個檔案的長度
            }
            System.out.println(new String(b));
            sis.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

更多關於java演算法相關內容感興趣的讀者可檢視本站專題:《Java檔案與目錄操作技巧彙總》、《Java資料結構與演算法教程》、《Java操作DOM節點技巧總結》和《Java快取操作技巧彙總》

希望本文所述對大家java程式設計有所幫助。