IO流
java.io.File类
它是文件和目录路径名的抽象描述。
API:
(1)getName():获取文件或目录的名称
(2)getPath():获取文件或目录的路径
(3)getAbsolutePath():获取文件或目录的绝对路径
(4) getCanonicalPath():获取文件或目录的规范路径
(5)long length():获取文件的长度,单位字节
(6)long lastModified():最后修改时间,单位毫秒
(7)String getParent():获取上级或父目录
File getParentFile():获取上级或父目录
(8)isFile():判断是否是文件,当且仅当是文件并且是存在的,才会true
(9)isDirectory():判断是否是目录,当且仅当是目录并且存在的,才会true
(10)exists():是否存在
(11)isHidden():是否隐藏
(12)canWrite():是否可写
(13)canRead():是否可读
(14)String[] list():获取下一级
File[] listFiles():获取下一级
File[] listFiles(FileFilter f):获取下一级,但是会过滤掉一下文件和目录
(15)createNewFile():创建文件
createTempFile(String prefix, String suffix)
(16)mkdir():创建一级目录,如果父目录不存在,就失败,但是不报异常
mkdirs():创建多级目录
(17)delete():删除文件或空目录
(18)renameTo(File f):重命名文件或目录
IO流的四大抽象基类
1、四大超类
(1)InputStream:字节输入流
(2)OutputStream:字节输出流
(3)Reader:字符输入流
(4)Writer:字符输出流
2、分类
(1)按照方向分:输入流和输出流
(2)按照处理的方式不同:字节流和字符流
字符流只能处理纯文本的数据
(3)按照角色不同:节点流和处理流
处理流是建立在节点流的基础上的,处理流需要包装一个节点流的对象。
处理流也可以包装另外一个处理流。
3、API
(1)InputStream:
int read():一次读取一个字节,返回的是本次读取的字节的值,如果流末尾返回-1
int read(byte[] data):一次读取多个字节,读取的数据存储到data字节数组中,最多读取data.length个字节,返回的是实际本次读取的字节的个数,如果流末尾返回-1。从data[0]开始存储。
int read(byte[] data,int offset, int len):一次读取多个字节,读取的数据存储到data字节数组中,最多读取len个字节,返回的是实际本次读取的字节的个数,如果流末尾返回-1。从data[offset]开始存储。
void close():关闭
(2)OutputStream:
void write(int data):一次写一个字节
void write(byte[] data):一次写整个字节数组
void write(byte[] data, int offset, int len):一次字节数组的一部分,从[offset]开始,一共len个
void close():关闭
void flush():刷新
(3)Reader:
int read():一次读取一个字符,返回的是本次读取的字符的Unicode值,如果流末尾返回-1
int read(char[] data):一次读取多个字符,读取的数据存储到data字符数组中,最多读取data.length个字符,返回的是实际本次读取的字符的个数,如果流末尾返回-1。从data[0]开始存储。
int read(char[] data,int offset, int len):一次读取多个字符,读取的数据存储到data字符数组中,最多读取len个字符,返回的是实际本次读取的字符的个数,如果流末尾返回-1。从data[offset]开始存储。
void close():关闭
(4)Writer
void write(int data):一次写一个字符
void write(char[] data):一次写整个字符数组
void write(char[] data, int offset, int len):一次字符数组的一部分,从[offset]开始,一共len个
void write(String str):一次写整个字符串
void write(String str, int offset, int count):一次写字符串的一部分,从[offset]开始,一共count个
void close():关闭
void flush():刷新
文件IO流
1、类型
FileInputStream:文件字节输入流,可以读取任意类型的文件
FileOutputStream:文件字节输出流,可以把字节数据输出到任意类型的文件
FileReader:文件字符输入流,只能读取纯文本的文件。按照平台默认的字符编码进行解码。
FileWriter:文件字符输出流,只能把字符数据输出到纯文本文件。按照平台默认的字符编码进行编码。
2、读写文件的代码
示例代码:
public void copy(File src, File dest)throws IOException{
FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(dest);
byte[] data = new byte[1024];
while(true){
int len = fis.read(data);
if(len==-1){
break;
}
fos.write(data,0,len);
}
fis.close();
fos.close();
}
缓冲IO流
1、分为
BufferedInputStream:字节输入缓冲流,给InputStream系列IO流增加缓冲效果 BufferedOutputStream:字节输出缓冲流,给OutputStream系列IO流增加缓冲效果 BufferedReader:字符输入缓冲流,给Reader系列IO流增加缓冲效果
String readLine():按行读取
BufferedWriter:字符输出缓冲流,给Writer系列IO流增加缓冲效果
void newLine():输出换行符
2、默认的缓冲区的大小是8192 = 1024 * 8(字节/字符)
3、可以给读写的过程提高效率
不仅仅是可以给文件IO流增加缓冲效果,可以给任意符合对应类型的IO流增加缓冲效果。
示例代码:
public void copyBuffer(File src, File dest)throws IOException{
FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(dest);
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
byte[] data = new byte[1024];
while(true){
int len = bis.read(data);
if(len==-1){
break;
}
bos.write(data,0,len);
}
bos.close();
fos.close();
bis.close();
fis.close();
}
编码与解码的IO流
1、编码:OutputStreamWriter
可以把字符流转为字节流输出,并且在转换的过程中,可以指定字符编码。
2、解码:InputStreamReader
可以把字节输入流转为字符输入流,并且在转换的过程中,可以指定字符编码。
数据IO流
1、类型
DataInputStream:允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。 DataOutputStream:允许应用程序以适当方式将基本 Java 数据类型写入输出流中。
它俩必须配对使用
读的顺序要与写的顺序一致
2、API
DataOutputStream | DataInputStream |
writeInt(xx):输出int类型整数 | int readInt() |
writeDouble(xx):输出double类型 | double readDouble() |
writeBoolean(xx) | boolean readBoolean() |
writeLong(xx) | long readLong() |
writeChar(xx) | char readChar() |
writeByte(xx) | byte readByte() |
writeShort(xx) | short readShort() |
writeFloat(xx) | float readFloat() |
writeUTF(String str):输出字符串的 | String readUTF() |
对象IO流
1、类型
ObjectOutputStream:对象序列化,输出对象,把对象转为字节序列输出
ObjectInputStream:对象反序列化,读取对象,把字节序列重构成Java对象
2、API
ObjectOutputStream:writeObject(对象)
ObjectInputStream:Object readObject()
3、序列化需要注意哪些内容?
(1)所有要序列化的对象的类型都必须实现java.io.Serializable接口
如果对象的属性类型也是引用数据类型,那么也要实现java.io.Serializable接口
(2)希望类的修改对象反序列化不产生影响,那么我们最后能够增加一个序列化版本ID
private static final long serialVersionUID = 1L;
(3)如果有些属性不想要序列化,可以加transient
(4)如果某个属性前面有static修饰,也不参与序列化
4、除了Serializable接口之外,还可以实现java.io.Externalizable接口,但是要求重写:
void readExternal(ObjectInput in) void writeExternal(ObjectOutput out)
关于哪些属性序列化和反序列化,由程序员自己定。