`
hm4123660
  • 浏览: 278093 次
  • 性别: Icon_minigender_1
  • 来自: 广州
博客专栏
Dea4ce76-f328-3ab2-b24a-fb268e1eeb75
数据结构
浏览量:69006
社区版块
存档分类
最新评论

IO流之FileWirter和FileReader

    博客分类:
  • Java
阅读更多

         本篇博客主要介绍字符流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防止产生乱码。

 

  • 大小: 5.2 KB
  • 大小: 6 KB
  • 大小: 9.9 KB
3
1
分享到:
评论

相关推荐

    rgc.rar_ecliose开发_fileinputreader_rgc_一个关于输入输出流的小实验

    FileInputReader接收键盘输入的字符串,用FileWirter类将字符串写入文件,用FileReader类读出文件内容显示在屏幕上。

    java葵花宝典经典面试ppt

    常用的类:Array 包装类 BufferedReader BufferedWriter FileReader FileWirter String Integer java.util.Date System Class(反射的核心类) 实现集合接口类HashMap ArrayList LinkedList HashSet java.lang.String ...

    超级有影响力霸气的Java面试题大全文档

    派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装:  封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,...

    java 面试题 总结

    派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即...

    JAVA 文件读写

    实现java 进行 目录的创建 读取和写入

Global site tag (gtag.js) - Google Analytics