今天在编程的时候,用到了DataInPutStream类的readUTF()方法时报了个异常,查了好多资料也不能解决,求大神指点啊.高分悬赏.
package IO流;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class DataTest {
/**
* 数据输入输出流
*
*/
public static void main(String[] args) throws IOException {
//向指定文件中写入数据
//打开文件输出流
FileOutputStream fos=new FileOutputStream("G://word.txt");
//将此输出流链接到指定基础输出流DataOutPutStream
DataOutputStream dos=new DataOutputStream(fos);
//写入数据:
dos.writeBytes("我是大禹!");//用此方法写入的数据用记事本打开是乱码
dos.writeChars("我治水!");//用此方法写入的数据用记事本打开是乱码
dos.writeUTF("你智障吗?");
//关闭流
fos.close();
//从文件中读取数据
//首先打开文件输入流
FileInputStream fis=new FileInputStream("G://word.txt");
//将此输入流连接到基本数据输入流DataInPutStream
DataInputStream dis=new DataInputStream(fis);
//开始读取数据啦
// String s=dis.readUTF();
System.out.println(dis.readUTF());
dis.close();
}
}
异常信息:
Exception in thread "main" java.io.EOFException
at java.io.DataInputStream.readFully(DataInputStream.java:180)
at java.io.DataInputStream.readUTF(DataInputStream.java:592)
at java.io.DataInputStream.readUTF(DataInputStream.java:547)
at IO流.DataTest.main(DataTest.java:35)
乱码是因为记事本的编码 GB2312、GBK、GB18030、Big5、Shift_JIS问题引起的,读写编码方式应一致,记事本能存储文本类型的。
你这样子是用了几种编码方式往文件里写东西了。
dos.writeBytes(),按照1个字节方式写入 123abc英文是没问题的,至少写入能显示出来123abc,但如果你把汉字写入就会出现乱码了
dos.writeChars(),char占2个字节,按照2个字节的方式写入 123abc能显示出来,但是记事本里会变这样子 1 2 3 a b c,如果中文则会乱码
要对记事本读写汉字,你把前面两个写入方法注释后,只用writeUTF()写入,读取时用readUTF()读取,就没问题了。_
直接fileinputstream读取呗
虽然我不清楚DataOutputStream 这个类的,但是你读取数据的时候应该加个while循环判断是否读到尾部了
要按照写入数据的顺序读取,第一个读取应该是读取readBytes,不该是utf
顶一个,第一位大佬的回答让我找到了我的问题所在:
我在序列化一个int值的时候,使用write(a),因为使用时看到write可以直接写int类型;
但我在反序列化时,却使用了readInt(a)来读,两者类型不匹配导致我报了这个错。
java.io.EOFException这个表示读到了文件尾,没数据可读了