1. 程式人生 > >java-File類-字節流

java-File類-字節流

獲取 而是 結構 logs pen exc 文件的 weight 但是

一 File

1.1 遞歸子目錄

獲取所有子目錄中的內容

import java.io.File;

public class GetAllFiles {

    /**
     * @param args
     */
    public static void main(String[] args) {
        /*
         * File類的listFiles()列出當前目錄下文件以及文件夾。
         * 
         * 需求:能不能列出當前目錄下的子目錄中的所有內容。 思路: 1,在遍歷當前目錄時,會獲取到當前的所有的文件以及文件夾,
         * 2,要遍歷子目錄需要對獲取到的當前的file對象進行判斷,只有是目錄才可以作為子目錄進行繼續遍歷。
         
*/ File dir = new File("E:\\test"); listAll(dir); } public static void listAll(File dir) {// dir:接收目錄以及子目錄。 System.out.println("dir:" + dir.getName()); File[] files = dir.listFiles(); for (File file : files) { if (file.isDirectory()) {//
如果遍歷到當前的file對象是個目錄,繼續遍歷。 listAll(file); } else { System.out.println("file:"+file.getName()); } } } }

1.2 使用隊列遍歷


import java.io.File;
import java.util.LinkedList;

public class GetAllFileByQueue {

    /**
     * @param args
     
*/ public static void main(String[] args) { /* * 遍歷文件夾,不用遞歸咋辦? * 思路: * 1,可以通過對每一個目錄進行for循環,但是目錄層級很多,for會死掉。 * 2,每遍歷到一個目錄,不對其進行遍歷,而是先臨時存儲起來。 相當於把所有目錄(無論同級不同級)都存儲起來。 * 3,遍歷容器時取到就是目錄,然後對目錄遍歷即可。 4,從容器中取到目錄遍歷時發現內部還有目錄,一樣將這些目錄存儲到容器中。 * 5,只要不斷的遍歷這個容器就哦了。 * * 通過圖解:發現這個容器只要是一個簡單的隊列就可以解決這個問題。 */ File dir = new File("E:\\test"); System.out.println(dir.getName()); Queue<File> queue = new Queue<File>(); // 1,對dir進行當前目錄的遍歷。 File[] files = dir.listFiles(); for (File file : files) { // 2, 如果有子目錄,存儲到隊列中。 if (file.isDirectory()) { queue.myAdd(file); } else { System.out.println(file.getName()); } } System.out.println("---------------------"); //3,遍歷隊列容器。因為子目錄都在隊列中。 while(!queue.isNull()){ File subDir = queue.myGet();//從隊列中取出子目錄。 System.out.println(subDir.getName()); //4,遍歷子目錄。 File[] subFiles = subDir.listFiles(); for(File subFile : subFiles){ if(subFile.isDirectory()){//如果子目錄中還有子目錄,繼續存儲到隊列中。 queue.myAdd(subFile); }else{ System.out.println(subFile.getName()); } } } } } /** * 隊列結構。先進先出。 */ class Queue<E> { private LinkedList<E> link; /** * 提供了構造隊列對象的構造器。 */ public Queue() { link = new LinkedList<E>(); } /** * 添加元素的方法。 */ public void myAdd(E obj) { link.addFirst(obj); } /** * 獲取的方法。 */ public E myGet() { return link.removeLast(); } /** * 判斷隊列是否有元素。 */ public boolean isNull() { return link.isEmpty(); } }

1.3 文件數據寫入

public class FileOutputStreamDemo {

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        //需求:將數據寫入到文件中。
        //創建臨時目錄,
        File dir = new File("tempfile");
        if(!dir.exists()){
            dir.mkdir();
        }
        
        //創建存儲數據的文件。
        File file = new File(dir,"file.txt");
        
        //創建一個用於操作文件的字節輸出流對象。一創建就必須明確數據存儲目的地。
        //輸出流目的是文件,會自動創建。如果文件存在,則覆蓋
        FileOutputStream fos = new FileOutputStream(file);
        
        //調用父類中的write方法。
        byte[] data = "abcde".getBytes();
        fos.write(data);
        
        //關閉流資源。
        fos.close();
        
    }
}

續寫&和換行

private static final String LINE_SEPARATOR = System.getProperty("line.separator");

