您的位置:首页 > 编程语言 > Java开发

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

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

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

一、以字符流的形式读取文件内容

现在有一个文件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以外的其他字符编码方案。这样子,程序的可移植性大大降低。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: