黑馬程序員_Java輸入輸出流

------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! -------

1 IO(Input Output)流概述

IO流用來處理設備之間的數據傳輸。java對數據的操作是通過流的方式。java用於操作流的對象都在IO包中

流按操作的數據分爲兩種:字節流和字符流(字符流裏面融合了編碼表來處理文字,處理圖片用字節流,通用字節流)

流按流向分爲:輸入流和輸出流(Input(輸入)和Output(輸出)都是相對於內存而言的,從硬盤讀取數據到內存中就是輸入,從內存中往硬盤裏寫數據,就是輸出)

字符流的由來:其實就是字節流讀取文字字節數據後,不直接操作而是先查指定的編碼表,獲取對應的文字,再對這個文字操作,簡單說就是字節流+編碼表

IO流常用基類:
   字節流的抽象基類:InputStream,OutputStream
   字符流的抽象基類:Reader,Writer


2 字節流(OutputStream與InputStream)

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStream_FileInputStream {

    public static void main(String[] args) throws IOException {
        demo_Write();
        demo_Read();
    }

    public static void demo_Read() throws IOException {
        //1.創建一個讀取流對象,和指定文件相關聯
        FileInputStream fis = new FileInputStream("F:\\ByteDemo.java");
        
        //System.out.println(fis.available());//返回該文件的字節數
        /*
         * 這種方法如果文件非常大,不安全容易內存溢出,如果文件小可以使用該方法
        byte[] b = new byte[fis.available()];
        fis.read(b);
        System.out.println(new String(b));
        */
        
        
        
         // 建議使用這個方法
        byte[] b = new byte[1024];
        int len = 0;
        while((len = fis.read(b))!= -1){
            System.out.println(new String(b,0,len));
        }
        
        /*
        int ch = 0;
        while((ch = fis.read())!= -1){
            System.out.println((char)ch);
        }
        */
        
        /*
        int ch = fis.read();
        System.out.println(ch);
        */
        
        
        fis.close();
    }

    public static void demo_Write() throws IOException {
        //1.創建字節輸出流對象,用於操作文件
        FileOutputStream fos = new FileOutputStream("F:\\ByteDemo.java");
        
        //2.寫數據,直接寫入到了目的地中
        fos.write("huangjianfeng".getBytes());
        
        //fos.flush();可以不用刷新
        
        fos.close();//關閉資源要做
    }

}

3 字符流(Reader)

(1)字符流-FileReader-讀取方式一:

import java.io.FileReader;
import java.io.IOException;

public class FileReaderDemo {
    public static void main(String[] args) throws IOException {
        //創建一個文件讀取流對象,和指定名稱的文件相關聯
        //要保證該文件時已經存在,如果不存在,會發生異常FileNotFoundException
        FileReader fr = new FileReader("F:\\demo.txt");

        //調用讀取流對象的read方法,一次讀一個字符,會自動往下讀
        /*
        int ch = fr.read();//當讀完全部之後,再往下讀會返回-1,表示已經讀完了
        System.out.println("ch="+(char)ch);
        */
        /*
        while(true){
            int ch = fr.read();
            if(ch == -1)
                break;
            System.out.println("ch="+(char)ch);
        }
        */
        int ch = 0;
        while ((ch = fr.read()) != -1){
            System.out.println("ch="+(char)ch);
        }

    }

}


(2)字符流-FileReader-讀取方式二:

import java.io.FileReader;
import java.io.IOException;

public class FileReaderDemo2 {
    public static void main(String[] args) throws IOException {
        
        //創建讀取字符數據的流對象,在創建讀取流對象時,必須要明確被讀取的文件,一定要確定該文件是存在的
        FileReader fr = new FileReader("F:\\demo.txt");
        //定義一個字符數組,用於存儲讀到的字符
        //該read(char[])返回的是讀到字符個數 
        char[] ch = new char[1024];
        int num = 0;
        while ((num=fr.read(ch)) !=-1){
            System.out.println(num+"....."+new String(ch,0,num));
        }
        fr.close(); 
    }

}


4 字符流(Writer)

    字符流的特點:如果要操作 文字數據,建議優先考慮字符流。

    數據的最常見體現形式:文件

需求:在硬盤上,創建一個文件並寫入一些文字數據(FileWriter:專門用於操作文件的Writer子類對象)

import java.io.FileWriter;
import java.io.IOException;

public class FileWriterDemo {
    public static void main(String[] args)throws IOException {//之所以要拋出異常或try是因爲要操作的文件的路徑可能錯誤
        //創建一個FileWriter對象,該對象一被初始化就必須要明確被操作的文件
        //而且該文件會被創建到指定目錄下,如果該目錄下已有同名文件,將被覆蓋
        //其實該步就是在明確數據要存放的目的地
        FileWriter fw = new FileWriter("F:\\demo.txt");

        fw.write("zonghadfdasfasd");//只是寫到了內存中 也就是寫到流中

        fw.flush();//刷新該流的數據,就是將流中的數據刷到目的地中
        
        
        fw.close();//關閉流資源,關閉之前會刷新一次內部的緩衝中的數據,將數據刷到目的地中
                   //和flush的區別:flush刷新後,流可以繼續使用,close刷新後,會將流關閉(其實就是先調用了flush方法再關閉的)
    }
}


    文件的續寫,已有文件的數據續寫 

