Java API —— IO流小結

 

練習題:java

一、複製文本文件數組

package cn.itcast_01;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/*
 * 複製文本文件
 * 
 * 分析:
 *         複製數據,若是咱們知道用記事本打開並可以讀懂,就用字符流,不然用字節流。
 *         經過該原理,咱們知道咱們應該採用字符流更方便一些。
 *         而字符流有5種方式,因此作這個題目咱們有5種方式。推薦掌握第5種。
 * 數據源:
 *         c:\\a.txt -- FileReader -- BufferdReader
 * 目的地:
 *         d:\\b.txt -- FileWriter -- BufferedWriter
 */
public class CopyFileDemo {
    public static void main(String[] args) throws IOException {
        String srcString = "c:\\a.txt";
        String destString = "d:\\b.txt";
        // method1(srcString, destString);
        // method2(srcString, destString);
        // method3(srcString, destString);
        // method4(srcString, destString);
        method5(srcString, destString);
    }
    // 字符緩衝流一次讀寫一個字符串
    private static void method5(String srcString, String destString)
            throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(srcString));
        BufferedWriter bw = new BufferedWriter(new FileWriter(destString));
        String line = null;
        while ((line = br.readLine()) != null) {
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        bw.close();
        br.close();
    }
    // 字符緩衝流一次讀寫一個字符數組
    private static void method4(String srcString, String destString)
            throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(srcString));
        BufferedWriter bw = new BufferedWriter(new FileWriter(destString));
        char[] chs = new char[1024];
        int len = 0;
        while ((len = br.read(chs)) != -1) {
            bw.write(chs, 0, len);
        }
        bw.close();
        br.close();
    }
    // 字符緩衝流一次讀寫一個字符
    private static void method3(String srcString, String destString)
            throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(srcString));
        BufferedWriter bw = new BufferedWriter(new FileWriter(destString));
        int ch = 0;
        while ((ch = br.read()) != -1) {
            bw.write(ch);
        }
        bw.close();
        br.close();
    }
    // 基本字符流一次讀寫一個字符數組
    private static void method2(String srcString, String destString)
            throws IOException {
        FileReader fr = new FileReader(srcString);
        FileWriter fw = new FileWriter(destString);
        char[] chs = new char[1024];
        int len = 0;
        while ((len = fr.read(chs)) != -1) {
            fw.write(chs, 0, len);
        }
        fw.close();
        fr.close();
    }
    // 基本字符流一次讀寫一個字符
    private static void method1(String srcString, String destString)
            throws IOException {
        FileReader fr = new FileReader(srcString);
        FileWriter fw = new FileWriter(destString);
        int ch = 0;
        while ((ch = fr.read()) != -1) {
            fw.write(ch);
        }
        fw.close();
        fr.close();
    }
}

 

二、複製圖片app

package cn.itcast_01;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
 * 複製圖片
 * 
 * 分析:
 *         複製數據,若是咱們知道用記事本打開並可以讀懂,就用字符流,不然用字節流。
 *         經過該原理,咱們知道咱們應該採用字節流。
 *         而字節流有4種方式,因此作這個題目咱們有4種方式。推薦掌握第4種。
 * 
 * 數據源:
 *         c:\\a.jpg -- FileInputStream -- BufferedInputStream
 * 目的地:
 *         d:\\b.jpg -- FileOutputStream -- BufferedOutputStream
 */
