Java中以字符流形式操作文件中的编码问题
2015-08-07 12:06
579 查看
参考《编码解码模型和实现》,以字符流形式操作文件的时候,一定要指定正确的编码方案,否则会出现乱码等问题。
以字符流形式操作文件包括两种情形:以字符流的形式读取文件内容,将字符流写入文件中。
一、以字符流的形式读取文件内容
现在有一个文件a.txt,文件内容为“你好,Java程序”,采用UTF-8编码。接下来做2个实验。
1、实验1
实验代码:
实验结果:
2、实验2
实验代码:
实验结果:
现在有一个文件b.txt,文件内容如下,采用UTF-8编码。接下来做2个实验。
3、实验3
实验代码:
实验结果:
4、实验4
实验代码:
实验结果:
分析:
由于乱码,导致scanner.hasNext()返回值为false
二、将字符流写入文件中
将字符流写入文件中,做2个实验。
1、实验1
实验代码:
查看c.txt文件的字节流如下图所示
2、实验2
实验代码:
当没有明确指定需要使用的字符编码方案时,Java程序通过“java.nio.charset.Charset.defaultCharset().name()”语句来获取默认的字符编码方案,该语句返回的值跟运行Java程序的操作系统的设置有关,在有些操作系统上,该语句返回值可能是UTF-8;在有些操作系统上,该语句返回值可能是GBK;在有些操作系统上,该语句返回值可能是除了UTF-8和GBK以外的其他字符编码方案。这样子,程序的可移植性大大降低。
以字符流形式操作文件包括两种情形:以字符流的形式读取文件内容,将字符流写入文件中。
一、以字符流的形式读取文件内容
现在有一个文件a.txt,文件内容为“你好,Java程序”,采用UTF-8编码。接下来做2个实验。
1、实验1
实验代码:
package com.dslztx; import java.io.*; import java.nio.charset.Charset; public class Encoding { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("a.txt"), Charset.forName("utf-8"))); String line; while ((line = reader.readLine()) != null) System.out.println(line); } }
实验结果:
2、实验2
实验代码:
package com.dslztx; import java.io.*; import java.nio.charset.Charset; public class Encoding { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("a.txt"), Charset.forName("gbk"))); String line; while ((line = reader.readLine()) != null) System.out.println(line); } }
实验结果:
现在有一个文件b.txt,文件内容如下,采用UTF-8编码。接下来做2个实验。
你好 你好这是第一行 #Footer Java程序 你好这是第二行
3、实验3
实验代码:
package com.dslztx; import java.io.*; import java.nio.charset.Charset; import java.util.Scanner; public class Encoding { public static void main(String[] args) throws IOException { Scanner scanner = new Scanner(new File("b.txt"), "utf-8"); scanner.useDelimiter("\\r\\n#Footer\\r\\n"); while (scanner.hasNext()) System.out.println(scanner.next()); } }
实验结果:
4、实验4
实验代码:
package com.dslztx; import java.io.*; import java.nio.charset.Charset; import java.util.Scanner; public class Encoding { public static void main(String[] args) throws IOException { Scanner scanner = new Scanner(new File("b.txt"), "gbk"); scanner.useDelimiter("\\r\\n#Footer\\r\\n"); while (scanner.hasNext()) System.out.println(scanner.next()); } }
实验结果:
分析:
由于乱码,导致scanner.hasNext()返回值为false
二、将字符流写入文件中
将字符流写入文件中,做2个实验。
1、实验1
实验代码:
package com.dslztx; import java.io.*; import java.nio.charset.Charset; import java.util.Scanner; public class Encoding { public static void main(String[] args) throws IOException { BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("c.txt"), Charset.forName("utf-8"))); writer.write("你好,Java程序"); writer.close(); } }实验结果:
查看c.txt文件的字节流如下图所示
2、实验2
实验代码:
package com.dslztx; import java.io.*; import java.nio.charset.Charset; import java.util.Scanner; public class Encoding { public static void main(String[] args) throws IOException { BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("c.txt"), Charset.forName("gbk"))); writer.write("你好,Java程序"); writer.close(); } }实验结果:
当没有明确指定需要使用的字符编码方案时,Java程序通过“java.nio.charset.Charset.defaultCharset().name()”语句来获取默认的字符编码方案,该语句返回的值跟运行Java程序的操作系统的设置有关,在有些操作系统上,该语句返回值可能是UTF-8;在有些操作系统上,该语句返回值可能是GBK;在有些操作系统上,该语句返回值可能是除了UTF-8和GBK以外的其他字符编码方案。这样子,程序的可移植性大大降低。
相关文章推荐
- java线程研究---(2)启动Thread
- Spring发送邮件
- 枚举(java.long包中的常用类之一)
- 构建Spring源码问题总结
- hadoop序列化机制与java序列化机制对比
- Struts2里面 s:textfield标签 Date类型的格式化以及日期时间控件使用
- 将文件内容准换为unicode码内容文件(java实现)
- JavaBean基本概念
- java 获取MAC地址
- spring 文件上传功能实现
- Spring web MVC 的一些特点
- eclipse中的快捷键
- Struts2学习笔记《一》
- java后台 jstl输出数据库表中的一组数据&&jstl输出数据库表中的所有数据并放在List集合
- java设计模式-command模式
- Java ConcurrentModificationException 异常分析与解决方案
- Spring 4.2 感知接口
- spring security 一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架
- JAXP(Java API for XMLProcessing)知识总结
- java.io.IOException: Stream closed解决办法