IO | 字符流 | Reader(源) | BufferedReader | LineNumberReader |
InputStreamReader | FileReader(字节流通向字符流的桥梁) | |||
StringReader | ||||
Writer(目的) | BufferedWriter | |||
OutputStreamWriter | FileWriter(字符流通向字节流的桥梁) | |||
StringWriter | ||||
PrintWriter | ||||
字节流 | InputStream(源) | FileInputStream | ||
SequenceInputStream | 合并流 | |||
ByteArrayInputStream | 在构造的时候,需要接收数据源,而且数据源为字节数组; | |||
OutputStream(目的) | FileOutputStream | |||
ByteArrayOutputStream | 内部定义了一个可变长度的字节数组,它就是数据目的地; |
在判断文件对象是否是文件或者目录时,必须要先判断该文件对象封装的内容是否存在,通过exists判断; 在文本文件操作流构造的时候还可指定编码方式;
File f;
f.exists();
f.isDirectory();
f.isFile();
f.deleteOnExit();// 在程序退出的时候将指定文件删除;
f.createNewFile();// 在指定位置创建文件,如果文件已经存在,则返回false;
f.getParent();//此方法返回的是绝对路径中的父目录,如果获取的是相对路径,返回Null,如果相对路径中有上一层目录则返回该目录;
File.separator //文件系统分割符,不同系统分割符不同;
FilenameFilter://用于过滤文件名;
FilenameFilter.accept(File dir,String name); //测试指定文件是否包含在某一文件列表中;
name:文件的名称;
public boolean accept(File dir, String name) { return name.endsWith(".txt"); }
//缓冲区的出现是为了提高流的操作效率而出现的;在创建缓冲区之前,必须要有流对象;
//缓冲技术其实是在对象内部封闭了数组,存完了之后一次性写入;
Constructor: 将流传入buffer的构造函数;
Notice:只要用到缓冲区,就得对缓冲区进行刷新;
Buffered... buf;
buf.flush();
buf.close();//关闭缓冲区就是关闭缓冲区中的流对象;
BufferedReader bufr;
bufr.readLine();//返回一行,但不包含换行符;
// 无论读取一行还是多个字符,其实最终都是在硬盘上一个一个的读取,所以最终使用的方法还是read方法一次读一个
/*
* ByteArrayInputStream:在构造的时候,需要接收数据源,而且数据源为字节数组;
* ByteArrayOutputStream:在构造的时候,不用定义数据目的,因为内部定义了一个可变长度的字节数组,它就是数据目的地;
* 两个流对象都操作的是数组,并没有使用系统资源,不需要进行关闭的操作;
*/
// 关闭流资源之前会刷新一次内部缓冲区中的数据;
// flush();刷新(将缓冲区中的数据存入文件中)后,流继续使用;
// 序列化:静态的成员不能序列化;
// 如果不想让非静态成员被序列化,加修饰符:transient int,,,
System.in:InputStream
System.out:OutputStream