1.java.io.DateOutputStream数据专属流 !!!!!为什么我的idea没有这个流!!!!!
这个流可以将数据连同数据类型一并写入文件
注意:这个文件不是普通文本文档(记事本打不开乱码)
DateInputStream 数据字节输入流
DateOutputStream写的文件只能用DateInputStream来读,并且读的时候你需要提前知道写入的顺序
读的顺序要和写的顺序一样才能正常读取
2.java.io.PrintStream标准的字节输出流 默认输出到控制台
System.out的返回值其实就是PrintStream
标准输出流不需要手动close()关闭
可以改变标准输出流的输出方向吗?可以!
PrintStream s=new PrintStream(new FileOutputStream("hhh"));//不需要手动关闭
System.setOut(s);//标准输出流不再指向控制台,指向hhh
--------可以用这个来做日志工具logger
3.File java.io.File
(1)File类和四大家族没有关系,所以File类不能完成文件的读和写
(2)File对象代表什么?
文件和目录路径名的抽象表示形式
C:\dwad 这是一个file对象
一个File对象有可能对应的是目录,也有可能是文件
File只是一个路径名的抽象表示形式
(3)掌握File类中常用的方法=================================== package io; import java.io.File; public class FileTest01 { public static void main(String[] args) throws Exception{ /*File f=new File("D://nihao"); System.out.println(f.exists());//判断此文件是否存在 //如果不存在,以文件形式创建出来 if(!f.exists()){ f.createNewFile(); } //如果不存在,以目录形式创建出来 if(!f.exists()){ f.mkdir(); }*/ //创建多重目录 /*File f2=new File("D://a//b//c//d//e"); if(!f2.exists()){ f2.mkdirs();//注意有s }*/ File f3=new File("D:\\a\\b\\c\\d\\e"); String parent=f3.getParent();//(返回值String) System.out.println(parent);//D:\a\b\c\d File s= f3.getAbsoluteFile();//获取绝对路径返回值File System.out.println(s); File f4=new File("hhh"); File s1= f4.getAbsoluteFile();//获取绝对路径返回值File!!!!!!!!!!!!!!!!这个好 System.out.println(s1); } } =========================================== package io; import java.io.File; import java.sql.SQLOutput; import java.text.SimpleDateFormat; import java.util.Date; public class FileTest02 { public static void main(String[] args) { File f=new File("D:\\File测试\\坠入爱河.txt"); System.out.println("文件名为"+f.getName());//获取文件名字 System.out.println(f.isDirectory());//判断是否是一个目录 System.out.println(f.isFile());//判断是否是一个文件 long haoMiao=f.lastModified();//获取文件最后一次修改的时间 Date time=new Date(haoMiao);//将总毫秒数转换成日期 SimpleDateFormat s=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SS"); System.out.println(s.format(time)); System.out.println(f.length());//获取文件大小 } } ================================ package io; import java.io.File; public class FileTest03 { public static void main(String[] args) { File f=new File("D:\\555"); File[] files=f.listFiles();//获取当前目录下的子目录 for (File ff :files ) { System.out.println(ff.getAbsoluteFile()); System.out.println(ff.getName()); } } } =========================
4.序列化:Serialize 把内存中的java对象拆分序列化到硬盘文件中叫ObjectOutputStream将java对象保存下来的过程
反序列化:DeSerialize把硬盘文件中的数据重新恢复到内存中,恢复成java对象叫ObjectInputStream
5.参与序列化和反序列化的对象,必须实现Serializable接口
6.注意:通过源码发现Serializable接口只是一个标志接口
public interface Serializable{
}
这个接口当中什么代码都没有
起到一个什么作用呢? 起到标识的作用,java虚拟机看到这个类实现了这个接口,可能会对这个类进行特殊待遇
Serializable这个标志接口是给java虚拟机参考的,java虚拟机看到这个接口之后,会为该类自动生成一个序列化版本号
7.一次序列化多个对象?
可以,可以将对象放到集合中,序列化集合
参与序列化的ArrayList集合以及集合中的元素类型都需实现java.io.Serializable
private transient String name;// transient关键字游离的,不参与序列化 name不参与序列化
8.一个类实现Serializable接口后,java虚拟机会自动生成一个序列化版本号,过了很久
这个类的源代码改动了,需要重新再编译,编译之后生成了全新的字节码文件,并且class文件再次运行的时候,java虚拟机
生成的序列化版本号也会发生相应的改变
9.java语言中采用什么机制来区分类?
第一:首先通过类目进行对比,如果类名不一样,肯定不是同一个类
第二:如果类名一样,再怎么进行类的区别?靠序列化版本号进行区分
10.不同的人编写了同一个类,但“这两个类确实不是同一个类”,这个时候序列化版本就起作用了
对于java虚拟机来说,java虚拟机是可以区分这两个类的,因为这两个类都实现了Serializable接口
都有默认的序列化版本号,他们的序列化版本号不一样,所以区分开了
11.这种自动生成的序列化版本号缺点是:一旦代码确定之后,不能进行后续的修改,
因为只要修改,必然会重新编译,此时会生成全新的序列化版本号,这个时候java虚拟机会认为这是一个全新的类
12.结论:凡是一个类实现了Serializable接口,建议给该类提供一个固定不变的序列化版本号,这样,
以后这个类代码修改了,但版本号不变,java虚拟机会认为是同一个类
13手动写出序列化版本号:private static final long serialVersionUID=1156455L
14.IO+Properties的联合应用
非常好的一个设计理念:
以后经常改变的数据,可以单独写到一个文件中,使用程序动态读取
将来只需要修改这个文件的内容,java代码不需改动,不需要重新编译,服务器也不需要重启,就可以拿到动态地信息
类似于以上机制的这种文件称为:配置文件
并且配置文件中的内容格式是:
key1=value
key2=balue
的时候,我们把这种配置文件叫做属性配置文件java规范中有要求:属性配置文件建议以.properties结尾,但这不是必须的
这种以.properties结尾的文件再java中被称为:属性配置文件
其中Properties是专门存放属性配置文件内容的一个类
(属性配置文件中井号#是注释,属性配置文件的key重复的话,value会自动覆盖)
===================