import java.io.FileWriter;
import java.io.IOException;

public class FileWriterDemo {
    private static final String LINE_SEPARATOR = System.getProperty("line.separator");//獲取當前系統的換行符

    public static void main(String[] args) throws IOException {
        //傳遞一個true參數,代表不覆蓋已有的文件,並在已有文件的末尾處進行數據續寫,記得要對異常進行處理,不能拋
        FileWriter fw = new FileWriter("F:\\dmeo.txt",true);
        
        fw.write("huang\r\njianfeng");//   \r\n能讓文件中的內容在windows下換行, 
        fw.flush();
        
        fw.write("zhonghua"+LINE_SEPARATOR+"renming");
        fw.flush();

        fw.close();
    }
}

5 File類(構造函數)

    File類:用來將文件或者文件夾封裝成對象方便對文件或或文件夾的屬性信息進行操作File對象可以作爲參數傳遞給流的構造函數

import java.io.File;

public class FileDemo {
    public static void main(String[] args) {
        constructorDemo();
    }
    public static void constructorDemo() {
        //可以將一個已存在或不存在的文件或在目錄封裝成file對象
        File f1= new File("F:\\B.txt");
        
        File f2 = new File("F:\\","B.txt");
        
        File f = new File("F:\\");
        File f3 = new File(f,"B.txt");
        
        File f4 = new File("F:"+File.separatorChar+"b.txt");//File.separator獲得分隔符
        System.out.println(f4);
    }
}

6  File類-常見的方法

獲取:
      1獲取文本名稱
   2獲取文件路勁
   3獲取文件大小
   4獲取文件修改或創建時間

import java.io.File;
import java.text.DateFormat;
import java.util.Date;

public class FileGetMethodDemo {
    public static void main(String[] args) {
        getDemo();
    }

    public static void getDemo() {
        File file = new File("F:\\a.txt");
        
        //獲取文本名稱
        String name = file.getName();
        
        //獲取文件的絕對路徑
        String absPath = file.getAbsolutePath();
        
        //獲取文件的相對路勁
        String path = file.getPath();
        
        //獲取文件的大小
        long len = file.length();
        
        //獲取文件修改時間
        long time = file.lastModified();
        
        //格式化時間
        Date date = new Date(time);
        DateFormat dateformat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
        String str_time = dateformat.format(date);
        
        System.out.println("name="+name+"\nabsPath="+absPath+"\npath="+path+"\nlen="+len+"\ntime="+str_time);
    }
}


    文件的創建與刪除:

import java.io.File;
import java.io.IOException;

public class File_CreatAndDeleteDemo {
    public static void main(String[] args) throws IOException {
        CreateAndDeleteDemo();
        
    }
    public static void CreateAndDeleteDemo() throws IOException {
        File file = new File("F:\\a.txt");
        
        //如果指定的文件不存在併成功地創建,則返回 true;如果指定的文件已經存在,則不創建,不會覆蓋原有的文件返回 false 
        boolean b = file.createNewFile();
        System.out.println(b);
        
        boolean d = file.delete();
        System.out.println(d);
    }
}


    文件夾的創建與刪除:

import java.io.File;
import java.io.IOException;

public class File_CreatAndDeleteDemo {
    public static void main(String[] args) throws IOException {
        CreateAndDeleteDemo();
        
    }
    public static void CreateAndDeleteDemo() {
        File dir = new File("F:\\abc");
        
        //File dir = new File("F:\\abc\\b\\c\\d\\e\\f\\c");
        //boolean b = dir.mkdirs();//創建多級目的,刪除的話,只能刪掉最裏面的那個目錄
        
        
        boolean b = dir.mkdir();//只能創建一級目錄
        System.out.println(b);
        
        //boolean d = dir.delete();//如果要刪除的文件不爲空,則刪除不成功
        //System.out.println(d);
    }
}


    判斷:

import java.io.File;

public class File_isDemo {
    public static void main(String[] args) {
        isDemo();
    }
    
    public static void isDemo(){
        File file = new File("F:\\a.txt");
        
        file.mkdir();
        
        //最好先判斷文件是否存在,可以用於在刪除的時候先判斷一下文件是否存在,因爲有可能文件正在被操作的時候是刪除不了的,因爲刪除調用的是windows底層的方法
        boolean b = file.exists();
        System.out.println(b);
        //判斷是否是文件,如果文件不存在爲false
        System.out.println(file.isFile());
        //判斷是否是目錄
        System.out.println(file.isDirectory());
    }
}
    

    重命名:

import java.io.File;

public class File_RenameTo {
    public static void main(String[] args) {
        RenameTo();
    }
    //重命名還可以用於剪切文件
    private static void RenameTo() {
        File file1 = new File("F:\\42-IO流(Proes集合的-基本功能).avi");
        File file2 = new File("E:\\huangjianfeng.avi");
        boolean b = file1.renameTo(file2);
        System.out.println(b);
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章