public class CopyImageDemo {
    public static void main(String[] args) throws IOException {
        // 使用字符串做爲路徑
        // String srcString = "c:\\a.jpg";
        // String destString = "d:\\b.jpg";
        // 使用File對象作爲參數
        File srcFile = new File("c:\\a.jpg");
        File destFile = new File("d:\\b.jpg");
        // method1(srcFile, destFile);
        // method2(srcFile, destFile);
        // method3(srcFile, destFile);
        method4(srcFile, destFile);
    }
    // 字節緩衝流一次讀寫一個字節數組
    private static void method4(File srcFile, File destFile) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
                srcFile));
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream(destFile));
        byte[] bys = new byte[1024];
        int len = 0;
        while ((len = bis.read(bys)) != -1) {
            bos.write(bys, 0, len);
        }
        bos.close();
        bis.close();
    }
    // 字節緩衝流一次讀寫一個字節
    private static void method3(File srcFile, File destFile) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
                srcFile));
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream(destFile));
        int by = 0;
        while ((by = bis.read()) != -1) {
            bos.write(by);
        }
        bos.close();
        bis.close();
    }
    // 基本字節流一次讀寫一個字節數組
    private static void method2(File srcFile, File destFile) throws IOException {
        FileInputStream fis = new FileInputStream(srcFile);
        FileOutputStream fos = new FileOutputStream(destFile);
        byte[] bys = new byte[1024];
        int len = 0;
        while ((len = fis.read(bys)) != -1) {
            fos.write(bys, 0, len);
        }
        fos.close();
        fis.close();
    }
    // 基本字節流一次讀寫一個字節
    private static void method1(File srcFile, File destFile) throws IOException {
        FileInputStream fis = new FileInputStream(srcFile);
        FileOutputStream fos = new FileOutputStream(destFile);
        int by = 0;
        while ((by = fis.read()) != -1) {
            fos.write(by);
        }
        fos.close();
        fis.close();
    }
}

  

三、把ArrayList集合中的字符串數據存儲到文本文件dom

package cn.itcast_02;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
/*
 * 需求:把ArrayList集合中的字符串數據存儲到文本文件
 * 
 * 分析:
 *         經過題目的意思咱們能夠知道以下的一些內容,
 *             ArrayList集合裏存儲的是字符串。
 *             遍歷ArrayList集合,把數據獲取到。
 *             而後存儲到文本文件中。
 *             文本文件說明使用字符流。
 * 
 * 數據源:
 *         ArrayList<String> -- 遍歷獲得每個字符串數據
 * 目的地:
 *         a.txt -- FileWriter -- BufferedWriter
 */
public class ArrayListToFileDemo {
    public static void main(String[] args) throws IOException {
        // 封裝數據與(建立集合對象)
        ArrayList<String> array = new ArrayList<String>();
        array.add("hello");
        array.add("world");
        array.add("java");
        // 封裝目的地
        BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));
        // 遍歷集合
        for (String s : array) {
            // 寫數據
            bw.write(s);
            bw.newLine();
            bw.flush();
        }
        // 釋放資源
        bw.close();
    }
}

  

四、從文本文件中讀取數據(每一行爲一個字符串數據)到集合中,並遍歷集合ide

package cn.itcast_02;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
/*
 * 需求:從文本文件中讀取數據(每一行爲一個字符串數據)到集合中,並遍歷集合
 * 
 * 分析:
 *         經過題目的意思咱們能夠知道以下的一些內容,
 *             數據源是一個文本文件。
 *             目的地是一個集合。
 *             並且元素是字符串。
 * 
 * 數據源:
 *         b.txt -- FileReader -- BufferedReader
 * 目的地:
 *         ArrayList<String>
 */
public class FileToArrayListDemo {
    public static void main(String[] args) throws IOException {
        // 封裝數據源
        BufferedReader br = new BufferedReader(new FileReader("b.txt"));
        // 封裝目的地(建立集合對象)
        ArrayList<String> array = new ArrayList<String>();
        // 讀取數據存儲到集合中
        String line = null;
        while ((line = br.readLine()) != null) {
            array.add(line);
        }
        // 釋放資源
        br.close();
        // 遍歷集合
        for (String s : array) {
            System.out.println(s);
        }
    }
}

  

五、隨機獲取文本文件中的姓名案例學習

package cn.itcast_02;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;
/*
 * 需求:我有一個文本文件中存儲了幾個名稱,請你們寫一個程序實現隨機獲取一我的的名字。
 * 
 * 分析:
 *         A:把文本文件中的數據存儲到集合中
 *         B:隨機產生一個索引
 *         C:根據該索引獲取一個值
 */
public class GetName {
    public static void main(String[] args) throws IOException {
        // 把文本文件中的數據存儲到集合中
        BufferedReader br = new BufferedReader(new FileReader("b.txt"));
        ArrayList<String> array = new ArrayList<String>();
        String line = null;
        while ((line = br.readLine()) != null) {
            array.add(line);
        }
        br.close();
        // 隨機產生一個索引
        Random r = new Random();
        int index = r.nextInt(array.size());
        // 根據該索引獲取一個值
        String name = array.get(index);
        System.out.println("該幸運者是:" + name);
    }
}

 

 六、複製單級文件夾(文件夾下全是文件)測試

