字符流的读写相关


字符流是什么
	* 字符流是可以直接读写字符的IO流
	* 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写出.    

类 FileReader

java.lang.Object
——java.io.Reader
————java.io.InputStreamReader
——————java.io.FileReader
所有已实现的接口: 
Closeable, Readable 
public class FileReader extends InputStreamReader
用于读取字符流

public FileReader(String fileName) throws FileNotFoundException
	在给定从中读取数据的文件名的情况下创建一个新 FileReader。

public FileReader(File file) throws FileNotFoundException
	在给定从中读取数据的 File 的情况下创建一个新 FileReader。 

FileReader没有自己特有的方法,都是从自己的父类继承的
FileReader类的read()方法可以按照字符大小读取.通过项目默认的码表一次读取一个字符
 

 类 FileWriter

java.lang.Object
 ——java.io.Writer
————java.io.OutputStreamWriter
——————java.io.FileWriter
所有已实现的接口: 
Closeable, Flushable, Appendable 
public class FileWriterextends OutputStreamWriter
用于写入字符流
如果所涉及的文件已经打开,则此类中的构造方法将失败。 

public FileWriter(String fileName) throws IOException
	根据给定的文件名构造一个 FileWriter 对象。 

public FileWriter(String fileName, boolean append) throws IOException
	根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。 
	参数:
	fileName - 一个字符串,表示与系统有关的文件名。
	append - 一个 boolean 值,如果为 true,则将数据写入文件末尾处,而不是写入文件开始处。 

public FileWriter(File file) throws IOException
	根据给定的 File 对象构造一个 FileWriter 对象。 
 
public FileWriter(File file, boolean append) throws IOException
	根据给定的 File 对象构造一个 FileWriter 对象。
	如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处。


FileWriter类没有自己特有的方法,都是从自己的父类继承的的
FileWriter类 write()方法可以自动把字符转为字节写出

public class a {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		FileReader fr = new FileReader("xxx.txt");
		int x = fr.read();
		System.out.println(x);//22909
		char c = (char)x;
		System.out.println(c);//好
		fr.close();

		
		FileReader fr1 = new FileReader("xxx.txt");
		int c1;
		while((c1 = fr1.read()) != -1) {//通过项目默认的码表一次读取一个字符
			System.out.print((char)c1);
		}
		fr1.close();
		
		
		FileWriter fw = new FileWriter("yyy.txt");
		fw.write("大家好!!!");
		fw.write(97);//大家好!!!a
		fw.close();
	}
}


什么情况下使用字符流

字符流也可以拷贝文本文件, 但不推荐使用. 因为读取时会把字节转为字符, 写出时还要把字符转回字节,转换效率低
	程序需要读取一段文本, 或者需要写出一段文本(只读或只写)的时候可以使用字符流
		* 读取的时候是按照字符的大小读取的,不会出现半个中文
		* 写出的时候可以直接将字符串写出,不用转换为字节数组
 
 字符流是否可以拷贝非纯文本的文件
 	不可以拷贝非纯文本的文件
	因为在读的时候会将字节转换为字符,在转换过程中,在码表中可能找不到对应的字符,就会用?代替,写出的时候会将字符转换成字节写出去
 	如果是?,直接写出,这样写出之后的文件就乱了,看不了了 

拷贝实例

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();
		//fw.close();注释掉则不能写出	
		//Writer类中有一个2k(1024个字符)的小缓冲区,如果不关流,就会将内容写到缓冲区里,关流会将缓冲区内容刷新,再关闭
自定义字符数组的拷贝

public static void main(String[] args) throws IOException {

		// 自定义字符数组的拷贝
		FileReader fr1 = new FileReader("xxx.txt");
		FileWriter fw1 = new FileWriter("m.txt");
		
		char[] arr1 = new char[1024];//1024整数倍
		int len;
		while((len = fr1.read(arr1)) != -1) {//将文件上的数据读取到字符数组中
			fw1.write(arr1,0,len);	//将字符数组中的数据写到文件上
			//从arr[0]开始,写len个
			fw1.write(arr1,1,len);
			//从arr[1]开始,写len个,字符流和字节流大多都类似,可以相互理解
		}
		fr1.close();
		fw1.close();
	}


类 BufferedReader

java.lang.Object
——java.io.Reader
————java.io.BufferedReader
所有已实现的接口: 
Closeable, Readable 
直接已知子类: 
LineNumberReader 
public class BufferedRead erextends Reader
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取

类 BufferedWriter

java.lang.Object
——java.io.Writer
————java.io.BufferedWriter
所有已实现的接口: 
Closeable, Flushable, Appendable 
public class BufferedWriterextends Writer
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 

public BufferedWriter(Writer out)
	创建一个使用默认大小输出缓冲区的缓冲字符输出流。 

public BufferedWriter(Writer out, int sz)
	创建一个使用给定大小输出缓冲区的新缓冲字符输出流。 

public void newLine() throws IOException
	写入一个行分隔符。
