`
orange5458
  • 浏览: 347632 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

String编码(四) 关于文件处理

 
阅读更多

1.简介

分析JAVA对文件的处理机制。

2.读文件

JAVA中读文件的方式有直接使用FileReader和使用InputStreamReader。

1)FileReader

通过API可知,FileReader将使用默认字符编码处理文件。

1.1)在D:\FileReaderTest创建两个相同内容的TXT文件,fileReaderTest-GBK.txt和fileReaderTest-UTF8.txt

I AM 中国人

 1.2)通过FileReader读取文件内容

package com.siyuan.jdk.test;

import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Arrays;

import org.apache.commons.io.IOUtils;

public class FileReaderTest {

	public static void main(String[] args) throws IOException {
		System.out.println(Charset.defaultCharset());
		
//		String fileName = "D:/FileReaderTest/fileReaderTest-GBK.txt";
		String fileName = "D:/FileReaderTest/fileReaderTest-UTF8.txt";
		FileReader reader = null;
		try {
			reader = new FileReader(fileName);
			char[] cBuf = new char[1024];
			int length = -1;
			while ((length = reader.read(cBuf, 0, cBuf.length)) != -1) {
				System.out.print(Arrays.copyOfRange(cBuf, 0, length));
			}
		} finally {
			IOUtils.closeQuietly(reader);
		}
		
	}

}

  输出结果:

fileReaderTest-GBK.txt

GBK
I AM 中国人

 fileReaderTest-UTF8.txt

GBK
I AM 涓浗浜?

 通过运行参数-Dfile.encoding="UTF-8"修改默认字符编码输出结果如下:

fileReaderTest-GBK.txt

UTF-8
I AM �й�

 fileReaderTest-UTF8.txt

UTF-8
I AM 中国人

 1.3)结论

FileReader使用默认字符编码将文件字节流解码为字符,即Charset.defaultCharset(),可通过运行参数进行修改。

2)InputStreamReader

可以通过向构造函数里头传递字符编码信息来指定字节解码方式。

package com.siyuan.jdk.test;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.commons.io.IOUtils;

public class InputStreamReaderTest {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		String fileName = "D:/FileReaderTest/fileReaderTest-GBK.txt";
		String charset = "GBK";
//		String fileName = "D:/FileReaderTest/fileReaderTest-UTF8.txt";
//		String charset = "UTF-8";
		BufferedReader bufReader = null;
		try {
			bufReader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), charset));
			String buf = null;
			while ((buf = bufReader.readLine()) != null) {
				System.out.println(buf);
			}
		} finally {
			IOUtils.closeQuietly(bufReader); // 关闭处理流(装饰)即可关闭底层的字节流
		}
		
	}

}

 注:必须保证传递的字符编码必须和文件内容编码一致,否则将出错。

3.写文件

FileWriter和OutputStreamWriter的区别也和上述一致。

4.文件名的处理

在D:\FileReaderTest创建一个名为"文件名测试.txt"的文件,在不同的默认编码下获取文件名

4.1)程序代码

package com.siyuan.jdk.test;

import java.io.File;
import java.nio.charset.Charset;

public class FileNameTest {

	public static void main(String[] args) {
		System.out.println(Charset.defaultCharset());
		
		File file = new File("D:/FileReaderTest");
		if (file.isDirectory()) 
			for (File tmp : file.listFiles())
				System.out.println(tmp.getName());
	}

}

 4.2)运行结果

默认编码为GBK

GBK
fileReaderTest-GBK.txt
fileReaderTest-UTF8.txt
文件名测试.txt

 默认编码为UTF-8

UTF-8
fileReaderTest-GBK.txt
fileReaderTest-UTF8.txt
文件名测试.txt

 4.3)推断

通过查看源代码发现获取文件名的方法为native类型,从而推断出获取文件名时与系统语言环境相关,而与JVM默认编码无关。

4.4)论证

为了更好的论证结论,将该文件和修改后的程序上传至Linux系统中

打开两个shell窗口,通过export LANG=“zh_CN.UTF-8”和export LANG=“zh_CN.GBK”设置两个不同的语言环境

结果发现:UTF-8环境下会出现乱码,GBK为正常。

可以用同样的方式论证File.createNewFile()方法对文件名的处理方式也是与系统语言环境有关。

分享到:
评论

相关推荐

    基于Matlab实现灰度图像赫夫曼编码(数字图像处理实验).zip

    Filepath (String): 编码文件保存路径 输出: Code: 哈夫曼编码的输出结果,为 uint8 的数组 Info: 计算得到的编码各指标分析数值结构体 函数功能: 将输入的图像进行哈夫曼变长编码压缩,将编码结果写入路径...

    java程序文件字符编码转换器

    java程序文件字符编码转换器 JLabel labsuffix = new JLabel("指定文件的后缀"); JLabel labCharacter = new JLabel("选择转换方式"); JLabel labfiletext = new JLabel("正在处理"); JTextArea jTextArea = new...

    base64编码解码用于pb8pb9pb12.5等

    本文件在前人工作的基础上完成,详见以下内容。 nvo_base64在pb8中导出的文件,需要有项目将此文件导入。...关于这个编码的规则: ①把3个字符变成4个字符 ②每76个字符加一个换行符 ③最后的结束符也要处理 */

    Lua文件反编译汉字乱码处理

    解决Lua文件反编译后汉字乱码问题。开发环境vs2013,语言c#

    PHP用mb_string函数库处理与windows相关中文字符及Win环境下开启PHP Mb_String方法

    PHP用mb_string函数库处理与windows相关中文字符 昨天想批处理以前下载的一堆文件,把文件里的关键内容用正则匹配出来,集中处理。在操作文件时遇到一个问题,就是windows操作系统中的编码问题。 我们都知道windows...

    基于java的货物进销管理系统

    编写一个Inventory.java完成以下功能(没有学过Java文件处理之前,各位同学可以使用硬编码将数据放进两个Vector变量里。等学过Java文件处理之后,再补充数据文件读取部分): 1.程序首先打开并读取Inventory.txt中...

    ASP.NET编码规范

    第四章 文件命名规范 10 1.数据库命名规范 10 1.1、数据文件命名规范 10 1.2、数据库表命名规范 10 1.3、数据库字段命名规范 10 1.4、数据库视图命名规范 11 1.5、存储过程命名规范 11 1.6、SQL语句编写规范 11 2....

    用java8 Stream流的方式对文本文件逐行处理–.docx

    //try-with-resources语法,不用手动的编码关闭流 try (Stream<String> lines = Files.lines( filePath )) { lines.forEach(System.out::println); } catch (IOException e) { e.printStackTrace();//只是测试...

    c#支付宝标准双接口实现

    │ ├AlipayNotify.cs┈┈┈┈┈支付宝通知处理类文件 │ │ │ ├AlipaySubmit.cs┈┈┈┈┈支付宝各接口请求提交类文件 │ │ │ └MD5.cs ┈┈┈┈┈┈┈┈┈MD5类库 │ ├log┈┈┈┈┈┈┈┈┈┈┈┈┈...

    C++实现判断一个字符串是否为UTF8或GBK格式的方法

    在处理外部数据的时候,很可能因为数据格式不一样而导致乱码,甚至导致某些程序挂掉。鉴于对多数系统来说,使用是更被广泛使用的utf8,所以判断是不是utf8格式显得很重要了。 下面是一个判断字符串是否为utf8的函数...

    java结合jsp写的上传文件代码

    // 设置字符编码为UTF-8, 统一编码,处理出现乱码问题 response.setCharacterEncoding("UTF-8"); // 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload DiskFileItemFactory dfif = new ...

    Struts2上传文件出错

    -- 系统常量定义,定义上传文件字符集编码 --> <constant name="struts.i18n.encoding" value="UTF-8"></constant> <!-- 系统常量定义,定义上传文件临时存放路径 --> ...

    Jsp文件上传下载(工具类源码)

    // 设置字符编码为UTF-8, 统一编码,处理出现乱码问题 response.setCharacterEncoding("UTF-8"); // 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload DiskFileItemFactory dfif = new ...

    se-q3-string1-string2

    对于此分配,您将在string1.py和string2.py文件中编码一些字符串处理函数。 根据参数传递和返回值,对了解在python中的工作方式有一些依存关系,但是您应该能够随时进行了解。 指示 根据您对Python字符串,索引,...

    需求实现– 上传文件– java编码&.xml配置

    目录需求实现– 上传文件– java编码&.xml配置一、java编码1、接口编码摘要1.1、添加spingmvc注解,让一个java类能够处理请求1.2、接口的入参和出参2、方法使用2.1、File类的File(String parent, String child&#...

    Encoding

    网友netstarry写的一个处理字符编码的类,很好的解决了php中字符转换的问题 前一阵子见到了qiushuiwuhen君的关于gbk,unicode,big5的转换的文章 但是多少有一些不太大的问题 于是我设计了一个负责字符转换的类,...

    阿里巴巴编码规范 基础技能认证 考题分析(考题+答案).docx

    关于并发处理,下列哪些说法符合《阿里巴巴Java开发手册》:ABC A .线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。 B .同步处理时,能锁部分代码区块的情况下不要锁整个方法;高并发时,同步...

    详解Python中使用base64模块来处理base64编码的方法

    base64模块是用来作base64编码解码的。这种编码方式在电子邮件中是很常见的。...他们8个可以两两分为4组,encode,decode一组,专门用来编码和 解码文件的,也可以对StringIO里的数据做编解码;encodestring,dec

Global site tag (gtag.js) - Google Analytics