同理,创建f1和f2方法,分别测试OutputStreamWriter和InputStreamReader
也是主要分三步,即1创建流 2使用流 3关流
OutputStreamWriter f1方法
因为要操作流,所以先创建一个try-catch-finally结构,创建流对象OutputStreamWriter,传参使用FileOutputStream,依然传地址,使用write方法往文件中写入一串字符,去磁盘检查文件即可验证
在记事本中读取的时候,这里可能会出现乱码,就要看看idea的编码和记事本是不是一样的,都在右下角
所以说,这里idea是可以在程序中指定编码的,从而达到编码转换的效果
回到创建FileOutputStream的地方:可以看到FileOutputStream是有好几种重载的构造方法的,后面第二个参数就是指定字符集
可以写入 "gbk" , "iso-8859-1"等
保持写入时的编码和记事本的编码一致,即可在程序写进记事本后,去打开记事本正常查看
InputStreamReader f2方法
这里如果不用记事本,程序写完后,继续使用程序来读取也是可以的
同样因为要操作流,所以先创建一个try-catch-finally结构,创建流对象InputStreamReader,传参使用FileInputStream,依然传上面这个地址,使用read方法从文件中读取出这一串字符
这里发现读取出来的并不是预想之中的字符,而是一串数字
并且在换了几种字符集后,发现不同的编码表 打印出来的数字也不一样的
如果读取的是utf-8 和idea默认读取的编码是同一种,那么读取到的数字就和写入的一样
实际上我们并不是想看这个编码,是想看中文字符内容,下面来完善
1、先动态创建一个长度足够的char数组
2、然后调read方法,将字符数据读到这个数组里面去,返回是数据的长度,不过此时是read的重载的传数组的方法,直接传数组
3、最后调String重载的构造方法,将char数组封装成String
这里传起始下标和数据的长度是因为要读到了几个长度,就封装几个长度,不然会字符串输出完后后面全是空格
注意传的长度是上面接收read方法返回的数据长度,而不是char数组的长度→chars.length !
代码:
到这里还需要补充一点,,回去仔细看控制台输出,会发现字符串的第一个字符没有了,
换了其他字符串写入也是丢失首字符
这是因为在前面还调用read方法读取了一下,而read方法的特性是按顺序读取,且只能读取一次,其实前面已经把第一个字符读了,打印出一个编码数字到控制台,再继续读取后面剩下的字符,就引起了这个问题