Java面向对象
Java异常
Java数组
Java常用类
Java集合
Java IO流
Java线程
Java反射
Socket编程
Java注解开发
Java GoF设计模式
HashMap
Java内存模型
Java线性表

Java文件字符输入输出流

字符流是以字符为单位处理流中的数据, 也可以说是以字符为单位读写文件的内容。

FileReader/FileWriter字符流只能读写纯文本文件, 并且要求文本文件的编码与当前环境的编码要兼容。

package com.wkcto.chapter06.readerwriter;

import java.io.FileReader;
import java.io.IOException;

/**
 * FileReader/FileWriter字符流
 * 	1)只能读写纯文本文件
 * 	2)要求文本文件的编码与当前环境的编码兼容
 * @author 蛙课网
 *
 */
public class Test01 {

	public static void main(String[] args) throws IOException {
		//1)使用FileReader读取文本文件: d:/abc.txt中的内容, 该文件使用GBK编码, 文件中全部是英文字符
//		readFile1();
		
		//2) 读取d:/log.txt文件的内容, 该文件使用UTF-8编码, 文件中有中文也有英文字符
		readFile2();
		
	}

	//使用FileReader读取文件, 一次读取一个字符数组
	private static void readFile2() throws IOException {
		FileReader fReader = new FileReader("d:/log.txt");
//		FileReader fReader = new FileReader("d:/test01.java");   //该文件使用GBK编码,当前环境使用UTF-8编码, 文件中有中文也有英文
		
		char [] contents = new char[8];
		
		//从文件中读取字符保存到字符数组中, 返回读到的字符个数, 如果读到文件末尾返回-1
		int len = fReader.read(contents);
		while( len != -1 ){
			//把读到的len个字符转换为字符串打印到屏幕上
			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()读取一个字符, 返回该字符的码值, 读到文件末尾返回-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
 * 	可以把字符保存到文本文件中, 该文本文件要与当前环境编码兼容
 * @author 蛙课网
 *
 */
public class Test02 {

	public static void main(String[] args) throws IOException {
//		FileWriter fw = new FileWriter("d:/def.txt"); 		//以覆盖的方式打开 文件,如果原来的文件格式是GBK,写入后文件的格式变为UTF-8
		FileWriter fw = new FileWriter("d:/def.txt", true); //以追加的方式打开 文件,如果原来的文件格式是GBK,写入后文件会出现乱码
		
		//一次写一个字符
		fw.write('A');
		fw.write('中');
		
		//一次写一个字符数组
		char [] contents = "wkcto是一个NB的网站".toCharArray(); 
		fw.write(contents);
		
		fw.write("还可以一次写一个字符串");
		
		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实现文本文件的复制
 * 		文本文件的编码要与当前环境的编码兼容
 * @author 蛙课网
 *
 */
public class Test03 {

	public static void main(String[] args) {
		String  srcfile = "d:/test.java";
		String  destfile = "d:/javase/wk.txt"	;
		
//		copyfile( srcfile, destfile) ; 		//逐个字符复制, 异常处理, 手动关闭流
		copyfile2( srcfile, destfile) ; 	//一次复制一个字符数组, 异常处理, 自动关闭流
	}

	//一次复制一个字符数组, 异常处理, 自动关闭流
	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) {
		}
	}

	//逐个字符复制, 异常处理, 手动关闭流
	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);
				//继续读下个字符
				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();
				}
			}
		}
		
		
	}

}