程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> java基礎IO流綜合加習題,java基礎io習題

java基礎IO流綜合加習題,java基礎io習題

編輯:JAVA綜合教程

java基礎IO流綜合加習題,java基礎io習題


     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在初級階段無非就

是操作文件夾文件,拷貝刪除,寫,讀.字符流只讀只寫拷貝自己流,不要忘記緩沖流這個加速器.謝謝大家

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved