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()方法对文件名的处理方式也是与系统语言环境有关。
相关推荐
Filepath (String): 编码文件保存路径 输出: Code: 哈夫曼编码的输出结果,为 uint8 的数组 Info: 计算得到的编码各指标分析数值结构体 函数功能: 将输入的图像进行哈夫曼变长编码压缩,将编码结果写入路径...
java程序文件字符编码转换器 JLabel labsuffix = new JLabel("指定文件的后缀"); JLabel labCharacter = new JLabel("选择转换方式"); JLabel labfiletext = new JLabel("正在处理"); JTextArea jTextArea = new...
本文件在前人工作的基础上完成,详见以下内容。 nvo_base64在pb8中导出的文件,需要有项目将此文件导入。...关于这个编码的规则: ①把3个字符变成4个字符 ②每76个字符加一个换行符 ③最后的结束符也要处理 */
解决Lua文件反编译后汉字乱码问题。开发环境vs2013,语言c#
PHP用mb_string函数库处理与windows相关中文字符 昨天想批处理以前下载的一堆文件,把文件里的关键内容用正则匹配出来,集中处理。在操作文件时遇到一个问题,就是windows操作系统中的编码问题。 我们都知道windows...
编写一个Inventory.java完成以下功能(没有学过Java文件处理之前,各位同学可以使用硬编码将数据放进两个Vector变量里。等学过Java文件处理之后,再补充数据文件读取部分): 1.程序首先打开并读取Inventory.txt中...
第四章 文件命名规范 10 1.数据库命名规范 10 1.1、数据文件命名规范 10 1.2、数据库表命名规范 10 1.3、数据库字段命名规范 10 1.4、数据库视图命名规范 11 1.5、存储过程命名规范 11 1.6、SQL语句编写规范 11 2....
//try-with-resources语法,不用手动的编码关闭流 try (Stream<String> lines = Files.lines( filePath )) { lines.forEach(System.out::println); } catch (IOException e) { e.printStackTrace();//只是测试...
│ ├AlipayNotify.cs┈┈┈┈┈支付宝通知处理类文件 │ │ │ ├AlipaySubmit.cs┈┈┈┈┈支付宝各接口请求提交类文件 │ │ │ └MD5.cs ┈┈┈┈┈┈┈┈┈MD5类库 │ ├log┈┈┈┈┈┈┈┈┈┈┈┈┈...
在处理外部数据的时候,很可能因为数据格式不一样而导致乱码,甚至导致某些程序挂掉。鉴于对多数系统来说,使用是更被广泛使用的utf8,所以判断是不是utf8格式显得很重要了。 下面是一个判断字符串是否为utf8的函数...
// 设置字符编码为UTF-8, 统一编码,处理出现乱码问题 response.setCharacterEncoding("UTF-8"); // 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload DiskFileItemFactory dfif = new ...
-- 系统常量定义,定义上传文件字符集编码 --> <constant name="struts.i18n.encoding" value="UTF-8"></constant> <!-- 系统常量定义,定义上传文件临时存放路径 --> ...
// 设置字符编码为UTF-8, 统一编码,处理出现乱码问题 response.setCharacterEncoding("UTF-8"); // 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload DiskFileItemFactory dfif = new ...
对于此分配,您将在string1.py和string2.py文件中编码一些字符串处理函数。 根据参数传递和返回值,对了解在python中的工作方式有一些依存关系,但是您应该能够随时进行了解。 指示 根据您对Python字符串,索引,...
目录需求实现– 上传文件– java编码&.xml配置一、java编码1、接口编码摘要1.1、添加spingmvc注解,让一个java类能够处理请求1.2、接口的入参和出参2、方法使用2.1、File类的File(String parent, String child&#...
网友netstarry写的一个处理字符编码的类,很好的解决了php中字符转换的问题 前一阵子见到了qiushuiwuhen君的关于gbk,unicode,big5的转换的文章 但是多少有一些不太大的问题 于是我设计了一个负责字符转换的类,...
关于并发处理,下列哪些说法符合《阿里巴巴Java开发手册》:ABC A .线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。 B .同步处理时,能锁部分代码区块的情况下不要锁整个方法;高并发时,同步...
base64模块是用来作base64编码解码的。这种编码方式在电子邮件中是很常见的。...他们8个可以两两分为4组,encode,decode一组,专门用来编码和 解码文件的,也可以对StringIO里的数据做编解码;encodestring,dec