1.流的分类
- 按单位
- 字节流:以字节为单位(8位),可以读写所有数据
- 字符流:以字符为单位(16位),只能读写文本数据
- 按功能
- 节点流:具有实际传输数据的读写功能。
- 过滤流:在节点流的基础之上增强功能。
- 按方向
- 输入流:将 存储设备 中的内容读入到 内存 中。
- 输出流:将 内存 中的内容写入到 存储设备 中。
InputStreamReader
和OutputStreamWriter
,前者负责将InputStream
转换为Reader
,而后者负责将OutputStream
转换为Writer
。
2.字节流
字节流扩展实例
2.1 InputStream
的主要功能是将数据一个字节一个字节的读到内存,InputStream
是一个抽象类。
int available()
返回当前输入流中可以读取(或跳过)的字节数量的估量值(当前输入流没有被另一个方法请求而导致阻塞)。void close()
关闭当前输入流并且释放输入流占用的所有系统资源。abstract int read()
从当前位置开始,从输入流中读取下一个字节的数据(若读到流的尾部,返回-1)。int read(byte[] b)
从当前位置开始,从输入流中读取b.length
个字节的数据存放到b
中(实际读取到的数据要看输入流中的字节数,最多读取的数量就是b.length
,返回值为实际读取的字节数)。int read(byte[] b, int off, int len)
从当前位置开始,从输入流中读取len
个字节的数据存放到b
中(字节存放的位置为b[off],b[off+1],… 。实际中读取的数据可能并没有len个字节,具体看输入流中还剩余在多少数据,返回值为实际读取的字节数)。
2.2 OutputStream
的主要作用是将数据一个字节一个子集的写入到文件或者网络中,OutputStream
也是抽象类。
void close()
关闭输出流并释放该输出流占用的所有系统资源。void flush()
刷新当前输出流,并将该流中缓冲的字节数据全部写入到磁盘。void write(byte[] b)
将字节数组b
中的数据全部写入到输出流中,要写入到磁盘需要调用flush()
函数。void write(byte[]b, int off, int len)
将字节数组b
中的数据,从off
位置开始算起,写入len
个字节到输出流。abstract void write(int b)
先将int
转换为byte
类型,然后将低位数据写入到输出流中。
3.字符流
字符流扩展实例
3.1 Reader
的主要功能是将数据一个字符一个字符的读入到内存,Reader
是一个抽象类。
abstract viud close()
关闭流,并且释放该流占用的所有系统资源。int read()
从流中读取单个字符。int read(char[] cbuf)
从当前位置读取cbuf.length
个字符到cbuf
数组中,但实际读取的字符个数取决于流中剩余字符个数,返回值为实际读取的字符个数。abstract int read(char[] cbuf, int off, int len)
从当前位置开始,从输入流中读取len
个字节的数据存放到b
中,字节存放的位置为b[off],b[off+1],… 。实际中读取的数据可能并没有len个字节,具体看输入流中还剩余在多少数据,返回值为实际读取的字节数。
3.2 Writer
的主要功能是将数据一个字符一个字符的写入到文件或者网络中,Writer
也是抽象类。
Writer append(char c)
追加字符c
到Writer流中,追加到尾部。返回值为追加后的此Writer。Writer append(CharSequence csq)
追加字符序列csq
到Writer流中,追加到尾部,返回值为追加后的此Writer。Writer append(CharSequence csq,int start,int end)
追加字符序列csq
的子序列到Writer流中,追加到尾部,返回值为追加后的此序列。abstract void close()
关闭流,在关闭之前会先调用flush()
。abstract void flush()
刷新流,并将已经在流中的数据写入到磁盘指定位置。void write(char[] cbuf)
将字符数组写入到流中。abstract void write(char[] cbuf, int off, int len)
将字符数组cbuf
中的指定部分写入到流中,从off
开始,写入len
个字符。void write(int c)
取int型的低16位组成一个字符,然后将这个字符写入到流中,忽略高16位数据。void write(String str)
将字符串写入到流中。void Write(String str, int off, int len)
将字符串·str·指定位置的子串写入到流中,子串起始位置为off,子串长度为len。
4.File类
代表物理盘符中的-一个文件或者文件夹。
createNewFile()
创建一个新文件mkdir()
创建一 个新目录delete()
删除文件或空目录exists()
判断File对象所对象所代表的对象是否存在getAbsolutePath()
获取文件的绝对路径getName()
取得名字getParent()
获取文件/目录所在的目录isDirectory()
是否是 目录isFile()
是否是文件length()
获得文件的长度listFiles()
列出目录中的所有内容renameTo()
修改文件名
5.FileFilter接口
public interface FileFilter
boolean accept (File pathname)
当调用File类中的listFiles()
方法时,支持传入FileFilter
接口接口实现类,对获取文件进行过滤,只有满足条件的文件的才可出现在listFiles()
的返回值中。
import java.io.File;
import java.io.FileFilter;
import java.util.Date;
/**
* @author Nigori
* @date 2020/8/8
**/
public class FileDemo {
public static void main(String[] args) throws Exception {
separator();
fileOpe();
directoryOpe();
}
//分隔符
public static void separator() {
System.out.println("路径分隔符:" + File.pathSeparator);
System.out.println("反斜杠分隔符:" + File.separator);
}
//文件操作
public static void fileOpe() throws Exception {
//1.创建文件
File file = new File("IOStreamTest/filedemo.txt"); //此时还没有创建
if (!file.exists()) {
boolean bo = file.createNewFile();
System.out.println("创建是否成功? " + bo);
}
/*//2.删除文件
//2.1直接删除
//System.out.println("删除结果:" + file.delete());
//2.2JVM退出时删除
file.deleteOnExit();
Thread.sleep(5000);*/
//3.获取文件信息
System.out.println("获取文件的绝对路径:" + file.getAbsolutePath());
System.out.println("获取路径:" + file.getPath());
System.out.println("获取文件名称:" + file.getName());
System.out.println("获取父目录:" + file.getParent());
System.out.println("获取文件长度:" + file.length());
System.out.println("文件创建时间:" + new Date(file.lastModified()).toLocaleString());
//4.判断
System.out.println("是否可写:" + file.canWrite());
System.out.println("是否是文件:" + file.isFile());
System.out.println("是否隐藏:" + file.isHidden());
}
//文件夹操作
public static void directoryOpe() throws Exception {
//1.创建文件
File dir = new File("IOStreamTest\\directory\\dirtest"); //此时还没有创建
if (!dir.exists()) {
//dir.mkdir(); //创建单级目录
boolean bo = dir.mkdirs();
System.out.println("文件夹创建是否成功? " + bo); //创建多级目录
}
/*//2.删除文件夹
//2.1直接删除(删除的是空目录)
//System.out.println("文件夹删除结果:" + dir.delete());
//2.2JVM退出时删除(删除的是空目录)
dir.deleteOnExit();
Thread.sleep(5000);*/
//3.获取文件信息
System.out.println("获取文件的绝对路径:" + dir.getAbsolutePath());
System.out.println("获取路径:" + dir.getPath());
System.out.println("获取文件名称:" + dir.getName());
System.out.println("获取父目录:" + dir.getParent());
System.out.println("文件创建时间:" + new Date(dir.lastModified()).toLocaleString());
//4.判断
System.out.println("是否是文件夹:" + dir.isDirectory());
System.out.println("是否隐藏:" + dir.isHidden());
//5.遍历文件夹
File fileList_1 = new File("IOStreamTest\\picture");
String[] files = fileList_1.list();
for (String str:files) {
System.out.println(str);
}
//FileFilter接口的使用
File[] fileList_2 = fileList_1.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
if (pathname.getName().endsWith(".jpg")) {
return true;
}
return false;
}
});
for (File file_jpg:fileList_2) {
System.out.println(file_jpg.getName());
}
}
}