_055_输入输出字符流

=======

之前我们学了FileInputStream字节流,今天是输入字符流
字节流只能读取字节数据,且因为是需要一个字节,所以汉字读取不了,要读取需要用缓存数组的方式
FileInputStream默认是用GBK码表,FileReader也是GBK码表,但是它自带了解码功能

public abstract class Reader 所有读字符流的超类,因为是抽象的,所 以要用实现类
-----------------FileReader 
用法和之前的FileInputStream一样,特性也一样

public abstract class Writer所有写字符流的超类,因为是抽象的,所以要用实现类
-----------------FileWriter
而FileWriter的用法却是和BufferedOutputStream一样,因为FileWriter里面也维护了
一个缓冲数组,然后还需要刷出,刷出还是一样有3个方式,flush,close,还有就是字符数组满了也会刷出
特性和要注意的地方和FileOutputStream一样

注意:
1 用FileInputStream整体来说还是不能读取正常文字,如果2汉字中间有一个字母,因为读取的是字节,所以要读5个字节
   我们缓冲数组填的是4或者4的整数倍,也就是偶数,也就是说总会读出乱码的
   
2 字节流和字符流的应用场景,字符流只有在我们能看懂的数据处可以使用,比如记事本里的正常文本
   而字节流最好是用在我们看不见的数据处,比如图片里的数据,我们能看到图片,但是我们看不懂图片里的数据
   因为图片不是文字,有些码在编码表里面是转不了的,这些转不了的码就会变成1个字节返回,所以我们的文件比原来的字节少了
   所以复制出来的图片是损坏的。这种情况下是要使用字节流的

读取完整的字符

	public static void main(String[] args) throws IOException
	{
		//用字符流FileWriter读取完整数据
		File file1 = new File("D:\\a.txt");
		FileReader fileReader1 = new FileReader(file1);
		char[] arr = new char[4];
		int length = 0;
		StringBuilder sbd_1 = new StringBuilder();
		while ((length = fileReader1.read(arr)) != -1)
		{
			sbd_1.append(arr);
		}
		System.out.println(sbd_1);
	}

输出字符串

class Test
{
	public static void main(String[] args) throws IOException
	{
		  File file1=new File("D:\\1.txt");
		  FileWriter  fileWriter1=new FileWriter(file1);
		  String string="gsa ds感受 dg到 sdh%@6gdseyyfdhj 单方事故";
		  fileWriter1.write(string,0,string.length());
		  fileWriter1.close(); //关闭才会刷出内容
	}
}

猜你喜欢

转载自blog.csdn.net/yzj17025693/article/details/82776092