JavaI/O中使用readUTF()报java.io.EOFException暂时解决方案 您所在的位置:网站首页 datainputstreamreadutf JavaI/O中使用readUTF()报java.io.EOFException暂时解决方案

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

2023-06-30 02:22| 来源: 网络整理| 查看: 265

问题描述

练习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.5862 java.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 你好啊!


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有