流的基本概念
数据源 data source. 提供原始数据的原始媒介。常见的:数据库、文件、其他程序、内存、网络连接、IO设备。
数据源就像水箱,流就像水管中流着的水流,程序就是我们最终的用户。 流是一个抽象、动态的概念,是一连串连续动态的数据集合。
Java流的分类
按流区分为输出流和输入流
输出流:OutputStream和Writer作为基类
输入流:InputStream和Reader作为基类
输入输出流是相对于计算机内存来说的,而不是相对于源和目标
按照处理数据单元划分为字节流和字符流
字节流:字节输入流InputStream基类 字节输出流OutputStream基类
字符流:字符输入流Reader基类 字符输出流Writer基类
字节流是8位通用字节流,字符流是16位Unicode字符流
功能不同
节点流:可以直接从数据源或目的地读写数据。
处理流(包装流):不直接连接到数据源或目的地,是其他流进行封装。目 的主要是简化操作和提高性能.
节点流和处理流的关系
节点流处于io操作的第一线,所有操作必须通过他们进行
处理流可以对其他流进行处理(提高效率或操作灵活性)
使用FileInputStream 读文本文件
//File类在Java中表示抽象类路径名,可以表示一个具体的文件也可以表示一个目录。
public class FileDemo {
public static void main(String[] args) {
// File file = new File("a.txt");
//创建文件
// try {
// file.createNewFile();
// } catch (IOException e) {
// e.printStackTrace();
// }
//执行,读取,修改
// System.out.println(file.canExecute());
// System.out.println(file.canRead());
// System.out.println(file.canWrite());
//删除文件或目录
// System.out.println(file.exists());
// System.out.println(file.delete());
//返回此抽象路径名的绝对形式
// System.out.println(file.getAbsoluteFile());
//返回此抽象路径名的绝对路径字符串
// System.out.println(file.getAbsolutePath());
//返回文件的父目录,如果文件路径名是一个具体的文件,此时返回null
// System.out.println(file.getParent());
// System.out.println(file.getPath());
// System.out.println(file.isDirectory());
// System.out.println(file.isFile());
// System.out.println(file.length());
File file2 = new File("123.txt");
//即使没有这个文件,也可以获取文件的绝对路径名
System.out.println(file2.getAbsolutePath());
System.out.println(file2.lastModified());
// System.out.println("****************");
// File file3 = new File("E:\\mate");
// String[] strings = file3.list();
// for(String path : strings){
// System.out.println(path);
// }
// File[] files = file3.listFiles();
// for(File file1 :files){
// System.out.println(file1);
// }
//遍历E盘下所有的文件和目录?
// System.out.println("**********************");
File[] roots = File.listRoots();
// for(File root :roots){
// System.out.println(root);
// }
// printFiles(new File("E:\\mate"));
// File file4 = new File("E:\\a.txt");
// file4.mkdir();
// file4.mkdirs();
// file4.renameTo(new File("a123.txt"));
// System.out.println(File.separator);
//删除目录?
File file5 = new File("E:\\mate\\abc");
file5.delete();
}
//在遍历文件的时候,文件系统中可能存在一些受保护的文件,访问是需要访问权限的,此时会抛出空指针异常。
public static void is(File file){
//获取指定路径名下所有的文件和目录
File[] files = file.listFiles();
//遍历文件
for(File file1 : files){
//判断是否是目录
if(file1.isDirectory()){
is(file1);
}else{
System.out.println(file1.getAbsolutePath());
}
}
}
}
什么时候需要加flush,什么时候不加flush
最保险的方式,在输出流关闭之前每次都flush一下,然后再关闭
当某一个输出流对象中带有缓冲区的时候,就需要进行flush,不建议大家去记住每一个输出流的分类
public class WriterDemo {
public static void main(String[] args) {
File file = new File("a1.txt");
Writer writer = null;
try {
//创建字符流对象
writer = new FileWriter(file,true);
//传输数据
writer.write(99);
writer.write("abc 你好,中国!");
writer.write(new char[]{'5','t','p'});
writer.append('z').append('y').append('y').append('L');
//强制将缓冲区的数据写入到目的地
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
File 类用于访问文件或目录的属性
程序和数据源之间通过流联系
输入流和输出流
字节流和字符流
节点流和包装流
FileInputStream和FileOutputStream以字节流的方式读写文本文件。
BufferedReader和BufferedWriter以字符流的方式读写文本文件,而且效率更高。