package cn.itcast_03;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
 * 需求:複製單極文件夾
 * 
 * 數據源:e:\\demo
 * 目的地:e:\\test
 * 
 * 分析:
 *         A:封裝目錄
 *         B:獲取該目錄下的全部文本的File數組
 *         C:遍歷該File數組,獲得每個File對象
 *         D:把該File進行復制
 */
public class CopyFolderDemo {
    public static void main(String[] args) throws IOException {
        // 封裝目錄
        File srcFolder = new File("e:\\demo");
        // 封裝目的地
        File destFolder = new File("e:\\test");
        // 若是目的地文件夾不存在,就建立
        if (!destFolder.exists()) {
            destFolder.mkdir();
        }
        // 獲取該目錄下的全部文本的File數組
        File[] fileArray = srcFolder.listFiles();
        // 遍歷該File數組,獲得每個File對象
        for (File file : fileArray) {
            // System.out.println(file);
            // 數據源:e:\\demo\\e.mp3
            // 目的地:e:\\test\\e.mp3
            String name = file.getName(); // e.mp3
            File newFile = new File(destFolder, name); // e:\\test\\e.mp3
            copyFile(file, newFile);
        }
    }
    private static void copyFile(File file, File newFile) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
                file));
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream(newFile));
        byte[] bys = new byte[1024];
        int len = 0;
        while ((len = bis.read(bys)) != -1) {
            bos.write(bys, 0, len);
        }
        bos.close();
        bis.close();
    }
}

 

七、複製單級文件夾中指定文件並修改文件名稱ui

package cn.itcast_04;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
/*
 * 需求:複製指定目錄下的指定文件,並修改後綴名。
 * 指定的文件是:.java文件。
 * 指定的後綴名是:.jad
 * 指定的目錄是:jad
 * 
 * 數據源:e:\\java\\A.java
 * 目的地:e:\\jad\\A.jad
 * 
 * 分析:
 *         A:封裝目錄
 *         B:獲取該目錄下的java文件的File數組
 *         C:遍歷該File數組,獲得每個File對象
 *         D:把該File進行復制
 *         E:在目的地目錄下更名
 */
public class CopyFolderDemo {
    public static void main(String[] args) throws IOException {
        // 封裝目錄
        File srcFolder = new File("e:\\java");
        // 封裝目的地
        File destFolder = new File("e:\\jad");
        // 若是目的地目錄不存在,就建立
        if (!destFolder.exists()) {
            destFolder.mkdir();
        }
        // 獲取該目錄下的java文件的File數組
        File[] fileArray = srcFolder.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return new File(dir, name).isFile() && name.endsWith(".java");
            }
        });
        // 遍歷該File數組,獲得每個File對象
        for (File file : fileArray) {
            // System.out.println(file);
            // 數據源:e:\java\DataTypeDemo.java
            // 目的地:e:\\jad\DataTypeDemo.java
            String name = file.getName();
            File newFile = new File(destFolder, name);
            copyFile(file, newFile);
        }
        // 在目的地目錄下更名
        File[] destFileArray = destFolder.listFiles();
        for (File destFile : destFileArray) {
            // System.out.println(destFile);
            // e:\jad\DataTypeDemo.java
            // e:\\jad\\DataTypeDemo.jad
            String name =destFile.getName(); //DataTypeDemo.java
            String newName = name.replace(".java", ".jad");//DataTypeDemo.jad
            
            File newFile = new File(destFolder,newName);
            destFile.renameTo(newFile);
        }
    }
    private static void copyFile(File file, File newFile) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
                file));
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream(newFile));
        byte[] bys = new byte[1024];
        int len = 0;
        while ((len = bis.read(bys)) != -1) {
            bos.write(bys, 0, len);
        }
        bos.close();
        bis.close();
    }
}

  

八、複製多級文件夾this

