摘要:字符流字符流是什么字符流是可以直接讀寫字符的流字符流讀取字符就要先讀取到字節(jié)數(shù)據(jù)然后轉(zhuǎn)為字符如果要寫出字符需要把字符轉(zhuǎn)為字節(jié)再寫出類的方法可以按照字符大小讀取通過項(xiàng)目默認(rèn)的碼表一次讀取一個字符賦值給將讀到的字符強(qiáng)轉(zhuǎn)后打印字符流類的方法可以
1_字符流FileReader
1.字符流是什么
字符流是可以直接讀寫字符的IO流
字符流讀取字符, 就要先讀取到字節(jié)數(shù)據(jù), 然后轉(zhuǎn)為字符. 如果要寫出字符, 需要把字符轉(zhuǎn)為字節(jié)再寫出.
2.FileReader
FileReader類的read()方法可以按照字符大小讀取
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class Demo1_FileReader { public static void main(String[] args) throws IOException { // demo1(); FileReader fr = new FileReader("xxx.txt"); int c; while((c = fr.read()) != -1) { //通過項(xiàng)目默認(rèn)的碼表一次讀取一個字符,賦值給c System.out.print((char)c); //將讀到的字符強(qiáng)轉(zhuǎn)后打印 } fr.close(); } private 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(); } }2_字符流FileWriter
FileWriter類的write()方法可以自動把字符轉(zhuǎn)為字節(jié)寫出
import java.io.FileWriter; import java.io.IOException; public class Demo2_fileWriter { public static void main(String[] args) throws IOException { FileWriter fw = new FileWriter("yyy.txt"); fw.write("大家好,SE快學(xué)完了!"); fw.write(97); fw.close(); } }3_字符流的拷貝
import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class Demo3_Copy { public static void main(String[] args) throws 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(); //Writer類中有一個2k的小緩沖區(qū),如果不關(guān)流,就會將內(nèi)容寫到緩沖區(qū)里,關(guān)流會將緩沖區(qū)內(nèi)容寫出并結(jié)束 fw.close(); } }4_什么情況下使用字符流
字符流也可以拷貝文本文件, 但不推薦使用. 因?yàn)樽x取時會把字節(jié)轉(zhuǎn)為字符, 寫出時還要把字符轉(zhuǎn)回字節(jié).
程序需要讀取一段文本, 或者需要寫出一段文本的時候可以使用字符流
讀取的時候是按照字符的大小讀取的,不會出現(xiàn)半個中文
寫出的時候可以直接將字符串寫出,不用轉(zhuǎn)換為字節(jié)數(shù)組
5_字符流是否可以拷貝非純文本的文件不可以拷貝非純文本的文件
因?yàn)樵谧x的時候會將字節(jié)轉(zhuǎn)換為字符,在轉(zhuǎn)換過程中,可能找不到對應(yīng)的字符,就會用?代替,寫出的時候會將字符轉(zhuǎn)換成字節(jié)寫出去,如果是?,直接寫出,這樣寫出之后的文件就亂了,看不了了。
6_自定義字符數(shù)組的拷貝public static void main(String[] args) throws 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(); }7_帶緩沖的字符流
BufferedReader的read()方法讀取字符時會一次讀取若干字符到緩沖區(qū), 然后逐個返回給程序, 降低讀取文件的次數(shù), 提高效率
BufferedWriter的write()方法寫出字符時會先寫到緩沖區(qū), 緩沖區(qū)寫滿時才會寫到文件, 降低寫文件的次數(shù), 提高效率
public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new FileReader("xxx.txt")); BufferedWriter bw = new BufferedWriter(new FileWriter("yyy.txt")); int c; while((c = br.read()) != -1) { //read一次,會先將緩沖區(qū)讀滿,從緩沖去中一個一個的返給臨時變量c bw.write(c); //write一次,是將數(shù)據(jù)裝到字符數(shù)組,裝滿后再一起寫出去 } br.close(); bw.close(); }8_readLine()和newLine()方法
BufferedReader的readLine()方法可以讀取一行字符(不包含換行符號)
BufferedWriter的newLine()可以輸出一個跨平臺的換行符號"rn"
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 { 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(" "); //只支持windows系統(tǒng) } br.close(); bw.close(); } private 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(); } }9_將文本反轉(zhuǎn)
將一個文本文檔上的文本反轉(zhuǎn),第一行和倒數(shù)第一行交換,第二行和倒數(shù)第二行交換
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; public class Demo5_test { public static void main(String[] args) throws IOException { //1.創(chuàng)建輸入輸出流對象 BufferedReader br = new BufferedReader(new FileReader("zzz.txt")); //2.創(chuàng)建集合對象 ArrayList10_LineNumberReaderlist = new ArrayList<>(); //3.將讀到的數(shù)據(jù)存儲在集合中 String line; while((line = br.readLine()) != null) { list.add(line); } br.close();//晚開早關(guān) //4.倒著遍歷集合將數(shù)據(jù)寫到文件上 BufferedWriter bw = new BufferedWriter(new FileWriter("revzzz.txt"));//晚開早關(guān) for (int i = list.size() - 1; i >= 0; i--) { bw.write(list.get(i)); bw.newLine(); } //5.關(guān)流 bw.close(); } }
LineNumberReader是BufferedReader的子類, 具有相同的功能, 并且可以統(tǒng)計(jì)行號
調(diào)用getLineNumber()方法可以獲取當(dāng)前行號
調(diào)用setLineNumber()方法可以設(shè)置當(dāng)前行號
import java.io.FileReader; import java.io.IOException; import java.io.LineNumberReader; public class Demo6_LineNumberReader { public static void main(String[] args) throws IOException { LineNumberReader lnr = new LineNumberReader(new FileReader("zzz.txt")); String line; lnr.setLineNumber(100); //設(shè)置行號 while((line = lnr.readLine()) != null) { System.out.println(lnr.getLineNumber() + ":" + line); //獲取行號 } lnr.close(); } }11_裝飾設(shè)計(jì)模式
優(yōu)點(diǎn):耦合性不強(qiáng),被裝飾的類的變化與裝飾類的變化無關(guān)
public class Demo7_Wrap { public static void main(String[] args) { AllIdea ai = new AllIdea(new Student()); ai.code(); } } interface Coder{ public void code(); } class Student implements Coder{ @Override public void code() { System.out.println("JavaSE"); System.out.println("JavaWEB"); } } class AllIdea implements Coder{ //1.獲取被裝飾類的引用 private Student s; //2.在構(gòu)造方法中傳入被裝飾的對象 public AllIdea(Student s) { this.s = s; } //3.對原有的功能進(jìn)行升級 @Override public void code() { s.code(); System.out.println("mysql"); System.out.println("spring"); } }12_使用指定的碼表讀寫字符
FileReader是使用默認(rèn)碼表讀取文件, 如果需要使用指定碼表讀取, 那么可以使用InputStreamReader(字節(jié)流,編碼表)
FileWriter是使用默認(rèn)碼表寫出文件, 如果需要使用指定碼表寫出, 那么可以使用OutputStreamWriter(字節(jié)流,編碼表)
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 Demo8_TransIO { 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(); } private 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(); } private static void demo1() throws FileNotFoundException, IOException { //用默認(rèn)碼表讀寫,出現(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(); } }13_轉(zhuǎn)換流圖解
畫圖分析轉(zhuǎn)換流
14_獲取文本上字符出現(xiàn)的次數(shù)獲取一個文本上每個字符出現(xiàn)的次數(shù),將結(jié)果寫在times.txt上
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.TreeMap; public class Demo91_test { public static void main(String[] args) throws IOException { //1.創(chuàng)建帶緩沖的輸入流對象 BufferedReader br = new BufferedReader(new FileReader("zzz.txt")); //2.創(chuàng)建雙列集合對象TreeMap TreeMap15_試用版軟件tm = new TreeMap<>(); //3.將讀到的字符存儲在雙列集合中,存儲的時候要做判斷,如果不包含這個鍵,就將鍵和1存儲, //如果包含這個鍵,就將該鍵和值加1存儲 int ch; while((ch = br.read()) != -1) { char c = (char)ch; //向下強(qiáng)制類型轉(zhuǎn)換 /*if(!tm.containsKey(c)) { tm.put(c, 1); }else { tm.put(c, tm.get(c) + 1); }*/ tm.put(c, !tm.containsKey(c) ? 1 : tm.get(c) + 1); } //4.關(guān)閉輸入流 br.close(); //5.創(chuàng)建輸出流對象 BufferedWriter bw = new BufferedWriter(new FileWriter("times.txt")); //6.遍歷集合將集合中的內(nèi)容寫到times.txt中 for (Character key : tm.keySet()) { switch (key) { case " ": bw.write(" " + "=" + tm.get(key)); break; case " ": bw.write(" " + "=" + tm.get(key)); break; case " ": bw.write(" " + "=" + tm.get(key)); break; default: bw.write(key + "=" + tm.get(key)); //寫出鍵和值 break; } bw.newLine(); } //7.關(guān)閉輸出流 bw.close(); } }
當(dāng)我們下載一個試用版軟件,沒有購買正版的時候,每執(zhí)行一次就會提醒我們還有多少次使用機(jī)會用學(xué)過的IO流知識,模擬試用版軟件,試用10次機(jī)會,執(zhí)行一次就提示一次您還有幾次機(jī)會,如果次數(shù)到了提示請購買正版
import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class Demo92_test { public static void main(String[] args) throws IOException { //1.創(chuàng)建帶緩沖的輸入流對象,因?yàn)橐褂胷eadLine方法,可以保證數(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ù)進(jìn)行判斷,如果大于0,就將其一一寫回去,如果不大于0,就提示請購買正版。 if(times > 0) { //4.在if判斷中要將--的結(jié)果打印,并將結(jié)果通過輸出流寫到文件上 System.out.println("您還有" + times-- + "次機(jī)會"); FileWriter fw = new FileWriter("config.txt"); fw.write(times-- + ""); fw.close(); }else { System.out.println("您的試用次數(shù)已到,請購買正版"); } br.close(); } }16_File類(遞歸)
概念:方法自己調(diào)用自己
弊端:是不能調(diào)用次數(shù)過多,容易導(dǎo)致棧內(nèi)存溢出
好處:不用知道循環(huán)次數(shù)
構(gòu)造方法不能試用遞歸調(diào)用
遞歸調(diào)用是否必須有返回值(可以有也可以沒有)
案例:5的階乘(5!)
5 * 4 * 3 * 2 * 1 5 * fun(4)(代表4!) 4 * fun(3)(代表3!) 3 * fun(2)(代表2!) 2 * fun(1)(代表1!)
public class Demo93_recursive { public static void main(String[] args) { // demo1(); System.out.println(fun(10)); } public static int fun(int num) { if(num == 1) { return 1; }else { return num * fun(num - 1); } } private static void demo1() { int result = 1; for(int i = 1; i <= 5; i++) { result = result * i; } System.out.println(result); } }17_File類(練習(xí))
需求:從鍵盤輸入接收一個文件夾路徑,打印出該文件夾下所有的.java文件名
import java.io.File; import java.util.Scanner; public class Demo94_test { 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); 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); } } } }18_總結(jié)
1.會用BufferedReader讀取GBK碼表和UTF-8碼表的字符
2.會用BufferedWriter寫出字符到GBK碼表和UTF-8碼表的文件中
3.會使用BufferedReader從鍵盤讀取一行
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/77326.html
摘要:一面試題及剖析今日面試題今天壹哥帶各位復(fù)習(xí)一塊可能會令初學(xué)者比較頭疼的內(nèi)容,起碼當(dāng)時讓我很有些頭疼的內(nèi)容,那就是流。在這里壹哥會從兩部分展開介紹流,即與流。除此之外盡量使用字節(jié)流。關(guān)閉此輸入流并釋放與流相關(guān)聯(lián)的任何系統(tǒng)資源。 一. 面試題及剖析 1. 今日面試題 今天 壹哥 帶各位復(fù)習(xí)一塊可...
摘要:但它融合了和的功能。支持對隨機(jī)訪問文件的讀取和寫入。的概述和作為集合的使用了解的概述類表示了一個持久的屬性集。可保存在流中或從流中加載。屬性列表中每個鍵及其對應(yīng)值都是一個字符串。 1_序列流(了解) 1.什么是序列流 序列流可以把多個字節(jié)輸入流整合成一個, 從序列流中讀取數(shù)據(jù)時, 將從被整合的第一個流開始讀, 讀完一個之后繼續(xù)讀第二個, 以此類推. 2.使用方式 整合兩個: S...
摘要:字符輸出流是所有字符輸出流的最頂層的父類是一個抽象類共性的成員方法寫入單個字符。寫入字符串的某一部分字符串的開始索引寫的字符個數(shù)。刷新該流的緩沖。文件字符輸出流作用把內(nèi)存中字符數(shù)據(jù)寫入到文件中構(gòu)造方法根據(jù)給定的對象構(gòu)造一個對象。 package com.itheima.Demo05Writer; import java.io.FileWriter;import java.io.IOEx...
摘要:是字符流通向字節(jié)流的橋梁可使用指定的將要寫入流中的字符編碼成字節(jié)。編碼把能看懂的變成看不懂繼續(xù)自父類的共性成員方法寫入單個字符。刷新該流的緩沖。關(guān)閉此流,但要先刷新它。構(gòu)造方法創(chuàng)建使用默認(rèn)字符編碼的。 package com.itheima.demo03.ReverseStream; import java.io.FileOutputStream;import java.io.IOEx...
摘要:是字節(jié)流通向字符流的橋梁它使用指定的讀取字節(jié)并將其解碼為字符。解碼把看不懂的變成能看懂的繼承自父類的共性成員方法讀取單個字符并返回。一次讀取多個字符將字符讀入數(shù)組。關(guān)閉該流并釋放與之關(guān)聯(lián)的所有資源。構(gòu)造方法創(chuàng)建一個使用默認(rèn)字符集的。 package com.itheima.demo03.ReverseStream; import java.io.FileInputStream;impo...
閱讀 6927·2021-09-22 15:08
閱讀 1930·2021-08-24 10:03
閱讀 2443·2021-08-20 09:36
閱讀 1320·2020-12-03 17:22
閱讀 2479·2019-08-30 15:55
閱讀 911·2019-08-29 16:13
閱讀 3059·2019-08-29 12:41
閱讀 3254·2019-08-26 12:12