day 21FileWriter 和FileReader

21.01_IO流(字符流FileReader)
* 1.字符流是什麼
* 字符流是能夠直接讀寫字符的IO流
* 字符流讀取字符, 就要先讀取到字節數據, 而後轉爲字符. 若是要寫出字符, 須要把字符轉爲字節再寫出.
* 2.FileReader
FileReader類的read()方法能夠按照字符大小讀取java

FileReader fr = new FileReader("aaa.txt"); //建立輸入流對象,關聯aaa.txt
int ch;
while((ch = fr.read()) != -1) { //將讀到的字符賦值給ch
System.out.println((char)ch); //將讀到的字符強轉後打印(要強制轉換)
}

fr.close();

21.02_IO流(字符流FileWriter)
* FileWriter類的write()方法能夠自動把字符轉爲字節寫出windows

FileWriter fw = new FileWriter("aaa.txt");
fw.write("aaa");
fw.close();
直接寫出,不用像FileOutputStream同樣還有.getBytes;數組

###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(); ui


字符流和字節流的區別
* 字符流也能夠拷貝文本文件, 但不推薦使用. 由於讀取時會把字節轉爲字符, 寫出時還要把字符轉回字節.
* 程序須要讀取一段文本, 或者須要寫出一段文本的時候能夠使用字符流
* 讀取的時候是按照字符的大小讀取的,不會出現半個中文
* 寫出的時候能夠直接將字符串寫出,不用轉換爲字節數組
對象

21.05_IO流(字符流是否能夠拷貝非純文本的文件)
* 不能夠拷貝非純文本的文件遞歸

21.06_IO流(自定義字符數組的拷貝)
*

FileReader fr = new FileReader("aaa.txt"); //建立字符輸入流,關聯aaa.txt
FileWriter fw = new FileWriter("bbb.txt"); //建立字符輸出流,關聯bbb.txt

int len;
char[] arr = new char[1024*8]; //建立字符數組
while((len = fr.read(arr)) != -1) { //將數據讀到字符數組中
fw.write(arr, 0, len); //從字符數組將數據寫到文件上
}

fr.close(); //關流釋放資源
fw.close(); 資源


21.07_IO流(帶緩衝的字符流)
* BufferedReader的read()方法讀取字符時會一次讀取若干字符到緩衝區, 而後逐個返回給程序, 下降讀取文件的次數, 提升效率
* BufferedWriter的write()方法寫出字符時會先寫到緩衝區, 緩衝區寫滿時纔會寫到文件, 下降寫文件的次數, 提升效率
*
BufferedReader br = new BufferedReader(new FileReader("aaa.txt")); //建立字符輸入流對象,關聯aaa.txt
BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt")); //建立字符輸出流對象,關聯bbb.txt

int ch;
while((ch = br.read()) != -1) { //read一次,會先將緩衝區讀滿,從緩衝去中一個一個的返給臨時變量ch
bw.write(ch); //write一次,是將數據裝到字符數組,裝滿後再一塊兒寫出去
}

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系統
bw.newLine(); //直接換行 //跨平臺的
}

br.close();
bw.close(); 字符串


如下是程序重點,將文本反轉
* 將一個文本文檔上的文本反轉,第一行和倒數第一行交換,第二行和倒數第二行交換
* */
public class Test1 {get

public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader b = new BufferedReader(new FileReader("xxx.txt"));
ArrayList<String> list = new ArrayList<>();
String line;
while ((line = b.readLine()) != null) {
list.add(line);
}
b.close();
//
BufferedWriter bw = new BufferedWriter(new FileWriter("zzz.txt"));
for (int i = list.size() - 1; i > 0; i--) {
bw.write(list.get(i));
bw.newLine();
}
bw.close();
}
}

 

獲取文本字符出現的次數
//獲取一個文本上每一個字符出現的次數,將結果寫在times.txt上
public class Test2 {
public static void main(String args[]) throws IOException {
BufferedReader bu = new BufferedReader(new FileReader("xxx.txt"));
HashMap<Character, Integer> hm = new HashMap<>();
int c;
while ((c = bu.read()) != -1) {
char ch = (char) c;
hm.put(ch, !hm.containsKey(ch) ? 1 : hm.get(ch) + 1);
}
bu.close();
BufferedWriter bw = new BufferedWriter(new FileWriter("lixiaowei.txt"));
for (Character key : hm.keySet()) {
bw.write(key + " = " + hm.get(key));
bw.newLine();
}
bw.close();//

}

}
//另一種清晰的方法,更好的突出換行 回車空格等

//獲取一個文本上每一個字符出現的次數,將結果寫在times.txt上
public class Test2 {
public static void main(String args[]) throws IOException {
BufferedReader bu = new BufferedReader(new FileReader("xxx.txt"));
HashMap<Character, Integer> hm = new HashMap<>();
int c;
while ((c = bu.read()) != -1) {
char ch = (char) c;
hm.put(ch, !hm.containsKey(ch) ? 1 : hm.get(ch) + 1);
}
bu.close();
BufferedWriter bw = new BufferedWriter(new FileWriter("liyan.txt"));
for (Character key : hm.keySet()) {
bw.write(key + " = " + hm.get(key));
bw.newLine();
}
bw.close();

}

 

最後就是文件遞歸等
//從鍵盤輸入接收一個文件夾路徑,打印出該文件夾下全部的.java文件名
public class digui {
public static void main(String[] args) {
// TODO Auto-generated method stub
File f = getDir();
printJavaFile(f);
}

public static File getDir() {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入一個文件夾路徑");
while (true) {
String path = sc.nextLine();
File fi = new File(path);
if (!fi.exists()) {
System.out.println("您錄入的文件不存在");
} else if (fi.isFile()) {
System.out.println("您輸入的是文件");
} else {
return fi;
}
}
}

public static void printJavaFile(File ff) {
File[] s = ff.listFiles();
for (File ss : s) {
if (ss.isFile() && ss.getName().endsWith("java")) {
System.out.println(ss);
} else if (ss.isDirectory()) {
printJavaFile(ss);
}
}

}
}

}

相關文章
相關標籤/搜索