package cn.itcast_05;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
 * 需求:複製多極文件夾
 * 
 * 數據源:E:\JavaSE\day21\code\demos
 * 目的地:E:\\
 * 
 * 分析:
 *         A:封裝數據源File
 *         B:封裝目的地File
 *         C:判斷該File是文件夾仍是文件
 *             a:是文件夾
 *                 就在目的地目錄下建立該文件夾
 *                 獲取該File對象下的全部文件或者文件夾File對象
 *                 遍歷獲得每個File對象
 *                 回到C
 *             b:是文件
 *                 就複製(字節流)
 */
public class CopyFoldersDemo {
    public static void main(String[] args) throws IOException {
        // 封裝數據源File
        File srcFile = new File("E:\\JavaSE\\day21\\code\\demos");
        // 封裝目的地File
        File destFile = new File("E:\\");
        // 複製文件夾的功能
        copyFolder(srcFile, destFile);
    }
    private static void copyFolder(File srcFile, File destFile)
            throws IOException {
        // 判斷該File是文件夾仍是文件
        if (srcFile.isDirectory()) {
            // 文件夾
            File newFolder = new File(destFile, srcFile.getName());
            newFolder.mkdir();
            // 獲取該File對象下的全部文件或者文件夾File對象
            File[] fileArray = srcFile.listFiles();
            for (File file : fileArray) {
                copyFolder(file, newFolder);
            }
        } else {
            // 文件
            File newFile = new File(destFile, srcFile.getName());
            copyFile(srcFile, newFile);
        }
    }
    private static void copyFile(File srcFile, File newFile) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
                srcFile));
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream(newFile));
        byte[] bys = new byte[1024];
        int len = 0;
        while ((len = bis.read(bys)) != -1) {
            bos.write(bys, 0, len);
        }
        bos.close();
        bis.close();
    }
}

  

九、鍵盤錄入5個學生信息(姓名,語文成績,數學成績,英語成績),按照總分從高到低存入文本文件spa

學生類:
package cn.itcast_06;
public class Student {
    // 姓名
    private String name;
    // 語文成績
    private int chinese;
    // 數學成績
    private int math;
    // 英語成績
    private int english;
    public Student() {
        super();
    }
    public Student(String name, int chinese, int math, int english) {
        super();
        this.name = name;
        this.chinese = chinese;
        this.math = math;
        this.english = english;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getChinese() {
        return chinese;
    }
    public void setChinese(int chinese) {
        this.chinese = chinese;
    }
    public int getMath() {
        return math;
    }
    public void setMath(int math) {
        this.math = math;
    }
    public int getEnglish() {
        return english;
    }
    public void setEnglish(int english) {
        this.english = english;
    }
    public int getSum() {
        return this.chinese + this.math + this.english;
    }
}

測試類:

package cn.itcast_06;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeSet;
/*
 * 鍵盤錄入5個學生信息(姓名,語文成績,數學成績,英語成績),按照總分從高到低存入文本文件
 * 
 * 分析:
 *         A:建立學生類
 *         B:建立集合對象
 *             TreeSet<Student>
 *         C:鍵盤錄入學生信息存儲到集合
 *         D:遍歷集合,把數據寫到文本文件
 */
public class StudentDemo {
    public static void main(String[] args) throws IOException {
        // 建立集合對象
        TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                int num = s2.getSum() - s1.getSum();
                int num2 = num == 0 ? s1.getChinese() - s2.getChinese() : num;
                int num3 = num2 == 0 ? s1.getMath() - s2.getMath() : num2;
                int num4 = num3 == 0 ? s1.getEnglish() - s2.getEnglish() : num3;
                int num5 = num4 == 0 ? s1.getName().compareTo(s2.getName())
                        : num4;
                return num5;
            }
        });
        // 鍵盤錄入學生信息存儲到集合
        for (int x = 1; x <= 5; x++) {
            Scanner sc = new Scanner(System.in);
            System.out.println("請錄入第" + x + "個的學習信息");
            System.out.println("姓名:");
            String name = sc.nextLine();
            System.out.println("語文成績:");
            int chinese = sc.nextInt();
            System.out.println("數學成績:");
            int math = sc.nextInt();
            System.out.println("英語成績:");
            int english = sc.nextInt();
            // 建立學生對象
            Student s = new Student();
            s.setName(name);
            s.setChinese(chinese);
            s.setMath(math);
            s.setEnglish(english);
            // 把學生信息添加到集合
            ts.add(s);
        }
        // 遍歷集合,把數據寫到文本文件
        BufferedWriter bw = new BufferedWriter(new FileWriter("students.txt"));
        bw.write("學生信息以下:");
        bw.newLine();
        bw.flush();
        bw.write("姓名,語文成績,數學成績,英語成績");
        bw.newLine();
        bw.flush();
        for (Student s : ts) {
            StringBuilder sb = new StringBuilder();
            sb.append(s.getName()).append(",").append(s.getChinese())
                    .append(",").append(s.getMath()).append(",")
                    .append(s.getEnglish());
            bw.write(sb.toString());
            bw.newLine();
            bw.flush();
        }
        // 釋放資源
        bw.close();
        System.out.println("學習信息存儲完畢");
    }
}

  

