IO流概述和分类
File
public boolean createNewFile() //当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件。
public boolean mkdir() //创建由此路径名命名的目录
public boolean mkdirs() //创建由此抽象路径名命名的目录,包括任何必须但不存在的父目录
File类判断和获取功能
public boolean isDirectory()//测试此抽象名表示的File是否为目录
public boolean isFile//测试此抽象名表示的File是否为文件
public boolean exists()//测试此路径名表示的File是否存在
public String getAbsolutePath()//返回此抽象路径名的绝对路径名字符串
public String getPath()//将此路径名转换为路径名字符串
Public String getName()//返回由此抽象路径名表示的文件或目录的名称
public String[] list()//返回此抽象路径名表示的目录中的文件和目录的名称字符串数组
public File[] listFiles()//返回此抽象路径名表示的目录的文件和目录的File对象数组
File类删除功能
public Boolean delete() //删除由此抽象路径名表示的文件或目录
绝对路径和相对路径的区别
- 绝对路径:完整的路径名,不需要任何其他信息就可以定位它所表示的文件。例如:E:\itcast\java.txt
- 相对路径:必须使用取自其它路径名的信息进行解释。例如:myFile\java.txt
删除目录时的注意事项:
- 如果一个目录中有内容(目录,文件),不能直接删除。应该先删除目录中的内容,最后才能删除目录。
IO流概述
- IO:输入/输出
- 流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输
- IO流就是用来处理设备间数据传输问题的
IO流分类:
- 按照数据的流向:
输入流:读数据
输出流:写数据
- 按照数据类型来分:
字节流
字节输入流;字节输出流
字符流
字符输入流;字符输出流
一般来说,我们IO流的分类是按照数据类型来分的
- 如果数据通过Windows自带的记事本软件打开,我们还可以读懂里面的内容,就是用字符流,否则就使用字节流。如果你不知道该使用哪种类型的流,就使用字节流。
字节流写数据
字节流抽象基类
- InputStream:这个抽象类是表示字节输入流所有类的超类;
- OutputStream:这个抽象类是表示字节输出流所有类的超类
- 子类名特点:子类名称都是以其父类名作为子类名的后缀
FileOutStream:文件输出流用于将数据写入File
- FileOutputStream(String name):创建文件输出流以指定的名称写入文件
使用字节输出流写数据的步骤:
- 创建字节流输出对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)
- 调用字节输出流对象的写数据方法
- 释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源)
字节流写数据的3种方式
void write(int b)// 将指定的字节写入此文件输出流,一次写一个字节数据
void write(byte[] b)//将b.length字节从指定的字节数组写入此文件输出流,一次写一个字节数组数据
void write (byte[] b,int off,int len)//将len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流一次写一个字节数组的部分数据
字节缓冲流
BufferOutStream:该类实现缓冲输出流。通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入每个字节导致底层系统的调用
BufferedInputStream:创建BufferedInputStream将创建一个内部缓冲区数组。当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流重新填充,一次很多字节
字符缓冲流的特有功能
BufferedWriter;
- void newLine():写一行行分隔符,行分隔符字符串由系统属性定义
BufferedReader:
- public String readLine():读一行文字。结果包含行的内容的字符串,不包括任何行终止字符,如果流的结尾已经达到,则为null
打印流
打印流分类
- 字节打印流:PrintStream
- 字符打印流:PrintWriter
打印流的特点:
- 只负责输出数据,不负责读数据
- 有自己特有的方法
字节打印流
- PrintStream(String fileName):使用指定的文件名创建新的打印流
- 使用继承父类的方法写数据,查看的时候会转码;使用自己特有的方法写数据,查看的数据原样输出。
字符打印流
PrintWriter(String fileName):使用指定的文件名创建一个新的PrintWriter,而不需要自动执行刷新
PrintWrinter(Writer out,boolean autoFlush):创建一个新的PrintWriter
- out:字符输出流
- autoFlush:一个布尔值,如果为真,则println,printf或format方法将刷新输出缓冲区。
对象序列化流
对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象
这种机制就是使用一个字节表示一个对象,该字节序列包含:对象的类型、对象的数据和对象中存储的属性等信息
字节序列写到文件之后,相当于文件中持久保存了一个对象的信息。
反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化
要实现序列化和反序列化就要使用对象序列化流和对象反序列化流:
对象序列化流:ObjectOutputStream
对象反序列化流:ObjectInputStream
对象序列化流
将Java独享的原始数据类型和图形写入OutputStream。可以使用ObjectInputStream读取(重构)对象。可以通过使用流的问价来实现对象的持久存储。如果是网络套接字流,则可以在另一个主机上或另一个进程中重构对象
构造方法:
ObjectOutputStream(OutputStream out):创建一个写入指定的OutputStream的ObjectOutputStream
序列化对象的方法:
void writeObject(Object obj):将指定的对象写入ObjectOutputStream
注意:
-
一个对象要想被序列化,该对象所属的类必须实现Serializable接口
-
Serializable是一个标记接口,实现该接口,不需要重写任何方法。
-
序列化运行时将每个可序列化的类与称为serialVersionUID的版本号相关联,该序列号在反序列化期间用于验证序列化对象的发送者和接收者是否已加载与该序列化兼容的对象的类。 如果接收方加载了一个具有不同于相应发件人类的serialVersionUID的对象的类,则反序列化将导致
InvalidClassException
。 一个可序列化的类可以通过声明一个名为"serialVersionUID"
的字段来显式地声明它自己的serialVersionUID,该字段必须是静态的,最终的,类型是long
:ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
对象反序列化流
ObjectInputStream反序列化先前使用ObjectOutputStream编写的原始数据和对象
构造方法:
ObjectInStream(InputStream in):创建从指定的InputStream读取的ObjectInputStream
反序列化对象的方法:
Object readObject():从ObjectInputStream读取一个对象
对象序列化流会出现的三个问题
用对象序列化流序列化了一个对象后,假如我们修改了对象所属的类文件,读数据会不会出现问题呢?
- 会出问题,抛出InvaildClassException异常
如果出现问题了,怎么解决呢?
- 给对象所属的类加一个serialVersionUID
如果一个对象中的某个成员变量的值不想被序列化,又该如何实现呢?
- 给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程。
properties
Properties概述:
-
是一个Map体系的集合类
-
Properties可以保存到流中或从流中加载
ObjectsetProoerty(String key,String value)//设置集合中的键和值,都是String类型,底层调用Hashtable方法put
String getProperty(String key)//使用此属性列表中指定的键搜索属性
SetstringPropertyNames()//从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串
Properties和IO流结合的方法:
void load(InputStream inStream)//从输入字节流读取属性列表(键和元素对)
void load(Reader Reader)//从输入字符流读取属性列表(键和元素对)
void store(OutputStream out,String comments)//将此属性列表(键和元素对)写入此Poperties表中,以适合与使用load(InputStream)方法的格式写入输出字节流
void store(Writer writer,String comments)//将此属性列表(键和元素对)写入此Properties表中,以适合使用load(Reader)方法的格式写入输出字符流