JavaI/O中使用readUTF()报java.io.EOFException暂时解决方案

来源:互联网 发布:天锐绿盾软件怎么用 编辑:程序博客网 时间:2024/05/21 17:49

问题描述

练习JavaI/O时自己试着写demo,当使用RandomAccessFile的readUTF()方法时报java.io.EOFException。源码如下:
DirList.java

package com.star.io;import java.io.IOException;import java.io.RandomAccessFile;public class DirList {    static String file= "G://a.txt";    static void testRAF() throws IOException {        RandomAccessFile rf=new RandomAccessFile(file,"r");        System.out.println(rf.readLine());        System.out.println(rf.readLine());        System.out.println(rf.readUTF());        rf.close();    }    public static void main(String[] args) throws IOException {        testRAF();    }}

a.txt文件内容如下:

Hello World!1.5862你好啊!

运行程序,输出结果如下:

Exception in thread "main" Hello World!1.5862java.io.EOFException    at java.io.RandomAccessFile.readFully(RandomAccessFile.java:438)    at java.io.DataInputStream.readUTF(DataInputStream.java:609)    at java.io.RandomAccessFile.readUTF(RandomAccessFile.java:965)    at com.star.io.DirList.testRAF(DirList.java:12)    at com.star.io.DirList.main(DirList.java:17)

思考过程

查看输出结果,并且与输出语句一一对应,发现英文没有问题,只有在遇到中文的时候报java.io.EOFException。
跟踪错误,发现是在调用DataInput接口的readFully(byte b[], int off, int len)方法处抛出的异常,继续查看readFully()方法,找到了关于该方法报EOFException异常的说明:

这里写图片描述

意思是当输入流还没有读完所有字节时就到达了末尾。理解不了。
转去查阅博客,有的说是因为没有关闭输入流,只要使用外流过后调用close()方法关闭流即可,但是检查我的代码,发现并不符合,我最后是调用了close()方法的。
另一篇博客中写道,readUTF()方法只能读入UTF编码的字符,而中文字符并不一定就是UTF编码,在windows系统中,创建txt文件默认的编码是ANSI编码!结果去查看了a.txt的编码,发现就是UTF-8。也不是这个原因。

出错原因

暂时找不出出错的原因,以后能力够了再回头解决。

解决方案

使用readLine()方法而不是readUTF()方法读取中文:

new String(rf.readUTF().getBytes("ISO-8859-1"),"utf-8")

首先使用String的getBytes(Charset)方法获得读取行的ISO-8859-1编码的字节数组,在通过String的构造器String(byte[],Charset)将该数组重新编码成UTF-8的字符串。
新的方法

static void testRAF() throws IOException {        RandomAccessFile rf=new RandomAccessFile(file,"r");        System.out.println(rf.readLine());        System.out.println(rf.readLine());        System.out.println(new String(rf.readLine().getBytes("ISO-8859-1"),"utf-8"));        rf.close();    }

输出结果

Hello World!1.5862你好啊!
阅读全文
0 0
原创粉丝点击