十、已知s.txt文件中有這樣的一個字符串:「hcexfgijkamdnoqrzstuvwybpl」。請編寫程序讀取數據內容,把數據排序後寫入ss.txt中。

package cn.itcast_07;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
/*
 * 已知s.txt文件中有這樣的一個字符串:「hcexfgijkamdnoqrzstuvwybpl」
 * 請編寫程序讀取數據內容,把數據排序後寫入ss.txt中。
 * 
 * 分析:
 *         A:把s.txt這個文件給作出來
 *         B:讀取該文件的內容,存儲到一個字符串中
 *         C:把字符串轉換爲字符數組
 *         D:對字符數組進行排序
 *         E:把排序後的字符數組轉換爲字符串
 *         F:把字符串再次寫入ss.txt中
 */
public class StringDemo {
    public static void main(String[] args) throws IOException {
        // 讀取該文件的內容,存儲到一個字符串中
        BufferedReader br = new BufferedReader(new FileReader("s.txt"));
        String line = br.readLine();
        br.close();
        // 把字符串轉換爲字符數組
        char[] chs = line.toCharArray();
        // 對字符數組進行排序
        Arrays.sort(chs);
        // 把排序後的字符數組轉換爲字符串
        String s = new String(chs);
        // 把字符串再次寫入ss.txt中
        BufferedWriter bw = new BufferedWriter(new FileWriter("ss.txt"));
        bw.write(s);
        bw.newLine();
        bw.flush();
        bw.close();
    }
}

 

十一、用Reader模擬BufferedReader的readLine()功能

自定義類:
package cn.itcast_08;
import java.io.IOException;
import java.io.Reader;
/*
 * 用Reader模擬BufferedReader的readLine()功能
 * 
 * readLine():一次讀取一行,根據換行符判斷是否結束,只返回內容,不返回換行符
 */
public class MyBufferedReader {
    private Reader r;
    public MyBufferedReader(Reader r) {
        this.r = r;
    }
    /*
     * 思考:寫一個方法,返回值是一個字符串。
     */
    public String readLine() throws IOException {
        /*
         * 我要返回一個字符串,我該怎麼辦呢? 咱們必須去看看r對象可以讀取什麼東西呢? 兩個讀取方法,一次讀取一個字符或者一次讀取一個字符數組
         * 那麼,咱們要返回一個字符串,用哪一個方法比較好呢? 咱們很容易想到字符數組比較好,可是問題來了,就是這個數組的長度是多長呢?
         * 根本就沒有辦法定義數組的長度,你定義多長都不合適。 因此,只能選擇一次讀取一個字符。
         * 可是呢,這種方式的時候,咱們再讀取下一個字符的時候,上一個字符就丟失了 因此,咱們又應該定義一個臨時存儲空間把讀取過的字符給存儲起來。
         * 這個用誰比較和是呢?數組,集合,字符串緩衝區三個可供選擇。
         * 通過簡單的分析,最終選擇使用字符串緩衝區對象。而且使用的是StringBuilder
         */
        StringBuilder sb = new StringBuilder();
        // 作這個讀取最麻煩的是判斷結束,可是在結束以前應該是一直讀取,直到-1
        
        
        /*
        hello
        world
        java    
        
        104101108108111
        119111114108100
        1069711897
         */
        
        int ch = 0;
        while ((ch = r.read()) != -1) { //104,101,108,108,111
            if (ch == '\r') {
                continue;
            }
            if (ch == '\n') {
                return sb.toString(); //hello
            } else {
                sb.append((char)ch); //hello
            }
        }
        // 爲了防止數據丟失,判斷sb的長度不能大於0
        if (sb.length() > 0) {
            return sb.toString();
        }
        return null;
    }
    /*
     * 先寫一個關閉方法
     */
    public void close() throws IOException {
        this.r.close();
    }
}

