最近用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.Writer (implements java.lang.Appendable, java.io.Closeable, java.io.Flushable)
- java.io.BufferedWriter
- java.io.OutputStreamWriter
上面列出来的并不是Java.io中全部的类,但是对于文件读写来说已经足够了。通常,我们使用以下代码来进行文件的读写:
java 代码
- public void naiveWrite() throws IOException{
- FileWriter fw = new FileWriter("test.txt");
- fw.write("中文你好");
- fw.close();
- }
-
- public String naiveRead() throws IOException{
- FileReader fr = new FileReader("test.txt");
- BufferedReader br = new BufferedReader(fr);
- String str = br.readLine();
- br.close();
- fr.close();
- return str;
- }
如果我们的是中文平台,上面代码是可以正常运行的。但是如果我们把这些代码放到一个ISO8859-1的系统上,中文问题就出来了(当然,前提你在javac的时指定了编码方式,如javac -encoding gb2312 ***.java,参看该系列前面的文章)。为什么呢?这是因为FileWriter和FileReader是辅助类,为了方便大家使用 OutputSteamWriterer 和 InputStreamReader 而屏蔽了字符集的设定操作,而采用系统默认的编码方式,而这在很多情况下也能满足用户的需求。在中文系统中,系统的默认编码方式一般是GBK,因此文件中中文的读写是没有问题的。但是,当程序运行在ISO8859-1的系统中时,JVM使用ISO8859-1对中文进行编码,当然就认不到了,于是那一个个的问号就来了。
那怎么办呢?既然捷径走不通,我们就只好使用OutputSteamWriter 和 InputStreamReader了。
java 代码
- public void write() throws IOException{
- OutputStreamWriter osw = new OutputStreamWriter(
- new FileOutputStream("test.txt"), "utf-8");
- osw.write("中国万岁");
- osw.close();
- }
- public String read() throws IOException{
- InputStreamReader isr = new InputStreamReader(
- new FileInputStream("test.txt"),"utf-8");
- BufferedReader br = new BufferedReader(isr);
- String str = br.readLine();
- br.close();
- isr.close();
- return str;
- }
在这里,我们指定文件读写的编码方式为utf-8,当然对于中文来说GBK和GB2312也是可以的,但是推荐使用UTF-8,这样对于软件的国际化很有好处。其实,这里指定编码方式进行文件的写入跟我们使用记事本等编辑器的另存为,并且指定格式为“UTF-8”在本质上是一样的。通过上述处理后,程序就可以跨平台运行了。
在处理文件的过程中,我们还会用到RandomAccessFile这个类来随机访问文件。这里,如果我们写入字符串的时候调用writeChars,那么,如果写入的是中文,中文问题就又会出现了。因为此时RandomAccessFile并没有使用系统的默认编码来写入文件,而是直接将内存中的二进制数据直接写到文件中去。如何解决这个问题呢?只要读写对称就行了。
java 代码
- public void randWrite() throws IOException{
- RandomAccessFile raf = new RandomAccessFile("test1.txt","rw");
- raf.writeChars("中国你好");
- raf.close();
- }
- public String randRead() throws IOException{
- RandomAccessFile raf = new RandomAccessFile("test1.txt","r");
- StringBuffer sb = new StringBuffer();
- while( raf.getFilePointer() < raf.length()){
- sb.append( raf.readChar() );
- }
- raf.close();
- return sb.toString();
- }
但是这样处理起来不是很方便,我们可以这样写:
java 代码
- public void randWrite() throws IOException{
- RandomAccessFile raf = new RandomAccessFile("test1.txt","rw");
- raf.writeUTF("中国你好");
- raf.close();
- }
- public String randRead() throws Exception{
- RandomAccessFile raf = new RandomAccessFile("test1.txt","r");
- String str = raf.readUTF();
- raf.close();
- return str;
- }
好了,文件读写的中文问题就解决了。
分享到:
相关推荐
java文件读写操作大全java文件读写操作大全java文件读写操作大全java文件读写操作大全java文件读写操作大全
java中用FileUtil实现文件读写
最近在用java的IO包下面的RandomAccessFile类读写中文文件时遇到了乱码问题,解决不了。于是索性自己写个类,可以进行中文文件读写而不乱码。 压缩包里提供了.jar包和源代码。 ************************************...
java读写xml文件 java读写xml文件 java读写xml文件 java读写xml文件 java读写xml文件 java读写xml文件
java 二进制文件的读写操作使用FileInputStream FileOutputStream
java 随机读写Java类文件 java 随机读写Java类文件 java 随机读写Java类文件
java 文件读写 java 文件读写java 文件读写 java 文件读写java 文件读写 java 文件读写java 文件读写 java 文件读写
JAVA读写二进制文件
JAVA简单的读写文本文件的代码JAVA简单的读写文本文件的代码
Java实现对文件的读写,可设置编码格式
Java 读写文件文本文件的示例
java实现文件读写操作,小例子,供大家参考
java读写properties配置文件
java学习笔记,新手入门,java文件读写的一些例子!
java的文件读写 适合初学者 只是一个借鉴 如果想要完美的文件读写 请自己联系我
在查找“java”字符串个数的程序中,先读出文件内容,再逐个字符对比,找出“java”字符,最终把结果写入另一文档中。 在命令行显示指定文件的最后指定行中,通过命令行输入文件名和需要显示的行数。 2、 简单的...
java文件读写,这是本人总结的java读写文件的一下操作 java文件读写,这是本人总结的java读写文件的一下操作 java文件读写,这是本人总结的java读写文件的一下操作
Java 中对文件的读写操作之比较
Java 读写Ini文件,java读写ini文件的项目小例子。 运行类文件在根目录ini文件夹下src/com文件夹中start.java文件 相关jar包在根目录ini文件夹下bin文件夹中
主要实现的是登录服务器操作服务器的中的文件数据,支持读写的操作。主要使用的方法getProperties是设置配置的login(参数一是访问服务器的配置,参数二是设置读还是写)方法是读写连接服务器