字符流是以字符為單位處理流中的數(shù)據(jù), 也可以說(shuō)是以字符為單位讀寫文件的內(nèi)容。
FileReader/FileWriter字符流只能讀寫純文本文件, 并且要求文本文件的編碼與當(dāng)前環(huán)境的編碼要兼容。
package com.wkcto.chapter06.readerwriter;
import java.io.FileReader;
import java.io.IOException;
/**
* FileReader/FileWriter字符流
* 1)只能讀寫純文本文件
* 2)要求文本文件的編碼與當(dāng)前環(huán)境的編碼兼容
* @author 蛙課網(wǎng)
*
*/
public class Test01 {
public static void main(String[] args) throws IOException {
//1)使用FileReader讀取文本文件: d:/abc.txt中的內(nèi)容, 該文件使用GBK編碼, 文件中全部是英文字符
// readFile1();
//2) 讀取d:/log.txt文件的內(nèi)容, 該文件使用UTF-8編碼, 文件中有中文也有英文字符
readFile2();
}
//使用FileReader讀取文件, 一次讀取一個(gè)字符數(shù)組
private static void readFile2() throws IOException {
FileReader fReader = new FileReader("d:/log.txt");
// FileReader fReader = new FileReader("d:/test01.java"); //該文件使用GBK編碼,當(dāng)前環(huán)境使用UTF-8編碼, 文件中有中文也有英文
char [] contents = new char[8];
//從文件中讀取字符保存到字符數(shù)組中, 返回讀到的字符個(gè)數(shù), 如果讀到文件末尾返回-1
int len = fReader.read(contents);
while( len != -1 ){
//把讀到的len個(gè)字符轉(zhuǎn)換為字符串打印到屏幕上
System.out.print( new String(contents, 0 ,len ));
len = fReader.read(contents);
}
fReader.close();
}
private static void readFile1() throws IOException {
FileReader fr = new FileReader("d:/abc.txt");
//read()讀取一個(gè)字符, 返回該字符的碼值, 讀到文件末尾返回-1
int cc = fr.read();
while( cc != -1 ){
System.out.print( (char)cc );
cc = fr.read();
}
fr.close();
}
}
package com.wkcto.chapter06.readerwriter;
import java.io.FileWriter;
import java.io.IOException;
/**
* FileWriter
* 可以把字符保存到文本文件中, 該文本文件要與當(dāng)前環(huán)境編碼兼容
* @author 蛙課網(wǎng)
*
*/
public class Test02 {
public static void main(String[] args) throws IOException {
// FileWriter fw = new FileWriter("d:/def.txt"); //以覆蓋的方式打開 文件,如果原來(lái)的文件格式是GBK,寫入后文件的格式變?yōu)閁TF-8
FileWriter fw = new FileWriter("d:/def.txt", true); //以追加的方式打開 文件,如果原來(lái)的文件格式是GBK,寫入后文件會(huì)出現(xiàn)亂碼
//一次寫一個(gè)字符
fw.write('A');
fw.write('中');
//一次寫一個(gè)字符數(shù)組
char [] contents = "wkcto是一個(gè)NB的網(wǎng)站".toCharArray();
fw.write(contents);
fw.write("還可以一次寫一個(gè)字符串");
fw.write("\r\n"); //換行
fw.close();
}
}
package com.wkcto.chapter06.readerwriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* 使用FileReader/FileWriter實(shí)現(xiàn)文本文件的復(fù)制
* 文本文件的編碼要與當(dāng)前環(huán)境的編碼兼容
* @author 蛙課網(wǎng)
*
*/
public class Test03 {
public static void main(String[] args) {
String srcfile = "d:/test.java";
String destfile = "d:/javase/wk.txt" ;
// copyfile( srcfile, destfile) ; //逐個(gè)字符復(fù)制, 異常處理, 手動(dòng)關(guān)閉流
copyfile2( srcfile, destfile) ; //一次復(fù)制一個(gè)字符數(shù)組, 異常處理, 自動(dòng)關(guān)閉流
}
//一次復(fù)制一個(gè)字符數(shù)組, 異常處理, 自動(dòng)關(guān)閉流
private static void copyfile2(String srcfile, String destfile) {
try (
FileReader fr = new FileReader(srcfile);
FileWriter fw = new FileWriter(destfile);
){
char [] contents = new char[1024];
int len = fr.read(contents);
while( len != -1 ){
fw.write(contents, 0, len);
len = fr.read(contents);
}
} catch (Exception e) {
}
}
//逐個(gè)字符復(fù)制, 異常處理, 手動(dòng)關(guān)閉流
private static void copyfile(String srcfile, String destfile) {
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader(srcfile);
fw = new FileWriter(destfile);
int cc = fr.read();
while( cc != -1 ){
//把讀到的字符cc保存到fw輸出流中
fw.write(cc);
//繼續(xù)讀下個(gè)字符
cc = fr.read();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if ( fr != null ) {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fw != null) {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}