最近用Java处理文件的时候,同样遇到了中文问题,觉得还是有必要总结一下,也使该系列的文章更加完整。
熟悉Java 的人都知道,在Java中,IO是分成两大部分的,分别对应字节和字符的操作,也就是Stream和Character,它们之间可以相互转换,桥梁就是StreamInputReader/StreamOutputWriter。为了更加清楚的了解它们之间的关系,我们可以看看它们所在的类结构。
•java.lang.Object
•java.io.InputStream (implements java.io.Closeable)
•java.io.OutputStream (implements java.io.Closeable, java.io.Flushable)
•java.io.RandomAccessFile (implements java.io.Closeable, java.io.DataInput, java.io.DataOutput)
•java.io.Reader (implements java.io.Closeable, java.lang.Readable)
◦java.io.BufferedReader
◦java.io.InputStreamReader
■java.io.FileReade
•java.io.Writer (implements java.lang.Appendable, java.io.Closeable, java.io.Flushable)
◦java.io.BufferedWriter
◦java.io.OutputStreamWriter
■java.io.FileWriter
上面列出来的并不是Java.io中全部的类,但是对于文件读写来说已经足够了。通常,我们使用以下代码来进行文件的读写:
java 代码
1.public void naiveWrite() throws IOException{
2. FileWriter fw = new FileWriter("test.txt");
3. fw.write("中文你好");
4. fw.close();
5. }
6.
7. public String naiveRead() throws IOException{
8. FileReader fr = new FileReader("test.txt");
9. BufferedReader br = new BufferedReader(fr);
10. String str = br.readLine();
11. br.close();
12. fr.close();
13. return str;
14. }
如果我们的是中文平台,上面代码是可以正常运行的。但是如果我们把这些代码放到一个ISO8859-1的系统上,中文问题就出来了(当然,前提你在javac的时指定了编码方式,如javac -encoding gb2312 ***.java,参看该系列前面的文章)。为什么呢?这是因为FileWriter和FileReader是辅助类,为了方便大家使用 OutputSteamWriterer 和 InputStreamReader 而屏蔽了字符集的设定操作,而采用系统默认的编码方式,而这在很多情况下也能满足用户的需求。在中文系统中,系统的默认编码方式一般是GBK,因此文件中中文的读写是没有问题的。但是,当程序运行在ISO8859-1的系统中时,JVM使用ISO8859-1对中文进行编码,当然就认不到了,于是那一个个的问号就来了。
那怎么办呢?既然捷径走不通,我们就只好使用OutputSteamWriter 和 InputStreamReader了。
java 代码
1.public void write() throws IOException{
2. OutputStreamWriter osw = new OutputStreamWriter(
3. new FileOutputStream("test.txt"), "utf-8");
4. osw.write("中国万岁");
5. osw.close();
6. }
7. public String read() throws IOException{
8. InputStreamReader isr = new InputStreamReader(
9. new FileInputStream("test.txt"),"utf-8");
10. BufferedReader br = new BufferedReader(isr);
11. String str = br.readLine();
12. br.close();
13. isr.close();
14. return str;
15. }
在这里,我们指定文件读写的编码方式为utf-8,当然对于中文来说GBK和GB2312也是可以的,但是推荐使用UTF-8,这样对于软件的国际化很有好处。其实,这里指定编码方式进行文件的写入跟我们使用记事本等编辑器的另存为,并且指定格式为“UTF-8”在本质上是一样的。通过上述处理后,程序就可以跨平台运行了。
在处理文件的过程中,我们还会用到RandomAccessFile这个类来随机访问文件。这里,如果我们写入字符串的时候调用writeChars,那么,如果写入的是中文,中文问题就又会出现了。因为此时RandomAccessFile并没有使用系统的默认编码来写入文件,而是直接将内存中的二进制数据直接写到文件中去。如何解决这个问题呢?只要读写对称就行了。
java 代码
1.public void randWrite() throws IOException{
2. RandomAccessFile raf = new RandomAccessFile("test1.txt","rw");
3. raf.writeChars("中国你好");
4. raf.close();
5. }
6. public String randRead() throws IOException{
7. RandomAccessFile raf = new RandomAccessFile("test1.txt","r");
8. StringBuffer sb = new StringBuffer();
9. while( raf.getFilePointer() < raf.length()){
10. sb.append( raf.readChar() );
11. }
12. raf.close();
13. return sb.toString();
14. }
但是这样处理起来不是很方便,我们可以这样写:
java 代码
1.public void randWrite() throws IOException{
2. RandomAccessFile raf = new RandomAccessFile("test1.txt","rw");
3. raf.writeUTF("中国你好");
4. raf.close();
5. }
6. public String randRead() throws Exception{
7. RandomAccessFile raf = new RandomAccessFile("test1.txt","r");
8. String str = raf.readUTF();
9. raf.close();
10. return str;
11. }
好了,文件读写的中文问题就解决了。
分享到:
相关推荐
写内存(内存块变量 + (字符串长度 - i) * 2, .字符串[i]) i++ 结束循环 .字符串 = 读内存(内存块变量, .字符串长度 * 2, 易语言.编码.GBK) 释放内存(内存块变量) 输出 (.字符串) ``` 7. **位操作法** 利用位...
3. API写注册表项:使用`RegSetValueEx`函数,向已打开的键下写入新的字符串值。对于多字符串值,我们需要先将它们合并成一个字符串,用指定的分隔符连接起来,再写入。 4. API关闭注册项:最后,不要忘记调用`...
在本文档中,我们探讨了如何使用C#上位机编程和S7.Net库来读取Siemens S7-1500 PLC中的字符串变量。S7.Net是一个专门用于与西门子S7系列PLC通信的.NET库,使得开发者能够方便地在C#环境中进行数据交互。 首先,我们...
3. **比较操作**:`TString`通常提供`Compare`、`CompareNoCase`等方法,用于执行区分大小写或不区分大小写的字符串比较。 4. **查找与替换**:`Find`、`ReverseFind`、`Replace`等功能帮助开发者在字符串中查找...
在IT领域,字符串和十六进制转换是常见的操作,尤其在数据处理、编程以及网络通信中。...通过使用这个工具,我们可以更好地理解和操作不同编码格式的字符串,以及在十六进制世界和人类可读的文本之间自由穿梭。
总结起来,十六进制转字符串工具是编程和数据分析中的一个重要辅助工具,它能帮助我们将不可读的十六进制数据转换为有意义的字符串,尤其是对于包含Unicode字符(如中文)的情况。了解如何使用这类工具以及它们的...
易语言提供了`读文件到字节集`、`写字节集到文件`、`字节集到字符串`和`字符串到字节集`等函数,方便进行这种转换。 5. **数据类型转换函数**:易语言提供了丰富的类型转换函数,如`整数到字符串`、`字符串到整数`...
在Android应用开发中,有效地管理和使用字符串资源是至关重要的,特别是在构建用户界面和处理本地化时。Android系统提供了一种规范的方式来定义和管理这些字符串,那就是通过XML文件。本篇文章将详细阐述如何在...
2. **字符串读取**:可以从文件、数据库或者内存中读取字符串,易语言提供了如“读文本文件”等命令。 3. **字符串写入**:将字符串数据写入文件或其他介质,例如“写文本文件”。 4. **字符串操作函数**:如...
这个函数接受一个字符串`input`和一个整数`maxLength`作为参数,它会将`input`分割成多行,每行的长度不超过`maxLength`。注意,最后一行可能会短于`maxLength`,因为我们在每次达到或超过`maxLength`时都会插入换行...
在这个项目中,我们关注的是如何将扫描枪捕获到的二进制编码转化为人类可读的字符串,包括汉字在内的多种字符。 首先,二维码是一种二维条形码,它能够存储比传统一维条形码更多的信息,如网址、文本、联系人信息等...
Unicode转字符串软件是一种工具,主要用于将Unicode编码转换为可读的字符串形式,这对于在使用SIM800 Series AT命令进行硬件控制时处理文本数据尤为重要。SIM800 Series是一款广泛应用于GSM/GPRS通信模块的设备,它...
这时,十六进制与字符串的转换就显得尤为重要,因为它们是二进制数据与人可读格式之间的桥梁。 5. **错误处理和边界检查**:在转换过程中,应考虑异常情况,如非法的十六进制字符串或超出范围的数值。添加适当的...
将混合有字符串和数据的文件,在matlab中读取,提取数据信息。 运用脚本,适合批量读取,而非手动插入数据。
字符串加解密在信息技术中扮演着至关重要的角色,尤其是在数据传输、存储和保护隐私方面。加密技术能够将明文数据转化为密文,防止未经授权的访问和窃取,而解密则用于将密文恢复为原始的明文。这个源码可能涵盖了...
- 使用`读文件`命令读取整个文本内容到一个字符串变量。 - 使用`循环`结构,从字符串的开始位置(通常是0)开始,每次移动一个字符的位置,直到达到字符串长度。 - 在循环体内,调用`查找`函数查找目标字符串,...
对于包含中文字符的字符串,如`A`,可以进行类似的处理,如提取部分字符或转换为ASCII码。 创建复杂字符串数组的方法多样。【例3.1-3】展示了直接输入创建多行字符串数组的方式,而【例3.1-4】则通过函数`char`、`...
在这个例子中,`uniout(escaped_str)`将转义的Unicode字符串还原成了可读的中文字符。 除了直接处理字符串,"uniout"库还可以与文件操作结合,帮助你读取和写入含有Unicode字符的文件。例如,你可能有一个名为`utf8...
- 中文数字转换:将中文数字(壹、贰、叁...)转换成阿拉伯数字,涉及汉字字符的处理和映射关系。 9. **20字符串加密.py**: - 字符串加密:可能使用了简单的加密算法,如Caesar密码(移位加密)或者更复杂的加密...
在Web开发中,slug化字符串是常见的需求,因为它们可以使得动态生成的URL更加规范和搜索引擎友好。 在PHP中,slugify类库提供了简单易用的接口,允许开发者快速地处理字符串。首先,你需要安装这个类库,通常通过...