newLine()可以输出一个跨平台的换行符号"\r\n"
newLine()与\r\n的区别
	 * newLine()是跨平台的方法
	 * \r\n只支持的是windows系统

 


read()方法
	 读取字符时会一次读取若干字符到缓冲区, 然后逐个返回给程序, 降低读取文件的次数, 提高效率
write()方法
	 写出字符时会先写到缓冲区, 缓冲区写满时才会写到文件, 降低写文件的次数, 提高效率
(缓冲区大小为8*1024个字符)
readLine()方法可以读取一行字符(不包含换行符号)

public class d {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new FileReader("xxx.txt"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt"));
		
		int ch;				
		while((ch = br.read()) != -1) {	
			//read一次,会先将缓冲区读满,从缓冲去中一个一个的返给临时变量ch
			bw.write(ch);	//write一次,是将数据装到字符数组,装满后再一起写出去
		}
		
		br.close();	//关流
		bw.close();  
		
		
		
		BufferedReader br1 = new BufferedReader(new FileReader("bbb.txt"));
		String line;
		while((line = br1.readLine()) != null) {
			System.out.println(line);
			//System.out.print(line);
		}
		br1.close();
		
		
		
		BufferedReader br2 = new BufferedReader(new FileReader("zzz.txt"));
		BufferedWriter bw2 = new BufferedWriter(new FileWriter("aaa.txt"));
		
		String line1;
		while((line1 = br2.readLine()) != null) {
			bw2.write(line1);//没有回车换行
			bw2.newLine();	//写出回车换行符 ok,跨平台
			//bw2.write("\r\n");//只支持windows系统
		}
		
		br2.close();
		bw2.close();
	}
}


类 LineNumberReader

java.lang.Object
——java.io.Reader
————java.io.BufferedReader
——————java.io.LineNumberReader
所有已实现的接口: 
Closeable, Readable 
public class LineNumberRead erextends BufferedReader
跟踪行号的缓冲字符输入流

 LineNumberReader是BufferedReader的子类, 具有相同的功能, 并且可以统计行号
     * 调用getLineNumber()方法可以获取当前行号
	* 调用setLineNumber()方法可以设置当前行号
	* read()一次!= null,则LineNumber++一次,当前行号将加 1。


public class f {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		LineNumberReader lnr = new LineNumberReader(new FileReader("zzz.txt"));
		
		String line;
		//lnr.setLineNumber(100);//设置行号,从101开始
		while((line = lnr.readLine()) != null) {
			//
			System.out.println(lnr.getLineNumber() + ":" + line);//获取行号,从1开始
		}
		
		lnr.close();

	}

}


使用指定的码表读写字符

FileReader是使用默认码表读取文件, 
如果需要使用指定码表读取, 那么可以使用InputStreamReader(字节流,编码表)

类 InputStreamReader

java.lang.Object
——java.io.Reader
————java.io.InputStreamReader
所有已实现的接口: 
Closeable, Readable 
直接已知子类: 
FileReader 
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。
它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。


public InputStreamReader(InputStream in, Charset cs)
创建使用给定字符集的 InputStreamReader。

FileWriter是使用默认码表写出文件, 
如果需要使用指定码表写出, 那么可以使用OutputStreamWriter(字节流,编码表)


public class h {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		//用默认编码表读写,出现乱码
		FileReader fr = new FileReader("utf.txt");//你好				
		FileWriter fw = new FileWriter("gbk.txt");//浣犲ソ
		int c;
		while((c = fr.read()) != -1) {
			fw.write(c);
		}
		fr.close();
		fw.close();

		
		
		InputStreamReader isr = new InputStreamReader(new FileInputStream("utf.txt"), "uTf-8");//指定码表读字符
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("gbk.txt"), "gbk");//指定码表写字符
		//编码表可以大写可以小写也可以大小写
		int c1;
		while((c1 = isr.read()) != -1) {
			osw.write(c1);//你好
		}
		isr.close();
		osw.close();
		
		
		//更高效
		BufferedReader br = new BufferedReader(
				new InputStreamReader(new FileInputStream("utf.txt"), "utf-8"));
		BufferedWriter bw = new BufferedWriter(
				new OutputStreamWriter(new FileOutputStream("gbk.txt"), "gbk"));
		int c2;
		while((c2 = br.read()) != -1) {
			bw.write(c2);
		}
		br.close();
		bw.close();
	}

}



小问题
eclipse在选择编码选项中没有GBK格式的,我重下了好几次都没有,我是win7,但在在XP下有GBK编码选项
解决
并不是说不可以选就没有的,你可以自己填写上去的,
我填的是GBK,此时Eclipse会自动记录的。
当然,现在都不推荐使用GBK编码了,因为不利于系统迁移,数据库转型,扩展性等。尤其是数据库以后转编码是最麻烦的,我
建议还是使用UTF-8吧,几乎所有系统都支持,而且方便日后国际化。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值