java io

File類java

File類能夠實例化目錄也能夠實例化文件,能夠是相對路徑也能夠是絕對路徑。設計模式

String getPath()返回此文件或者目錄相對路徑數組

File getAbsoluteFile()返回此對象所對應的絕對路徑所對應的File對象網絡

String getParent()返回此對象的父目錄測試

boolean exists() 判斷File對象所對應的文件或者目錄是否存在設計

boolean isFile() boolean isDiectory()判斷File對象是目錄仍是文件code

long length() 返回文件的長度,若爲目錄則返回0對象

boolean createNewFile() 當此File對象對應的文件不存在時,建立一個文件遞歸

boolean delete()刪除目錄或者文件內存

boolean mkdir()若File所對應的目錄不存在,則新建一個目錄

String[] list()列出當前File對象內的全部文件,目錄(不包括子目錄)的相對路徑字符串

File[] listFile()列出當前File對象內的全部文件,目錄及其子目錄的File對象

下面給出一個例子,使用遞歸遍歷某文件下的全部文件和文件夾

import java.io.File;

public class Test {
    public static void main(String[] args) throws Exception {
        //遞歸顯示C盤下全部文件夾及其中文件
        File root = new File("c:");
        showAllFiles(root);
    }

    final static void showAllFiles(File dir) throws Exception {
        File[] fs = dir.listFiles();
        for (int i = 0; i < fs.length; i++) {
            System.out.println(fs[i].getAbsolutePath());
            if (fs[i].isDirectory()) {
                try {
                    showAllFiles(fs[i]);
                } catch (Exception e) {
                }
            }
        }
    }
}

按照流的單元能夠劃分爲字節流和字符流

字節流和字符流

字節流和字符流的區分很是簡單,他們的用法幾乎徹底同樣,區別在於字節流和字符流所操做的單元不一樣,字節流所操做的最下單元是8位的字節,而字符流操做的最下單元是16位字符。字節流主要由InputStream和OutputStream做爲基類,字符流主要由Reader和Writer做爲基類。字節流可用於任何類型的對象,包括二進制對象,而字符流只能處理字符或者字符串, 字節流提供了處理任何類型的IO操做的功能,但它不能直接處理Unicode字符,而字符流就能夠

按照流的角色分能夠分爲節點流和處理流

節點流

能夠從/向一個特定的IO設備(如磁盤、網絡)讀/寫數據,由於程序直接鏈接到實際的數據源,和實際的輸入輸入出鏈接,所以節點流也成爲低級流

處理流

處理流用於對一個已存在的流進行鏈接或者封裝,經過封裝後的流來實現數據的讀寫功能。使用處理流時程序並不會直接鏈接到實際的數據源,沒有和實際的數據源鏈接,這樣有一個好處就是,只要使用相同的處理流,程序就能夠採用徹底相同的輸入輸出代碼來訪問不一樣的數據源 。實際上java使用處理流來包裝節點流是一種典型的裝飾器設計模式,所以處理流也成爲包裝流。

java把全部設備裏的有序數據抽象成流的模型簡化了輸入輸出的處理,理解了流的概念模型也就瞭解了java IO

輸入輸出流體系

java IO流40多個類所有是由4個抽象基類派生來的,InputStream/Reader,字節輸入流/字符輸入流,OutputStream/Writer,字節輸出流/字符輸出流

InputStream/Reader是全部輸入流的抽象基類,他們不能建立實例來執行輸入,但他們將成爲全部輸入流的模板,InputStream中的可用方法有

int read()從輸入流中讀取單個字節,返回所讀取的字節數據(字節數據可直接轉換爲int類型)

int read(byte[] b)從輸入流中讀取最多b.length個字節的數據,並將其存儲在字節數組b中,返回直接讀取的字節數

int read(byte[] b,int off,int len)從輸入裏中讀取最多len個字節的數據,並將其存在在數組b中,放入b數組中時,並非從數組起點開始,而是從off位置開始,返回實際讀取的字節數

Reader中也包含如上3個方法,只不過將字節換爲字符而已。

示例代碼:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * Created by rockjh on 2016/9/6.
 */
public class FileInputStreamTest {

    public static void main(String[] args) throws IOException {
            /*建立字節輸入流*/
        FileInputStream fis = new FileInputStream("src/FileInputStreamTest.java");
            /*建立一個長度爲1024的竹筒*/
        byte[] bbuf = new byte[5];
        int hasRead = 0;
        while ((hasRead = fis.read(bbuf)) > 0) {
                /*取出竹筒中的水滴,將字節數組轉爲字符串輸出*/
            System.out.println(new String(bbuf, 0, hasRead));
        }
        fis.close();
    }
}

    ```

這樣的代碼輸出會有出現中文亂碼的狀況,由於咱們創建的是一個只有5字節的數組,一箇中文佔2個字節,若是剛好將一箇中文的兩個字節拆成了兩半,那麼就出現了中文亂碼,解決辦法是用Reader,或者將字節數組大小調至足夠大,可以一次性讀完該文件,推薦用Reader

OutputStream/Writer是全部輸入流的抽象基類,他們不能建立實例來執行輸入,但他們將成爲全部輸入流的模板,OutputStream/Writer中的可用方法有

void write(int c)將指定的字節或者字符輸出到輸出流,c能夠是字節也能夠是字符

void write(byte[]/char[] buf)將字節數組或者字符數據輸出到指定的輸出流中

void write(byte[]/char[] buf,int off,int len)將字節數組/字符數組中從off位置開始,長度爲len的字節/字符輸出到輸出流中

示例代碼

import java.io.*;

/**

  • Created by rockjh on 2016/9/6. */ public class FileWriteTest {

    public static void main(String[] args) throws IOException { /建立字符輸入流/ FileReader fr = new FileReader("src/FileWriteTest.java"); FileWriter fw=new FileWriter("src/FileWriteTestdf.txt"); /建立一個長度爲10的竹筒/ char[] bbuf = new char[1]; int hasRead = 0; while ((hasRead = fr.read(bbuf)) > 0) { /取出竹筒中的水滴,寫進緩衝區/ fw.write(bbuf,0,hasRead); /加上這句就是讀取一個字符數組,就寫一個字符數組到文件,若是不加將會等到fw關閉後纔會將輸出到文件/ /刷新內存,即將緩衝區內容的清空/ fw.flush(); } fr.close(); fw.close(); } }

**經常使用的處理流**

實際上咱們要識別處理流很是簡單,只要流的構造器參數不是一個物理節點(如:文件),而是已經存在的流,那麼這種流就必定是處理流

下面程序使用PrintStream來包裝FileOutputStream

import java.io.*;

/**

  • Created by rockjh on 2016/9/6. */ public class PrintStreamTest {

    public static void main(String[] args){ PrintWriter ps = null; try { /建立一個節點輸出流/ FileWriter fos=new FileWriter("src/test.txt"); /以PrintStream來包裝FileOutStream流/ ps=new PrintWriter(fos); /向文件中輸出內容並換行/ ps.println("測試1"); ps.println("測試2"); } catch (IOException e) { e.printStackTrace(); } finally { /關閉了處理流就不用再關閉他包裝的節點流了/ ps.close(); } } }

BufferedReader具備readLine(),所以經常將讀取的文本內容的輸入流包裝成BufferedReader用以方便的讀取文本內容
相關文章
相關標籤/搜索