測試類:

package cn.itcast_08;
import java.io.FileReader;
import java.io.IOException;
/*
 * 測試MyBufferedReader的時候,你就把它看成BufferedReader同樣的使用
 */
public class MyBufferedReaderDemo {
    public static void main(String[] args) throws IOException {
        MyBufferedReader mbr = new MyBufferedReader(new FileReader("my.txt"));
        String line = null;
        while ((line = mbr.readLine()) != null) {
            System.out.println(line);
        }
        mbr.close();
        // System.out.println('\r' + 0); // 13
        // System.out.println('\n' + 0);// 10
    }
}

  

十二、自定義類模擬LineNumberReader的特有功能:獲取每次讀取數據的行號

LineNumberReader 類測試:

package cn.itcast_09;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
/*
 * BufferedReader
 *         |--LineNumberReader
 *             public int getLineNumber()得到當前行號。 
 *             public void setLineNumber(int lineNumber)
 */
public class LineNumberReaderDemo {
    public static void main(String[] args) throws IOException {
        LineNumberReader lnr = new LineNumberReader(new FileReader("my.txt"));
        // 從10開始才比較好
        // lnr.setLineNumber(10);
        // System.out.println(lnr.getLineNumber());
        // System.out.println(lnr.getLineNumber());
        // System.out.println(lnr.getLineNumber());
        String line = null;
        while ((line = lnr.readLine()) != null) {
            System.out.println(lnr.getLineNumber() + ":" + line);
        }
        lnr.close();
    }
}

 自定義LineNumberReader類版本一:

package cn.itcast_09;

import java.io.IOException;
import java.io.Reader;

public class MyLineNumberReader {
    private Reader r;
    private int lineNumber = 0;

    public MyLineNumberReader(Reader r) {
        this.r = r;
    }

    public int getLineNumber() {
        // lineNumber++;
        return lineNumber;
    }

    public void setLineNumber(int lineNumber) {
        this.lineNumber = lineNumber;
    }

    public String readLine() throws IOException {
        lineNumber++;

        StringBuilder sb = new StringBuilder();

        int ch = 0;
        while ((ch = r.read()) != -1) {
            if (ch == '\r') {
                continue;
            }

            if (ch == '\n') {
                return sb.toString();
            } else {
                sb.append((char) ch);
            }
        }

        if (sb.length() > 0) {
            return sb.toString();
        }

        return null;
    }

    public void close() throws IOException {
        this.r.close();
    }
}

 自定義LineNumberReader類改進版:

package cn.itcast_09;

import java.io.IOException;
import java.io.Reader;

import cn.itcast_08.MyBufferedReader;

public class MyLineNumberReader2 extends MyBufferedReader {
    private Reader r;

    private int lineNumber = 0;

    public MyLineNumberReader2(Reader r) {
        super(r);
    }

    public int getLineNumber() {
        return lineNumber;
    }

    public void setLineNumber(int lineNumber) {
        this.lineNumber = lineNumber;
    }

    @Override
    public String readLine() throws IOException {
        lineNumber++;
        return super.readLine();
    }
}

 測試類:

package cn.itcast_09;

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

public class MyLineNumberReaderTest {
    public static void main(String[] args) throws IOException {
        // MyLineNumberReader mlnr = new MyLineNumberReader(new FileReader(
        // "my.txt"));

        MyLineNumberReader2 mlnr = new MyLineNumberReader2(new FileReader(
                "my.txt"));

        // mlnr.setLineNumber(10);

        // System.out.println(mlnr.getLineNumber());
        // System.out.println(mlnr.getLineNumber());
        // System.out.println(mlnr.getLineNumber());

        String line = null;
        while ((line = mlnr.readLine()) != null) {
            System.out.println(mlnr.getLineNumber() + ":" + line);
        }

        mlnr.close();
    }
}
相關文章
相關標籤/搜索