Java中以字符流形式操作文件中的编码问题

来源:互联网 发布:淘宝美工助手破解 编辑:程序博客网 时间:2024/06/11 02:57

Java中以字符流形式操作文件中的编码问题

原创 2015年08月07日 12:06:42
参考《编码解码模型和实现》,以字符流形式操作文件的时候,一定要指定正确的编码方案,否则会出现乱码等问题。

以字符流形式操作文件包括两种情形:以字符流的形式读取文件内容,将字符流写入文件中。


一、以字符流的形式读取文件内容
现在有一个文件a.txt,文件内容为“你好,Java程序”,采用UTF-8编码。接下来做2个实验。

1、实验1

实验代码:

[java] view plain copy
  1. package com.dslztx;  
  2.   
  3.   
  4. import java.io.*;  
  5. import java.nio.charset.Charset;  
  6.   
  7.   
  8. public class Encoding {  
  9.     public static void main(String[] args) throws IOException {  
  10.         BufferedReader reader =  
  11.                 new BufferedReader(new InputStreamReader(new FileInputStream("a.txt"), Charset.forName("utf-8")));  
  12.         String line;  
  13.         while ((line = reader.readLine()) != null)  
  14.             System.out.println(line);  
  15.     }  
  16. }  

实验结果:



2、实验2

实验代码:

[java] view plain copy
  1. package com.dslztx;  
  2.   
  3.   
  4. import java.io.*;  
  5. import java.nio.charset.Charset;  
  6.   
  7.   
  8. public class Encoding {  
  9.     public static void main(String[] args) throws IOException {  
  10.         BufferedReader reader =  
  11.                 new BufferedReader(new InputStreamReader(new FileInputStream("a.txt"), Charset.forName("gbk")));  
  12.         String line;  
  13.         while ((line = reader.readLine()) != null)  
  14.             System.out.println(line);  
  15.     }  
  16. }  

实验结果:




现在有一个文件b.txt,文件内容如下,采用UTF-8编码。接下来做2个实验。

[plain] view plain copy
  1. 你好  
  2. 你好这是第一行  
  3. #Footer  
  4. Java程序  
  5. 你好这是第二行  


3、实验3

实验代码:
[java] view plain copy
  1. package com.dslztx;  
  2.   
  3.   
  4. import java.io.*;  
  5. import java.nio.charset.Charset;  
  6. import java.util.Scanner;  
  7.   
  8.   
  9. public class Encoding {  
  10.     public static void main(String[] args) throws IOException {  
  11.         Scanner scanner = new Scanner(new File("b.txt"), "utf-8");  
  12.         scanner.useDelimiter("\\r\\n#Footer\\r\\n");  
  13.         while (scanner.hasNext())  
  14.             System.out.println(scanner.next());  
  15.     }  
  16. }  

实验结果:



4、实验4

实验代码:
[java] view plain copy
  1. package com.dslztx;  
  2.   
  3.   
  4. import java.io.*;  
  5. import java.nio.charset.Charset;  
  6. import java.util.Scanner;  
  7.   
  8.   
  9. public class Encoding {  
  10.     public static void main(String[] args) throws IOException {  
  11.         Scanner scanner = new Scanner(new File("b.txt"), "gbk");  
  12.         scanner.useDelimiter("\\r\\n#Footer\\r\\n");  
  13.         while (scanner.hasNext())  
  14.             System.out.println(scanner.next());  
  15.     }  
  16. }  

实验结果:


分析:

由于乱码,导致scanner.hasNext()返回值为false


二、将字符流写入文件中
将字符流写入文件中,做2个实验。
1、实验1
实验代码:
[java] view plain copy
  1. package com.dslztx;  
  2.   
  3.   
  4. import java.io.*;  
  5. import java.nio.charset.Charset;  
  6. import java.util.Scanner;  
  7.   
  8.   
  9. public class Encoding {  
  10.     public static void main(String[] args) throws IOException {  
  11.         BufferedWriter writer =  
  12.                 new BufferedWriter(new OutputStreamWriter(new FileOutputStream("c.txt"), Charset.forName("utf-8")));  
  13.         writer.write("你好,Java程序");  
  14.         writer.close();  
  15.     }  
  16. }  
实验结果:

查看c.txt文件的字节流如下图所示



2、实验2

实验代码:
[java] view plain copy
  1. package com.dslztx;  
  2.   
  3.   
  4. import java.io.*;  
  5. import java.nio.charset.Charset;  
  6. import java.util.Scanner;  
  7.   
  8.   
  9. public class Encoding {  
  10.     public static void main(String[] args) throws IOException {  
  11.         BufferedWriter writer =  
  12.                 new BufferedWriter(new OutputStreamWriter(new FileOutputStream("c.txt"), Charset.forName("gbk")));  
  13.         writer.write("你好,Java程序");  
  14.         writer.close();  
  15.     }  
  16. }  
实验结果:


当没有明确指定需要使用的字符编码方案时,Java程序通过“java.nio.charset.Charset.defaultCharset().name()”语句来获取默认的字符编码方案,该语句返回的值跟运行Java程序的操作系统的设置有关,在有些操作系统上,该语句返回值可能是UTF-8;在有些操作系统上,该语句返回值可能是GBK;在有些操作系统上,该语句返回值可能是除了UTF-8和GBK以外的其他字符编码方案。这样子,程序的可移植性大大降低。

版权声明:本文为博主原创文章,未经博主允许不得转载。
 
wsf1992
  • wsf1992

    2017-08-24 18:251楼
  • 厉害
阅读全文
0 0
原创粉丝点击