IO流
File类
在程序中需要对计算机硬盘上的文件进行操作,如何在程序中表示硬盘上的一个文件? --file
File类的对象可以表示文件,目录.
File对象可以对文件或目录的属性进行操作.(文件名,最后修改时间,文件大小等)
无法操作文件的具体数据(读/写)
File(String pathname) 指定文件(或目录)名和路径创建文件对象.
File f1 = new File("abc.txt");
File f2 = new File("D:\\Java\\Hello.java");
File f3 = new File("D:\\Java");
String a = "D:\\Java"; //或String a = "D:/Java";
File f4 = new File(a,"test.txt");
一些常用方法:
canRead() //判断文件是否可读
canWrite() //判断文件是否可写
canExecute() //判断文件是否可执行
isAbsolute() //判断是否是绝对路径
isHidden() //判断文件是否为隐藏文件
isDirectory() //判断是否为目录
isFile() //判断是否为文件
exists() //判断文件是否存在
length() //获取文件的长度(字节数)
lastModified() //获取文件的上次修改时间
getAbsolutePath() //获取绝对路径
getName() //获取文件的名称
File f = new File("E:/demo");
f.mkdir(); //创建名称为demo的目录(文件夹)
f.delete(); //删除目录时,需目录为空
遍历目录
File f = new File("E:/api");
File []fs = f.listFiles();
for(File fo : fs){
System.out.println(fo);
}
输入及输出的概念
把电脑上的数据读到程序中,称为输入,即input,进行数据的read操作.
从程序往外部设备写数据,称为输出,即output,进行数据的write操作.
输入流与输出流
流按着数据的传输方向分为:
输入流:往程序中读叫输入流。
输出流:从程序中往外写叫输出流。
所有输入流都是InputStream类或者Reader类的子类。
类名以InputStream结尾的类都是InputStream的子类。
类名以Reader结尾的类都是Reader类的子类。
所有输出流都是OutputStream类或者Writer类的子类。
类名以OutputStream结尾的类都是OutputStream的子类。
类名以Writer结尾的类都是Writer类的子类。
字节流与字符流
从数据流编码格式上划分为字节流和字符流.
InputStream和OutputStream的子类都是字节流,可以读写二进制文件,主要处理音频、图片、歌曲、字节流,处理单元为1个字节。
Reader和Writer的子类都是字符流,主要处理字符或字符串,字符流处理单元为2个字节。字节流将读取到的字节数据,去指定的编码表中获取对应文字。
节点流与处理流
根据封装类型不同流又分为节点流和处理流
节点流:如果流封装的是某种特定的数据源,如文件、字符串、字符串数组等,则称为节点流。
处理流:如果流封装的是其它流对象,称为处理流。处理流提供了缓冲功能,提高读写效率,同时增加了一些新的方法。
Print流
只做输出没有输入.
打印流分为字节打印流和字符打印流.
PrintWriter字符打印流.
print方法可以打印各种类型的数据.
对象输入输出流
主要用于写入对象信息和读取对象信息.
对象信息一旦写到文件上,那么对象的信息就可以做到持久化了.
对象序列化
对象的寿命通常随着生成该对象的程序的终止而终止.
输出对象信息到指定文件,长久保存,这个过程为对象的序列化.
//对象序列化
FileOutputStream in = new FileOutputStream("D:/temp.obj");
ObjectOutputStream objin = new ObjectOutputStream(in);
Date date = new Date();
String str = "abc";
User u = new User("小红","111",4);
objin.writeObject(date);
objin.writeObject(str);
objin.writeObject(u);
//对象反序列化
FileInputStream in = new FileInputStream("D:/temp.obj");
ObjectInputStream objin = new ObjectInputStream(in);
Date date = (Date)objin.readObject();
String str = (String)objin.readObject();
User u = (User)objin.readObject();
System.out.println(date);
System.out.println(str);
System.out.println(u);
public class User implements Serializable {
private static final long serialVersionUID = -50632779358220372L;
public String userName;
public String password;
public /*transient*/ int age; //transient 被修饰的属性不被序列化
public User(String userName, String password, int age) {
this.userName = userName;
this.password = password;
this.age = age;
}
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
}
如果实现Serializable接口,不显示的生成序列号版本id号会自动生成.但是类的信息一旦改变,序列号id也会随之改变,也可以显示的声明创建id号.