文章目录
一、IO流
1.概述
概述:数据源和数据目标不仅仅是传统的存储在计算机磁盘上打的文件,也可以是网络上的文件,任何可读/写设备中的文件。数据可以从外界”流入”程序中,即为”I”(Input); 数据也可以从程序”流出”到外界,即为”O”(Output)。
注:
Java IO的所有操作类都放在Java.io包中,主要的类和接口是:
File、InputStream、OutputStream、Reader、Writer、Serializable接口
2.IO流的分类
(1)方法1
按
数据流的方向
不同可以分为输入流
和输出流
(如果数据是从外界流入程序
的,则是输入流,反之则是输出流)
(2)方法2
按是否直接操作源或者目标节分为节点流和装饰流
(3)方法3
按处理数据单位不同可以分为字节流和字符流
例如:
字节(最基础的存储单位):byte, 8bit;
字符:a-z, 8000 ,学
二、File类
注:
一个File类的对象,表示了磁盘上的文件或文件夹,只负责文件的本身,而不负责文件的内容。
1.File构造方法
方法声明 | 功能描述 |
---|---|
File(String pathname) | 通过指定的一个字符串类型的文件路径来创建一个新的File对象 |
File(String parent,String child) | 根据指定的一个字符串类型的父路径和一个字符串类型的子路径(包括文件名称)创建一个File对象 |
File(File parent,String child) | 根据指定的File类的父路径和字符串类型的 子路径(包括文件名称)创建一个File对象 |
2.File常用方法
方法声明 | 功能描述 |
---|---|
boolean exists() | 测试文件是否存在 |
boolean canWrite() | 测试文件是否可写 |
boolean canRead() | 测试文件是否可读 |
boolean isFile() | 测试当前文件是否是文件 |
boolean isDirectory() | 测试当前文件是否是目录 |
long lastModified() | 获取文件最后一次修改时间 |
long length() | 获取文件的长度,以字节为单位 |
boolean delete() | 删除当前文件 |
boolean renameTo(File dest) | 重命名当前File对象表示的文件 |
String getAbsolutePath() | 获取文件的绝对路径 |
String getName() | 获取文件的名称 |
boolean mkdir() | 创建当前File对象指定的目录 |
public String[] list() | 以字符串数组返回当前文件夹下的所有文件 |
public File[] listFiles() | 以文件数组返回当前文件夹下的所有文件 |
public String[] list(FilenameFilter filter) | / |
public File[] listFiles(FilenameFilter filter) | / |
注:
FilenameFilter: 是一个接口,boolean accept(File,dir,String filename)由此来限制由list()方法返回的文件数量,使之只返回符合某一过滤器的文件。
三、字节流
IO流中针对
字节
的输入输出提供了一系列的流,统称为字节流
。根据数据的传输方向可将其分为字节输入流
和字节输出流
。在io包中,提供了两个抽象类InputStream
和OutputStream
,他们是字节流的顶级父类。
1.输入流
(1)常用方法
方法声明 | 功能描述 |
---|---|
int read() | 从输入流读取一个8位的字节,把它转换为0~255之间的整数,并返回这一整数 |
int read(byte[] b) | 从输入流读取若干字节,把它们保存到参数b指定的字节数组中,返回的整数表示读取字节的数目 |
int read(byte[] b,int off,int len) | 从输入流读取若干字节,把它们保存到参数b指定的字节数组中,off指定字节数组开始保存数据的起始下标,len 表示读取的字节数目。 |
void close0 | 关闭此输入流并释放与该流关联的所有系 |
(2)输入流子类
2.输出流
(1)常用方法
方法声明 | 说明 |
---|---|
close() | 关闭此输出流并释放写此流有关的所有系统资源。 |
flush() | 刷新输出流,即使缓冲区未满强制输出缓冲区中的字节。 |
write(byte[] b) | 将b.length个字节从指定的byte数组写入此输出流。 |
write(byte[] b, int off, int len) | 将指定byte数组中从偏移量off开始的len个字节写入此输出流 |
write(int b) | 将指定的字节写入此输出流。 |
(2)输出流子类
四、缓冲区
1.文件复制实现思路
注:
当通过流的方式拷贝文件时,为了提高效率也可以定义一个字节数组
作为缓冲区。在拷贝文件时,可以一次性读取多个字节的数据,并保存在字节数组中,然后将字节数组中的数据一次性写入文件。
2.案例
(1)字节数组作为缓冲区
public class FileCopyDemo {
public static void main(String[] args) throws Exception {
InputStream in = new FileInputStream("source\\text");
// 创建一个文件字节输出流,用于将读取的数据写入target目录下的文件中
OutputStream out = new FileOutputStream("target\\text");//想要把source目录下的text文件复制到target目录下名也为text的文件
byte[] buff = new byte[1024];// 利用字节数组,开辟的空间是1024
int len;
long begintime = System.currentTimeMillis();// 获取拷贝文件前的系统时间
while ((len = in.read(buff)) != -1) {// 读取一个字节并判断是否读到文件末尾
out.write(buff, 0, len);// 利用write的另一种方法,为了防止最后读取的字节数不是1024的整数倍,这种情况下就从0开始写出len个字节到指定的文件中去
}
long endtime = System.currentTimeMillis();// 获取文件拷贝结束时的系统时间
System.out.println("拷贝文件所消耗的时间是:" + (endtime - begintime) + "毫秒");
in.close();
out.close();
}
}
(2)字节缓冲流
public class FileCopyDemo2 {
public static void main(String[] args) throws Exception {
// 创建一个字节输入流,用于读取当前目录下source文件夹中的text文件
InputStream in = new BufferedInputStream(new FileInputStream("source\\text"));
// 创建一个文件字节输出流,用于将读取的数据写入target目录下的文件中
OutputStream out = new BufferedOutputStream(new FileOutputStream("target\\text"));// 这条语句的意思是:想要把source目录下的text文件复制到target目录下名也为text的文件
byte[] buff = new byte[1024];// 利用字节数组,开辟的空间是1024
int len;
long begintime = System.currentTimeMillis();// 获取拷贝文件前的系统时间
while ((len = in.read(buff)) != -1) {// 读取一个字节并判断是否读到文件末尾
out.write(buff, 0, len);// 利用write的另一种方法,为了防止最后读取的字节数不是1024的整数倍,这种情况下就从0开始写出len个字节到指定文件中去
}
long endtime = System.currentTimeMillis();// 获取文件拷贝结束时的系统时间
System.out.println("拷贝文件所消耗的时间是:" + (endtime - begintime) + "毫秒");
in.close();
out.close();
}
}
五、字符流
InputStream类和OutputStream类在读写文件时操作的都是字节。如果希望在程序中操作字符,使用这两个类就不太方便,为此io包提供了字符流。同字节流一样,字符流也有两个抽象的顶级父类,分别是
Reader
和Writer
。