    /**
     * @param args
     * @throws FileNotFoundException 
     */
    public static void main(String[] args) throws Exception {
        
        //需求:將數據續寫到已有文件中。
        //FileOutputStream(File file, boolean append) 續寫。
        //在下一行寫入新的數據。

        File file = new File("tempfile\\file.txt");
        
        FileOutputStream fos = new FileOutputStream(file, true);
            
        String str = LINE_SEPARATOR+"itcast";
        fos.write(str.getBytes());
        
        fos.close();
        
    }

1.4 異常處理

java-io流入門 這裏面有異常的結構圖

public class FileOutputStreamDemo3 {

    /**
     * @param args
     * @throws FileNotFoundException
     */
    public static void main(String[] args) {

        File file = new File("k:\\file.txt");
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(file);
            fos.write("abcde".getBytes());
  
        } catch (IOException e) {
            System.out.println(e.toString() + "----");
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    throw new RuntimeException("");
                }
            }

        }

1.5 文件的讀

第一種

public static void main(String[] args) throws IOException {
//        2,需求:讀取文件中的數據,顯示在屏幕上。
        
        File file = new File("tempfile\\file.txt");
        
        //創建一個字節輸入流對象,必須明確數據源,其實就是創建字節讀取流和數據源相關聯。
        FileInputStream fis = new FileInputStream(file);
        
        //讀取數據。使用 read();一次讀一個字節。
        int ch = 0;
        while((ch=fis.read())!=-1){
            System.out.println("ch="+(char)ch);
        }
        // 關閉資源。
        fis.close();
    }

第二種

public static void main(String[] args) throws IOException {
        /*
         * 演示第二個讀取方法, read(byte[]);
         */

        File file = new File("tempfile\\file.txt");

        // 創建一個字節輸入流對象,必須明確數據源,其實就是創建字節讀取流和數據源相關聯。
        FileInputStream fis = new FileInputStream(file);
        
        //創建一個字節數組。
        byte[] buf = new byte[1024];//長度可以定義成1024的整數倍。
        
        int len = 0;
        while((len=fis.read(buf))!=-1){
            System.out.println(new String(buf,0,len));
        }
        
        fis.close();
    }

1.6 復制文件

第一種

    public static void main(String[] args) throws IOException {
        
        /*
         * 練習:復制文件。
         * 原理;讀取一個已有的數據,並將這些讀到的數據寫入到另一個文件中。
         */
        //1,明確源和目的。
        File srcFile = new File("E:\\1.mp3");
        File destFile = new File("E:\\copy_2.mp3");
        
        //2,明確字節流 輸入流和源相關聯,輸出流和目的關聯。
        FileInputStream fis = new FileInputStream(srcFile);
        FileOutputStream fos = new FileOutputStream(destFile);
        
        //3, 使用輸入流的讀取方法讀取字節,並將字節寫入到目的中。
        int ch = 0;
        while((ch=fis.read())!=-1){
            fos.write(ch);
        }
        
        
        //4,關閉資源。
        fos.close();
        fis.close();
        
    }

圖解

技術分享圖片

第二種

public static void main(String[] args) throws IOException {

        File srcFile = new File("E:\\1.mp3");
        File destFile = new File("E:\\copy_1.mp3");

        // 2,明確字節流 輸入流和源相關聯,輸出流和目的關聯。
        FileInputStream fis = new FileInputStream(srcFile);
        FileOutputStream fos = new FileOutputStream(destFile);

        // 3,定義一個緩沖區。
        byte[] buf = new byte[1024];

        int len = 0;
        while ((len = fis.read(buf)) != -1) {
            fos.write(buf, 0, len);// 將數組中的指定長度的數據寫入到輸出流中。
        }

        // 4,關閉資源。
        fos.close();
        fis.close();
    }

圖解

技術分享圖片

java-File類-字節流