JAVA语言基础-面向对象(IO:IO字符流、递归)
生活随笔
收集整理的這篇文章主要介紹了
JAVA语言基础-面向对象(IO:IO字符流、递归)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
21.01_IO流(字符流FileReader)
- 1.字符流是什么
- 字符流是可以直接讀寫字符的IO流
- 字符流讀取字符, 就要先讀取到字節(jié)數(shù)據(jù), 然后轉(zhuǎn)為字符. 如果要寫出字符, 需要把字符轉(zhuǎn)為字節(jié)再寫出.
- 2.FileReader
- FileReader類的read()方法可以按照字符大小讀取
- FileReader fr = new FileReader("aaa.txt"); //創(chuàng)建輸入流對象,關聯(lián)aaa.txt int ch; while((ch = fr.read()) != -1) { //將讀到的字符賦值給chSystem.out.println((char)ch); //將讀到的字符強轉(zhuǎn)后打印 }fr.close(); //關流
????
package com.heima.chario;import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException;public class Demo1_FileReader {/*** @param args* @throws IOException */public static void main(String[] args) throws IOException {//demo1();FileReader fr = new FileReader("xxx.txt");int c;while((c = fr.read()) != -1) { //通過項目默認的碼表一次讀取一個字符System.out.print((char)c);}fr.close();}public static void demo1() throws FileNotFoundException, IOException {FileReader fr = new FileReader("xxx.txt");int x = fr.read();System.out.println(x);char c = (char)x;System.out.println(c);fr.close();}}21.02_IO流(字符流FileWriter)
-
FileWriter類的write()方法可以自動把字符轉(zhuǎn)為字節(jié)寫出
FileWriter fw = new FileWriter("aaa.txt"); fw.write("aaa"); fw.close();
????
package com.heima.chario;import java.io.FileWriter; import java.io.IOException;public class Demo2_FileWriter {/*** @param args* @throws IOException */public static void main(String[] args) throws IOException {FileWriter fw = new FileWriter("yyy.txt");fw.write("大家好,基礎班快接近尾聲了,大家要努力,要堅持!!!");fw.write(97);fw.close();}}21.03_IO流(字符流的拷貝)
FileReader fr = new FileReader("a.txt"); FileWriter fw = new FileWriter("b.txt");int ch; while((ch = fr.read()) != -1) {fw.write(ch); }fr.close(); fw.close();? ?
package com.heima.chario;import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException;public class Demo3_Copy {/*** @param args* @throws IOException */public static void main(String[] args) throws IOException {//demo1();//demo2(); //demo3();BufferedReader br = new BufferedReader(new FileReader("xxx.txt"));BufferedWriter bw = new BufferedWriter(new FileWriter("yyy.txt"));int c;while((c = br.read()) != -1) {bw.write(c);}br.close();bw.close();}public static void demo3() throws FileNotFoundException, IOException {FileReader fr = new FileReader("xxx.txt");FileWriter fw = new FileWriter("yyy.txt");char[] arr = new char[1024];int len;while((len = fr.read(arr)) != -1) { //將文件上的數(shù)據(jù)讀取到字符數(shù)組中fw.write(arr,0,len); //將字符數(shù)組中的數(shù)據(jù)寫到文件上}fr.close();fw.close();}public static void demo2() throws FileNotFoundException, IOException {//字符流不能拷貝純文本的文件FileReader fr = new FileReader("雙元.jpg");FileWriter fw = new FileWriter("copy.jpg");int c;while((c = fr.read()) != -1) {fw.write(c);}fr.close();fw.close();}public static void demo1() throws FileNotFoundException, IOException {FileReader fr = new FileReader("xxx.txt");FileWriter fw = new FileWriter("zzz.txt");int c;while((c = fr.read()) != -1) {fw.write(c);}fr.close();fw.close(); //Writer類中有一個2k的小緩沖區(qū),如果不關流,就會將內(nèi)容寫到緩沖區(qū)里,關流會將緩沖區(qū)內(nèi)容刷新,再關閉}}21.04_IO流(什么情況下使用字符流)
- 字符流也可以拷貝文本文件, 但不推薦使用. 因為讀取時會把字節(jié)轉(zhuǎn)為字符, 寫出時還要把字符轉(zhuǎn)回字節(jié).
- 程序需要讀取一段文本, 或者需要寫出一段文本的時候可以使用字符流
- 讀取的時候是按照字符的大小讀取的,不會出現(xiàn)半個中文
- 寫出的時候可以直接將字符串寫出,不用轉(zhuǎn)換為字節(jié)數(shù)組
21.05_IO流(字符流是否可以拷貝非純文本的文件)
- 不可以拷貝非純文本的文件
- 因為在讀的時候會將字節(jié)轉(zhuǎn)換為字符,在轉(zhuǎn)換過程中,可能找不到對應的字符,就會用?代替,寫出的時候會將字符轉(zhuǎn)換成字節(jié)寫出去
- 如果是?,直接寫出,這樣寫出之后的文件就亂了,看不了了
21.06_IO流(自定義字符數(shù)組的拷貝)
- FileReader fr = new FileReader("aaa.txt"); //創(chuàng)建字符輸入流,關聯(lián)aaa.txt FileWriter fw = new FileWriter("bbb.txt"); //創(chuàng)建字符輸出流,關聯(lián)bbb.txtint len; char[] arr = new char[1024*8]; //創(chuàng)建字符數(shù)組 while((len = fr.read(arr)) != -1) { //將數(shù)據(jù)讀到字符數(shù)組中fw.write(arr, 0, len); //從字符數(shù)組將數(shù)據(jù)寫到文件上 }fr.close(); //關流釋放資源 fw.close();
21.07_IO流(帶緩沖的字符流)
- BufferedReader的read()方法讀取字符時會一次讀取若干字符到緩沖區(qū), 然后逐個返回給程序, 降低讀取文件的次數(shù), 提高效率
- BufferedWriter的write()方法寫出字符時會先寫到緩沖區(qū), 緩沖區(qū)寫滿時才會寫到文件, 降低寫文件的次數(shù), 提高效率
- BufferedReader br = new BufferedReader(new FileReader("aaa.txt")); //創(chuàng)建字符輸入流對象,關聯(lián)aaa.txt BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt")); //創(chuàng)建字符輸出流對象,關聯(lián)bbb.txtint ch; while((ch = br.read()) != -1) { //read一次,會先將緩沖區(qū)讀滿,從緩沖去中一個一個的返給臨時變量chbw.write(ch); //write一次,是將數(shù)據(jù)裝到字符數(shù)組,裝滿后再一起寫出去 }br.close(); //關流 bw.close();
21.08_IO流(readLine()和newLine()方法)
- BufferedReader的readLine()方法可以讀取一行字符(不包含換行符號)
- BufferedWriter的newLine()可以輸出一個跨平臺的換行符號"\r\n"
- BufferedReader br = new BufferedReader(new FileReader("aaa.txt")); BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt")); String line; while((line = br.readLine()) != null) {bw.write(line);//bw.write("\r\n"); //只支持windows系統(tǒng)bw.newLine(); //跨平臺的 }br.close(); bw.close();
????
package com.heima.chario;import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException;public class Demo4_Buffered {/*** @param args* 帶緩沖區(qū)的流中的特殊方法* readLine()* newLine();* * newLine()與\r\n的區(qū)別* newLine()是跨平臺的方法* \r\n只支持的是windows系統(tǒng)* @throws IOException */public static void main(String[] args) throws IOException {//demo1();BufferedReader br = new BufferedReader(new FileReader("zzz.txt"));BufferedWriter bw = new BufferedWriter(new FileWriter("aaa.txt"));String line;while((line = br.readLine()) != null) {bw.write(line);//bw.newLine(); //寫出回車換行符//bw.write("\r\n");}br.close();bw.close();}public static void demo1() throws FileNotFoundException, IOException {BufferedReader br = new BufferedReader(new FileReader("zzz.txt"));String line;while((line = br.readLine()) != null) {System.out.println(line);}br.close();}}21.09_IO流(將文本反轉(zhuǎn))
- 將一個文本文檔上的文本反轉(zhuǎn),第一行和倒數(shù)第一行交換,第二行和倒數(shù)第二行交換
????
package com.heima.test;import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList;public class Test1 {/*** @param args* 將一個文本文檔上的文本反轉(zhuǎn),第一行和倒數(shù)第一行交換,第二行和倒數(shù)第二行交換* * 分析:* 1,創(chuàng)建輸入輸出流對象* 2,創(chuàng)建集合對象* 3,將讀到的數(shù)據(jù)存儲在集合中* 4,倒著遍歷集合將數(shù)據(jù)寫到文件上* 5,關流* @throws IOException * * 注意事項:* 流對象盡量晚開早關*/public static void main(String[] args) throws IOException {//改寫后是盡量晚開早關// 1,創(chuàng)建輸入輸出流對象BufferedReader br = new BufferedReader(new FileReader("zzz.txt"));//2,創(chuàng)建集合對象ArrayList<String> list = new ArrayList<>();//3,將讀到的數(shù)據(jù)存儲在集合中String line;while((line = br.readLine()) != null) {list.add(line);}br.close(); //關流//4,倒著遍歷集合將數(shù)據(jù)寫到文件上BufferedWriter bw = new BufferedWriter(new FileWriter("revzzz.txt"));for(int i = list.size() - 1; i >= 0; i--) {bw.write(list.get(i));bw.newLine();}//5,關流bw.close();}}21.10_IO流(LineNumberReader)
- LineNumberReader是BufferedReader的子類, 具有相同的功能, 并且可以統(tǒng)計行號
- 調(diào)用getLineNumber()方法可以獲取當前行號
- 調(diào)用setLineNumber()方法可以設置當前行號
- LineNumberReader lnr = new LineNumberReader(new FileReader("aaa.txt")); String line; lnr.setLineNumber(100); //設置行號 while((line = lnr.readLine()) != null) {System.out.println(lnr.getLineNumber() + ":" + line);//獲取行號 }lnr.close();
????
package com.heima.chario;import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.LineNumberReader;public class Demo5_LineNumberReader {/*** @param args* @throws IOException */public static void main(String[] args) throws IOException {LineNumberReader lnr = new LineNumberReader(new FileReader("zzz.txt"));String line;lnr.setLineNumber(100);while((line = lnr.readLine()) != null) {System.out.println(lnr.getLineNumber() + ":" + line);}lnr.close();}}21.11_IO流(裝飾設計模式)
- interface Coder {public void code(); }class Student implements Coder {@Overridepublic void code() {System.out.println("javase");System.out.println("javaweb");}}class HeiMaStudent implements Coder {private Student s; //獲取到被包裝的類的引用public HeiMaStudent(Student s) { //通過構造函數(shù)創(chuàng)建對象的時候,傳入被包裝的對象this.s = s;}@Overridepublic void code() { //對其原有功能進行升級s.code();System.out.println("數(shù)據(jù)庫");System.out.println("ssh");System.out.println("安卓");System.out.println(".....");}}
????
package com.heima.chario;public class Demo6_Wrap {/*** @param args* 裝飾設計模式的好處是:* 耦合性不強,被裝飾的類的變化與裝飾類的變化無關*/public static void main(String[] args) {HeiMaStudent hms = new HeiMaStudent(new Student());hms.code();}}interface Coder {public void code(); }class Student implements Coder {@Overridepublic void code() {System.out.println("javase");System.out.println("javaweb");}}class HeiMaStudent implements Coder {//1,獲取被裝飾類的引用private Student s; //獲取學生引用//2,在構造方法中傳入被裝飾類的對象public HeiMaStudent(Student s) {this.s = s;}//3,對原有的功能進行升級@Overridepublic void code() {s.code();System.out.println("ssh");System.out.println("數(shù)據(jù)庫");System.out.println("大數(shù)據(jù)");System.out.println("...");} }21.12_IO流(使用指定的碼表讀寫字符)
- FileReader是使用默認碼表讀取文件, 如果需要使用指定碼表讀取, 那么可以使用InputStreamReader(字節(jié)流,編碼表)
- FileWriter是使用默認碼表寫出文件, 如果需要使用指定碼表寫出, 那么可以使用OutputStreamWriter(字節(jié)流,編碼表)
- BufferedReader br = //高效的用指定的編碼表讀new BufferedReader(new InputStreamReader(new FileInputStream("UTF-8.txt"), "UTF-8")); BufferedWriter bw = //高效的用指定的編碼表寫new BufferedWriter(new OutputStreamWriter(new FileOutputStream("GBK.txt"), "GBK")); int ch; while((ch = br.read()) != -1) {bw.write(ch); }br.close(); bw.close();
????
package com.heima.chario;import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException;public class Demo7_TransIO {/*** @param args* @throws IOException */public static void main(String[] args) throws IOException {//demo1();//demo2();BufferedReader br = //更高效的讀new BufferedReader(new InputStreamReader(new FileInputStream("utf-8.txt"), "utf-8"));BufferedWriter bw = //更高效的寫new BufferedWriter(new OutputStreamWriter(new FileOutputStream("gbk.txt"), "gbk"));int c;while((c = br.read()) != -1) {bw.write(c);}br.close();bw.close();}public static void demo2() throws UnsupportedEncodingException,FileNotFoundException, IOException {InputStreamReader isr = new InputStreamReader(new FileInputStream("utf-8.txt"), "uTf-8"); //指定碼表讀字符OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("gbk.txt"), "gbk"); //指定碼表寫字符int c;while((c = isr.read()) != -1) {osw.write(c);}isr.close();osw.close();}public static void demo1() throws FileNotFoundException, IOException {//用默認編碼表讀寫,出現(xiàn)亂碼FileReader fr = new FileReader("utf-8.txt"); FileWriter fw = new FileWriter("gbk.txt");int c;while((c = fr.read()) != -1) {fw.write(c);}fr.close();fw.close();}}21.13_IO流(轉(zhuǎn)換流圖解)
- 畫圖分析轉(zhuǎn)換流
21.14_IO流(獲取文本上字符出現(xiàn)的次數(shù))
- 獲取一個文本上每個字符出現(xiàn)的次數(shù),將結(jié)果寫在times.txt上
21.15_IO流(試用版軟件)
- 當我們下載一個試用版軟件,沒有購買正版的時候,每執(zhí)行一次就會提醒我們還有多少次使用機會用學過的IO流知識,模擬試用版軟件,試用10次機會,執(zhí)行一次就提示一次您還有幾次機會,如果次數(shù)到了提示請購買正版
????
package com.heima.test;import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException;public class Test4 {/*** 當我們下載一個試用版軟件,沒有購買正版的時候,每執(zhí)行一次就會提醒我們還有多少次使用機會用學過的IO流知識,模擬試用版軟件,* 試用10次機會,執(zhí)行一次就提示一次您還有幾次機會,如果次數(shù)到了提示請購買正版* @throws IOException * 分析:* 1,創(chuàng)建帶緩沖的輸入流對象,因為要使用readLine方法,可以保證數(shù)據(jù)的原樣性* 2,將讀到的字符串轉(zhuǎn)換為int數(shù)* 3,對int數(shù)進行判斷,如果大于0,就將其--寫回去,如果不大于0,就提示請購買正版* 4,在if判斷中要將--的結(jié)果打印,并將結(jié)果通過輸出流寫到文件上*/public static void main(String[] args) throws IOException {//1,創(chuàng)建帶緩沖的輸入流對象,因為要使用readLine方法,可以保證數(shù)據(jù)的原樣性BufferedReader br = new BufferedReader(new FileReader("config.txt"));//2,將讀到的字符串轉(zhuǎn)換為int數(shù)String line = br.readLine();int times = Integer.parseInt(line); //將數(shù)字字符串轉(zhuǎn)換為數(shù)字//3,對int數(shù)進行判斷,如果大于0,就將其--寫回去,如果不大于0,就提示請購買正版if(times > 0) {//4,在if判斷中要將--的結(jié)果打印,并將結(jié)果通過輸出流寫到文件上System.out.println("您還有" + times-- + "次機會");FileWriter fw = new FileWriter("config.txt");fw.write(times + "");fw.close();}else {System.out.println("您的試用次數(shù)已到,請購買正版");}//關閉流br.close();}}21.16_File類(遞歸)
- 5的階乘????
21.17_File類(練習)
- 需求:從鍵盤輸入接收一個文件夾路徑,打印出該文件夾下所有的.java文件名
????
package com.heima.test;import java.io.File; import java.io.FileReader; import java.util.Scanner;public class Test5 {/*** 需求:從鍵盤輸入接收一個文件夾路徑,打印出該文件夾下所有的.java文件名* * 分析:* 從鍵盤接收一個文件夾路徑* 1,如果錄入的是不存在,給與提示* 2,如果錄入的是文件路徑,給與提示* 3,如果是文件夾路徑,直接返回* * 打印出該文件夾下所有的.java文件名* 1,獲取到該文件夾路徑下的所有的文件和文件夾,存儲在File數(shù)組中* 2,遍歷數(shù)組,對每一個文件或文件夾做判斷* 3,如果是文件,并且后綴是.java的,就打印* 4,如果是文件夾,就遞歸調(diào)用*/public static void main(String[] args) {File dir = getDir();printJavaFile(dir);}/** 獲取鍵盤錄入的文件夾路徑* 1,返回值類型File* 2,不需要有參數(shù)*/public static File getDir() {Scanner sc = new Scanner(System.in); //創(chuàng)建鍵盤錄入對象System.out.println("請輸入一個文件夾路徑");while(true) {String line = sc.nextLine(); //將鍵盤錄入的文件夾路徑存儲File dir = new File(line); //封裝成File對象if(!dir.exists()) {System.out.println("您錄入的文件夾路徑不存在,請重新錄入");}else if(dir.isFile()) {System.out.println("您錄入的是文件路徑,請重新錄入文件夾路徑");}else {return dir;}}}/** 獲取文件夾路徑下的所.java文件* 1,返回值類型 void* 2,參數(shù)列表File dir*/public static void printJavaFile(File dir) {//1,獲取到該文件夾路徑下的所有的文件和文件夾,存儲在File數(shù)組中File[] subFiles = dir.listFiles();//2,遍歷數(shù)組,對每一個文件或文件夾做判斷for (File subFile : subFiles) {//3,如果是文件,并且后綴是.java的,就打印if(subFile.isFile() && subFile.getName().endsWith(".java")) {System.out.println(subFile);//4,如果是文件夾,就遞歸調(diào)用}else if (subFile.isDirectory()){printJavaFile(subFile);}}} }21.18_IO流(總結(jié))
- 1.會用BufferedReader讀取GBK碼表和UTF-8碼表的字符
- 2.會用BufferedWriter寫出字符到GBK碼表和UTF-8碼表的文件中
- 3.會使用BufferedReader從鍵盤讀取一行
轉(zhuǎn)載于:https://my.oschina.net/u/3668429/blog/1928665
總結(jié)
以上是生活随笔為你收集整理的JAVA语言基础-面向对象(IO:IO字符流、递归)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用bootstrap插件设置时间
- 下一篇: MAVEN简介之——settings.x