字符流FileReader
* 1.字符流是什麼
* 字符流是可以直接讀寫字符的IO流
* 字符流讀取字符, 就要先讀取到字節數據, 然後轉爲字符. 如果要寫出字符, 需要把字符轉爲字節再寫出.
* 2.FileReader
* FileReader類的read()方法可以按照字符大小讀取
*
FileReader fr = new FileReader("aaa.txt"); //創建輸入流對象,關聯aaa.txt
int ch;
while((ch = fr.read()) != -1) { //將讀到的字符賦值給ch
System.out.println((char)ch); //將讀到的字符強轉後打印
}
fr.close(); //關流
字符流FileWriter
* FileWriter類的write()方法可以自動把字符轉爲字節寫出
FileWriter fw = new FileWriter("aaa.txt");
fw.write("aaa");
fw.close();
字符流的拷貝
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();
什麼情況下使用字符流
* 字符流也可以拷貝文本文件, 但不推薦使用. 因爲讀取時會把字節轉爲字符, 寫出時還要把字符轉回字節.
* 程序需要讀取一段文本, 或者需要寫出一段文本的時候可以使用字符流
* 讀取的時候是按照字符的大小讀取的,不會出現半個中文
* 寫出的時候可以直接將字符串寫出,不用轉換爲字節數組
字符流是否可以拷貝非純文本的文件
* 不可以拷貝非純文本的文件
* 因爲在讀的時候會將字節轉換爲字符,在轉換過程中,可能找不到對應的字符,就會用?代替,寫出的時候會將字符轉換成字節寫出去
* 如果是?,直接寫出,這樣寫出之後的文件就亂了,看不了了
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();
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) { //將文件上的數據讀取到字符數組中
fw.write(arr,0,len); //將字符數組中的數據寫到文件上
}
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的小緩衝區,如果不關流,就會將內容寫到緩衝區裏,關流會將緩衝區內容刷新,再關閉
}
}
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的write()是寫入一行
* 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 Demo4_Buffered {
/**
* @param args
* 帶緩衝區的流中的特殊方法
* readLine()
* newLine();
*
* newLine()與\r\n的區別
* newLine()是跨平臺的方法
* \r\n只支持的是windows系統
* @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();
}
}
例題
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
* 將一個文本文檔上的文本反轉,第一行和倒數第一行交換,第二行和倒數第二行交換
*
* 分析:
* 1,創建輸入輸出流對象
* 2,創建集合對象
* 3,將讀到的數據存儲在集合中
* 4,倒着遍歷集合將數據寫到文件上
* 5,關流
* @throws IOException
*
* 注意事項:
* 流對象儘量晚開早關
*/
public static void main(String[] args) throws IOException {
//改寫後是儘量晚開早關
// 1,創建輸入輸出流對象
BufferedReader br = new BufferedReader(new FileReader("zzz.txt"));
//2,創建集合對象
ArrayList<String> list = new ArrayList<>();
//3,將讀到的數據存儲在集合中
String line;
while((line = br.readLine()) != null) {
list.add(line);
}
//4,倒着遍歷集合將數據寫到文件上
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,關流
br.close();
bw.close();
}
}