1*字節流有:字節輸入流(FileInputStream),字節輸出流(FileOutputStream).
2*字符流有:字符輸入流(FileReader),當讓也有字符輸出流(FileWriter);
字節流>>字節輸入流,無非就是讀取文件,初學者可以這麼認為,把文檔的讀取出來放在緩沖區裡(假設有這個緩沖區)
>>字節輸出流,也就是從這個假設的緩沖區裡把讀取出來
字符流>>也是一個道理.不過字符流只可以操作純文本文件,他被開發出來就是用來操作文本文件的,什麼是純文本文件呢??
純文本文件也就是可以用記事本打開的文件.
後期,我們用到字符流的地方,無非就是操作這些純文本文件,讀取文件類容,在控制台打印啊,或者手寫一個字符串錄入到文檔中等;
一:通過習題我們來認識字節流:
今天就和大家分享一下字節流拷貝文件.將會用上java基礎階段字節流的所有方法
/*
*鍵盤輸入一個文件夾地址,將其中的文件拷貝到另一個文件夾下.只拷貝.java文件
*分析:1.拿到這個題,我們還是大問題變成小問題解決
* (1)鍵盤輸入>>>要判斷是否是一個正確的文件夾路徑>>我們可以把輸入的字符串封裝到File中用exists()判斷是否存在返回值boolean類型
* (2)拿到正確的文件夾地址.我們開始選擇用什麼流拷貝呢,剛才我也說了字符流適合操作純文本文件,所以我們遇到非純文本的適合直接選擇字節流
* (2_1)有人會問,那緩沖流呢??別急,其實緩沖流是服務字節流,字符流的,你可以認為他就一個8缸的汽車發動機,讓汽車變飛機的快感,說道這裡你也應該明白
* 緩沖流是干嘛的吧,也就是在字節字符流讀取寫入文件的時候速度加快用的,其實底層是一個緩沖區,8*1024個字節.
* (3)拷貝文件夾的時候,文件夾中不可能只有文件也有子文件夾,我們這裡要用到遞歸,天哪,好麻煩啊,一會我們做代碼你會發現,其實也就那樣
* (4)那文件夾中又有文件夾又有文件,那我們怎麼分辨呢? File給我提供了判斷的方法:isFile()判斷文件.isDirectory()判斷文件夾
* (5)那獲取到他們要講他們先放在那裡呢?把這些文件夾和文件放在數組裡?可是沒有這個方法啊,這個File給我提供了專門的數組File[]
*/
來吧>開始做題
第一步:鍵盤輸入>>>要判斷是否是一個正確的文件夾路徑
private static File getScanner() {
//鍵盤輸入 Scanner sc = new Scanner(System.in); System.out.println("請輸入文件夾的路徑:"); while(true){ String string = sc.nextLine();
//封裝鍵盤輸入的文件地址 File file = new File(string);
//判斷文件夾地址是否存在 if(!file.exists()){ System.out.println("你輸入的文件路徑不存在,請重新輸入:");
//判斷是否為文件地址 }else if(file.isFile()){ System.out.println("你輸入的是文件,不是文件夾,請重新輸入:"); }else{
//最後返回文件夾地址 return file; } } }
第二步:拷貝
private static void copy(File src, File dest) throws IOException { //拿到剛才輸入的兩個文件夾地址 源文件地址為src 要接收的文件夾的地址為dest //把源文件夾中的文件,字文件夾存放到File數組中src.listFiles();方法獲取 File[] files = src.listFiles(); //判斷數組是否為空 if(files!=null){ //遍歷數組 for (File file : files) { //如果是文件 並且以java結尾 geName()是拿到文件夾或者文件的名字字符串 if(file.isFile() && file.getName().endsWith(".java")){ //符合條件的復制 //緩沖流來了啊 記得加速的 後面跟上我們的字節流,別裝上了發動機不要車了啊 //字節輸入流 對於初學者來說:可以認為讀取文件到緩沖區 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); //字節輸出流 把緩沖區的內容拿出來給另外一個對象 這裡我們講一下為什麼在new File(這裡存放的是文件地址) // 要接收的文件夾的地址為dest 加上 文件的地址 // E:\\dest \\xxx.java 拼接成一個完整的文件地址 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(dest,file.getName()))); //這裡建一個字節數組 其實也是讓文件拷貝的更加快一點 byte[] by = new byte[1024*8]; //索引 拷貝結束了,沒有了 數組就返回-1; int len=0; while((len=bis.read(by))!=-1){ //往裡面寫 bos.write(by, 0, len); } //關流 bos.close(); bis.close(); }else if(file.isDirectory()){ //建立一個remove()方法 判讀文件夾中可包含java文件 不包含文件夾不復制過來 if(remove(file)){ File newfile = new File(dest,file.getName()); if(!newfile.exists()){ //建立文件夾 文件夾中的文件夾 newfile.mkdirs(); } copy(file, newfile); } } } } } private static boolean remove(File file) { File[] files = file.listFiles(); //先判斷文件夾是否為空 為空返回false if(files!=null){ for (File file2 : files) { //底層文件夾中含有符合條件的文件 返回true if(file2.isFile() && file2.getName().endsWith(".java")){ return true; //判斷是否是文件夾 //底層是否有java文件 }else if(file2.isDirectory() && remove(file2)){ return true; } } } return false; }
上面的代碼可能一時理解起來比較難消化,時間原因,下次我更新一個比較詳細的
第三步main()方法
public static void main(String[] args) throws IOException { File src = getScanner(); File dest = getScanner(); copy(src,dest); }
字符流>>題目
/*
* 文檔中第一行與最後一行交換
* 第二行與倒數第二行交換
*
*/
public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new FileReader("abc\\b.txt")); BufferedWriter bw = new BufferedWriter(new FileWriter("abc\\c.txt")); ArrayList<String> list = new ArrayList<>();
//字節流我們說了用len!=-1做索引
//文檔有一個方法可以一行一行的讀取,當然可以想在字節流那樣讀取 String line=null; while((line=br.readLine())!=null){ list.add(line); } br.close(); //換文檔中第一行與最後一行交換 for (int i = 0; i<list.size()/2 ;i++) { String string = list.get(i);
//只需要交換集合長度/2次
list.set(i, list.get(list.size()-1-i)); list.set(list.size()-1-i, string); } //遍歷並且把字符串寫到文件中 for (String string : list) { bw.write(string); bw.newLine(); }
//關流 bw.close(); }
今天就說這麼多了,回頭看我自己寫的........我發初學IO的應該不知道我在說啥.下次一定來一個詳細的,說真的IO流要細說,有的說的,不過大家記住IO在初級階段無非就
是操作文件夾文件,拷貝刪除,寫,讀.字符流只讀只寫拷貝自己流,不要忘記緩沖流這個加速器.謝謝大家