Java 學習筆記 IO流與File操做

可能你只想簡單的使用,暫時不想了解太多的知識,那麼請看這裏,瞭解一下如何讀文件,寫文件linux

讀文件示例代碼

File file = new File("D:\\test\\t.txt");
    //這裏的有兩條斜槓,其實實際的路徑爲D:\test\t.txt,多的那一條斜槓是轉義用的
    InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(file), "GBK");
    //利用以前的File對象,建立了一個`FileInputStream`對象,以後做爲InputStreamReader的構造方法參數傳入
    //第二個參數是編碼,通常使用GBK或者是UTF-8
    BufferedReader reader = new BufferedReader(inputStreamReader);
    //把InputStreamReader做爲參數構造一個BufferedReader
    String s;
    while((s=reader.readLine())!=null){
        System.out.println(s);//循環,將該文件裏面的內容所有打印出來
    }

寫文件示例代碼

與上面的相似,解釋就很少寫啦windows

File file = new File("Q:\\t.txt");
    OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(file), "GBK");
    BufferedWriter writer = new BufferedWriter(outputStreamWriter);
    writer.write("hello world");
    writer.close();//必需要調用close才能成功地將內容寫入文件

文件不存在的話會自動生成該文件,可是若是是帶有文件夾的話,就得考慮到文件夾不存在的狀況ide

例如:測試

File file = new File("Q:\\test\\t.txt");
    File temp = file.getParentFile();
    if (!temp.exists()) {
        temp.mkdirs();//文件夾不存在,則新建一個文件夾
    }
    OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(file), "GBK");
    BufferedWriter writer = new BufferedWriter(outputStreamWriter);
    writer.write("hello world");
    writer.close();

複製文件

這裏使用的是字節流,把t.txt複製到Q盤中的MY文件夾中,並更名編碼

FileInputStream inputStream = new FileInputStream("Q:\\t.txt");
    FileOutputStream outputStream = new FileOutputStream("Q:\\MY\\t1.txt");
    int c;
    //讀到尾部則是返回-1
    while ((c = inputStream.read()) != -1) {
        outputStream.write(c);
    }
    inputStream.close();
    outputStream.close();

PS:這裏和以前同樣,若是文件夾不存在,就得調用mkdirs方法進行建立文件夾的操做,除了txt文件,其餘的文件也是能夠這樣複製url

File類(文件類)

File對象表明磁盤中實際存在的文件和目錄操作系統

靜態屬性
File.separator 分隔符 windows操做系統是\,linux操做系統則是/code

構造方法對象

  • File(File parent, String child) 經過給定的父抽象路徑名和子路徑名字符串建立一個新的File實例
  • File(String pathname) 經過將給定路徑名字符串轉換成抽象路徑名來建立一個新 File 實例。

經常使用方法blog

  • public String getName() 返回由此抽象路徑名錶示的文件或目錄的名稱。
  • public String getParent() 返回此抽象路徑名的父路徑名的路徑名字符串,若是此路徑名沒有指定父目錄,則返回 null
  • public File getParentFile() 返回此抽象路徑名的父路徑名的抽象路徑名的file對象,若是此路徑名沒有指定父目錄,則返回 null
  • public String getPath() 將此抽象路徑名轉換爲一個路徑名字符串
  • public boolean exists() 判斷此抽象路徑名錶示的文件或目錄是否存在
  • public boolean isDirectory() 測試此抽象路徑名錶示的文件是不是一個目錄
  • public boolean isFile() 測試此抽象路徑名錶示的文件是不是一個標準文件。
  • public boolean delete() 刪除此抽象路徑名錶示的文件或目錄
  • public boolean mkdirs() 建立此抽象路徑名指定的目錄,包括建立必需但不存在的父目錄。
  • public boolean renameTo(File dest) 從新命名此抽象路徑名錶示的文件

IO流筆記

主要的仍是兩種,字節流字符流

全部的文件在硬盤或在傳輸時都是以字節的方式進行,包括圖片等,而字符是隻有在內存中才會造成,因此在開發中,字節流使用較爲普遍。

字節流

1.InputStream(輸入)

  • FileInputStream(主要)
  • ByteArrayInputStream
  • ObjectInputStream
  • PidedinputStream

    2.OuputStream(輸出)

  • FileOutputStream(主要)
  • ByteArrayOutputStream
  • ObjectOutputStream
  • PidedOutputStream


字符流

1.Reader(輸入)

  • FileReader
  • CharArrayReader
  • PipedReader
  • StringReader

    2.Writer(輸出)

  • FileWriter
  • CharArrayWriter
  • PipedWriter
  • StringWriter


緩衝流

上面字節流和字符流通常不會直接使用,實際上,緩衝流是一個裝飾類,能夠給字符流和字節流添加緩衝這功能。

BufferReader
BufferWriter
其實這兩個也是包括在字符流裏面的
使用的時候傳入一個Writer或者是Reader對象便可

BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter());
BufferedReader bufferedReader = new BufferedReader(new FileReader());

異常處理筆記

1. try把reader,writer等對象放在括號內,能夠自動關閉輸入/輸出流,並釋放資源(輸出流會自動調用close方法)
若是有多個資源,使用分號隔開
ps: jdk1.7+支持
例如:

try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(""))){
    ...
}catch(Excetion e){
    ...
}

2. 可使用|來捕獲多個異常

try{
    ...
}catch(NullPointerException | ArrayIndexOutOfBoundsException e){
    //捕獲了兩個異常
}

使用字節流獲取圖片

URL url = new URL("http://wx3.sinaimg.cn/large/00689t5lgy1g11hi5nzmtg30m80jghe3.gif");
        URLConnection connection=url.openConnection();//打開連接
        InputStream inputStream = connection.getInputStream();
        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(new File("e:\\wan\\download.gif")));
        int c;
        byte[] temp = new byte[1024 * 2];//提供個緩衝區
        while ((c = bufferedInputStream.read(temp)) != -1) {
            bufferedOutputStream.write(temp,0,c);//讀多少,寫多少
        }
        bufferedOutputStream.close();
                inputStream.close();

使用字節流轉字符流獲取網頁內容

基本如上面代碼同樣,只是輸出的時候須要使用bufferwriter輸出

ObjectInputStream和ObjectOutStream

序列化和反序列化

序列化:把內存中的序列對象保存在二進制文件中
反序列化:把二進制文件讀取,得到原來的文件

須要類實現序列化接口serializable
標識接口裏面沒有任何的內容
transient關鍵字 可讓類的某個屬性在序列化的過程當中不進行寫入

List<Book> books = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            Book book = new Book("機戰風暴"+i,"亂",56);
            books.add(book);
        }
        
        ObjectOutputStream objectOutputStream = null;
        try {
            objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("e:\\out.bin")));
        } catch (IOException e) {
            e.printStackTrace();
        }

        for (Book book : books) {
            objectOutputStream.writeObject(book);
        }
        objectOutputStream.writeObject(null);//寫入一個null,防止以後出現EOFException
        objectOutputStream.close();

        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(new File("e:\\out.bin")));
        Object o = null;
        try {
            while ((o = objectInputStream.readObject()) != null) {
                Book book = (Book) o;
                System.out.println(book.toString());
            }
        }
        catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }
相關文章
相關標籤/搜索