本篇博客主要介绍字符流FileWirter和FileReader流,主要用于操作文件内容。
一.FileWriter(文件输出字符流)
FileWriter与FileOutputStream类似,不过FileWriter是字符流,而FileOutputStream是字节流。
构造方法:
1.public File(FIle file)throws IOException------根据File创建FileWriter实例
2.public File(File file,boolean append)throws IOException--------根据File创建FileWriter实例,当append为true 时追加内容到原内容后面
使用示例:
public static void main(String[] args) { File file=new File("L:\\test.txt"); try { //创建一个字符输出流对象,true表示内容追加 Writer wr=new FileWriter(file,true); String info="好好学习,天天向上"; //向文件中输出 wr.write(info); //关闭流 wr.close(); } catch (IOException e) { e.printStackTrace(); }
一.FileReader(文件输入字符流)
FileReader与FileInputStream类似,不过FileReader是字符流,而FileInputStream是字节流。
具体示例:
public static void main(String[] args) { File file=new File("L:\\test.txt"); try { //创建一个字符输入流对象 Reader in=new FileReader(file); //设置指定长度字符数组读取 char []cs=new char[7]; StringBuffer sb=new StringBuffer(); int len=-1; //读取文件 while((len=in.read(cs))!=-1) { sb.append(new String(cs,0,len)); } System.out.println("文件内容为: "+sb); //关闭流 in.close(); } catch (IOException e) { e.printStackTrace(); } }
运行结果:
此时我们把换成用字节输入流FileInputStream来读取,如下:
public static void main(String[] args) { File file=new File("L:\\test.txt"); try { //创建一个字节输入流对象 InputStream in=new FileInputStream(file); //设置指定长度字节数组读取 byte []bytes=new byte[7]; StringBuffer sb=new StringBuffer(); int len=-1; //读取文件 while((len=in.read(bytes))!=-1) { sb.append(new String(bytes,0,len)); } System.out.println("文件内容为: "+sb); //关闭流 in.close(); } catch (IOException e) { e.printStackTrace(); } }
此时的运行结果出现乱码:
不禁会想,第一种字符读取没有出现乱码,而使用字节读取就出现了乱码。
其实FileReader是在FileInputStream的基础上实现的,看FileReader源码可知。
字符流是按一个个字符为单位来读取,字节流是按一个个字节为单位来读取。所以我们就可以理解为什么字节流读取汉字有时会出现乱码的原因了。在这里是因为我们每次读取7个字节,而一个汉字可能是2个或3个字节组成,要看使用的编码。当我们取了7个字节后使用new String(bytes,0,len)转化为字符串,可能我们获得了一个汉字的不完整字节导致产生乱码。然后我们字节读取是最基础的,是正确的,任何基于字节的操作都是正确的,当我们需要读取的文本有汉字时建议使用字符输入流FileReader防止产生乱码。
相关推荐
描述中的"FileInputReader接收键盘输入的字符串,用FileWirter类将字符串写入文件,用FileReader类读出文件内容显示在屏幕上"进一步阐述了实验的操作流程。首先,用户可能通过键盘输入一些文本,这些文本被`...
常用的类:Array 包装类 BufferedReader BufferedWriter FileReader FileWirter String Integer java.util.Date System Class(反射的核心类) 实现集合接口类HashMap ArrayList LinkedList HashSet java.lang.String ...
派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,...
实现java 进行 目录的创建 读取和写入