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); 结果成功打印出来。原来我忽略了程序怎么写就怎么读。得出道理:小细节或许影响全局。写程序要细心,查看错误多思考问题。