IO流的种类很多的,初学的时候总是梳理一遍之后过了一段时间就觉得生疏忘记了,为此觉得有些懊恼,但后来想想就释然了,觉得学习工作有时候是经验的积累,并不需要将全部知识刻在脑子里,况且人都是有遗忘曲线的,就像学习英文一样没谁能记住所有的单词,能记得足够用的就可以了,遇到生僻词汇,具备快速解决的能力才是比较关键的,当然知识储备自然越深厚越好,下边记录常用的流,有空会在记录每个流使用案例
数据流
DataInputStream DataOutputStream
特性:
DataInputStream 只能读取由DataOutputStream 写出的文件,否则会出现EOFException,
因为DataOutputStream 在写出的时候会做一些特殊标记,只有DataInputStream 才能成功的读取
对象流
ObjectOutputStream ObjectInputStream
对象流指的是可以直接把一个对象以流的形式传输给其他的介质,比如硬盘
一个对象以流的形式进行传输,叫做序列化。 该对象所对应的类,必须实现Serializable接口
简单来说就是对象到文件是对象流,文件到对象是序列化注意对应的类实现Serializable
注意:缓存流,数据流,对象流都是必须建立在一个存在的流基础之上
为什么要用缓存流?
不用缓存流,每次只读取一个字节或者字符,访问硬盘次数很多性能低
缓存流,顾名思义会多读一些数据多缓存些数据用的时候直接从缓存中取,提高性能
数据流和对象流都是基于字节流的都有继承字节流的抽象基类
当然学习流肯定少不了文件对象File了
下边贴上常用的方法
class File_1{
public static void main(String[] args){
//用绝对路径创建一个文件对象
File f1 = new File("E:/框架");
System.out.println("f1的绝对路径"+f1.getAbsolutePath());
//以f1为父目录创建文件对象
File f3 = new File(f1,"Hibernate.doc");
System.out.println("f3的绝对路径"+f3.getAbsolutePath());
//打开文件
try{
new FileInputStream(f1);
System.out.println("打开成功");
}catch(FileNotFoundException e){
System.out.println("打开失败");
e.printStackTrace();
}
//使用相对路径
File f2 = new File("Core Java.pdf");
System.out.println("f2的绝对路径"+f2.getAbsolutePath());
}
}
//文件常用方法1
class File_2{
public static void main(String[] args){
File f1 = new File("E:/how2j练习io/lol.txt");
System.out.println("f1文件:"+f1);
//文件是否存在
System.out.println("f1文件是否存在:"+f1.exists());
//是否是文件夹
System.out.println("f1文件是否是文件加:"+f1.isDirectory());
//是否是文件(非文件夹)
System.out.println("f1文件是否是文件:"+f1.isFile());
//文件长度
System.out.println("f1文件长度:"+f1.length());
//文件最后修改时间
long time = f1.lastModified();
Date dtime = new Date(time);
System.out.println("文件最后修改时间:"+dtime);
//设置文件修改时间为1970.1.1 08:00:00
//f1.setLastModified(0);
//文件重命名
File f2 = new File("E:/how2j练习io/daota.txt");
f1.renameTo(f2);
System.out.println("把LOL.exe改名成了DOTA.exe");
}
}
//文件常用方法2
class File_3{
public static void main(String[] args) throws IOException{
File f3 = new File("E:/how2j练习io/how/skin/s.txt");
// 以字符串数组的形式,(以当前路径)返回当前文件夹下的所有文件(不包含子文件及子文件夹)
String[] strr = f3.list();
for(String each:strr){
System.out.println(each);
}
// 以文件数组的形式,(以绝对路径)返回当前文件夹下的所有文件(不包含子文件及子文件夹)
File[] fs = f3.listFiles();
for(File each:fs){
System.out.println(each);
}
// 以字符串形式返回获取所在文件夹(就是绝对路径+父文件夹名称)
String f3_fatherName = f3.getParent();
System.out.println(f3_fatherName);
// 以文件形式返回获取所在文件夹(就是绝对路径+父文件夹名称)
File fName = f3.getParentFile();
// 创建文件夹ss,如果父文件夹skin不存在,创建就无效(只能一次创建一个文件夹)
System.out.println(f3.mkdir());
// 创建文件夹ss,如果父文件夹skin不存在,就会创建父文件夹(只能一次创建多个文件夹父文件夹子文件夹。。。。)
System.out.println(f3.mkdirs());
// 创建一个空文件s.tx如果父文件夹skin不存在,就会抛出异常
System.out.println(f3.createNewFile());//boolean
// 所以创建一个空文件之前,通常都会创建父目录(如果父目录不存在的话)
System.out.println(f3.getParentFile().mkdirs());//boolean(只创建父目录或者爷爷目录。。。。。)
// 列出所有的盘符c: d: e: 等等
File[] fc = f3.listRoots();
for(File each:fc){
System.out.println(each);
}
// 刪除文件
System.out.println(f3.delete());//boolean
// JVM结束的时候,刪除文件,常用于临时文件的删除
f3.deleteOnExit();//void 不能打印空值
}
}