黑马程序员学习笔记六——java.IO小细节或许影响全局。

来源:互联网 发布:小米商城抢购软件 编辑:程序博客网 时间:2024/05/02 02:32

----------------------android培训java培训、期待与您交流! ----------------------

Io包是java通过数据流、序列化和文件系统提供系统输入和输出。Java对数据的操作也是通过流的方式。

按操作数据分为:

字节流:抽象基本类是InputStream

字符流:  抽象基本类是OutputStream

按流入方向分为: 

输入流:抽象基本类 Reader

输出流:抽象基本类Writer

为方便记住,这四个类派生出来的子类名称都是以其父类名作为后缀。如FileInputStream,FileOutputStream,FileReader,FileWriter.

数据最常见的体现形式是文件,FileWriter专门用于操作文件的Writer子类对象,其前缀名File为该流的对象功能。

看两段例子:

//写入数据

public class FileWriteDemo {

public static void main(String [] args) throws IOException{

//创建一个filewrite对象,该对象已被初始化就必须要明确被操作文件

//而且该文件会被创建到指定目录下。如果该类下有同名文件将被覆盖。

//其实就是要明确数据要存放的目的地。

FileWriter fw=new FileWriter("hello.txt");

fw.write("jkljkljlk");

//传递一个true参数 代表不覆盖已有的文件,并在已有文件的末尾处进行数据的续写。

FileWriter fw1=new FileWriter("hello.txt",true);

//调用write方法 将字符串写入到流中。

fw.write("jkl\r\nljlk");

//刷新流对象中缓冲数据 ,将数据刷到目的地中。

fw.flush();

//关闭流资源,但是关闭之前会刷新一次内部的缓冲数据。将数据刷到目的地中。

//flush 区别 flush 刷新后流会继续使用   close 流会关闭

}

}

//读取数据

public class FileReaderDemo {

public static void main(String [] args)throws IOException{

//创建一个文件读取流对象,和指定名称的文件相关联

FileReader fr= new FileReader("hello.txt");

//读取文件  要保证文件是否已经存在。如果不存在,会发生FileNotFoundException

FileReader fr1=new FileReader("D:\\android project\\system\\src\\io\\FileReaderDemo.java");

//建立字符数组,并定义大小1024

char [] buf=new char[1024];

int num=0;

//开始读取数据,的远去的数据只要不是-1 继续读取。

while((num=fr1.read(buf))!=-1){

System.out.print(new String(buf,0,num));

}

//关闭流。

fr.close();

}

}

通过上面两个例子你可以看到:flush close概念,他们的区别就是flush刷新后流可以继续使用,close刷新后会将流关闭。

今天的笔记是学习时遇到的一个当时很长时间没检查出的问题,先看题:

public class DateStream {

public static void main(String[] args) throws IOException{

writedate();

readerdata();

}

public static void readerdata() throws IOException{

//建立读取流关联文件

DataInputStream dis=

new DataInputStream(

new FileInputStream("hello.txt"));

//读取数据

int num=dis.readInt();

boolean b=dis.readBoolean();

double d=dis.readDouble();

System.out.println("num--"+num);

System.out.println("boolean---"+b);

System.out.println("double---"+d);

//关闭流

dis.close();

}

public static void writedate() throws IOException{

//关联数据流

DataOutputStream dos=

new DataOutputStream(new FileOutputStream("hello.txt"));

//写入数据

dos.write(234);

dos.writeBoolean(true);

dos.writeDouble(87.543);

//关闭流

dos.close();

}

}

这段代码 编译上没有出现报错。但是在运行时就出现异常。

Exception in thread "main" java.io.EOFException

at java.io.DataInputStream.readFully(Unknown Source)

at java.io.DataInputStream.readLong(Unknown Source)

at java.io.DataInputStream.readDouble(Unknown Source)

at pipe.DateStream.readerdata(DateStream.java:47)

at pipe.DateStream.main(DateStream.java:15)

当时我就蒙了,代码都正常啊,找了很久没发现问题。 再看看 异常提示。

java.io.EOFException   查阅jdk定义为 当输入过程中意外到达文件或流的末尾时,抛出此异常。此异常主要被数据输入流用来表明到达流的末尾。注意,其他许多输入操作返回一个特殊值表示到达流的末尾,而不是抛出异常。

再用在用调试,发现好像都没取到值。这下很慌乱。我的值都给了,怎么没取到值。在测试我写数据方法没报错,文件里面有数据。只有读取数据时报错了。然后在改成毕老师的版本,也报错。实在没辙了,我对比代码。对了几遍终于发现 dos.write(234); 我少写了int。然后我写为dos.writeInt(234); 结果成功打印出来。原来我忽略了程序怎么写就怎么读。得出道理:小细节或许影响全局。写程序要细心,查看错误多思考问题。

----------------------android培训java培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima


原创粉丝点击