day35——IO流
一、上节课回顾
1、线程池
理解为一个容器,装有预先创建好的线程对象,执行任务。执行后归还给线程池等待下次的任务。降低了程序的开销:频繁的创建和销毁线程对象。。
Executor:接口
ExecutorService:线程池接口
Executors:工厂类(专门负责创建线程池的)
ExecutorService es = Executors.newFixedThreadPool(n);
ExecutorService es = Executors.newCachedThreadPool();
创建任务:实现Runnable接口
submit();//将任务提交给线程池,由线程池负责分配线程对象来执行任务。。
2、File类的操作
描述文件和目录
文件:带后缀的,存储数据。靠后缀区分。
mp3:音频文件,mp4:视频文件,jpg/png/gif...图片文件,txt:文本文档,java文件:
目录:用于存储文件和目录的。
路径:描述文件或文件夹位置
绝对路径:C:\Ruby\pro\aa\abc.txt
相对路径:aa
程序来讲:永远相对于项目目录
File("aa\abc.txt");
在项目目录下:aa文件夹,里面abc.txt
构造方法:File类的对象:
File(String path);
File(String parent,String child);
File(File parent,String child);
常用方法:
文件:
boolean createNewFile();//用于创建一个新文件
long length();//用于获取一个文件的大小,字节
目录:文件夹
boolean mkdir();//用于创建一层文件夹
boolean mkdirs();//用于创建多层(不存在的但是必须有)
String[] list();//获取目录中的子内容(文件,文件夹),只获取一层。如果作用文件上,返回null。
File[] listFiles();//
listFiles(FileFilter);//接口:文件过滤器:accept(File)-->boolean
两者皆可:
delete();//文件或文件夹(空文件夹才可以)
deleteOnExit();
exists();//判断file对象对应的文件文件夹,是否存在
isFile()-->boolean,判断是否是文件
isDirectory()-->boolean,判断是否是目录
canRead()
canWriter()
getName();//文件或目录的名称
getPath();//获取文件或目录的路径
getAbsolutePath();//获取绝对路径,从根盘符开始描述
getAbsoluteFile();//File
getParent()-->String
getParentFile()-->File
toString()-->String,重写Object类的toString(),文件的路径名
递归遍历文件夹
3、IO初识
I/O流
I:Input
O:Outout
流:Stream,数据
IO流:流的就是数据。用于将数据从一个地方流到另一个地方。
文件——>程序
程序——>文件
网络——>程序
程序——>网络
流的分类:
流向:
输入流:数据从外边进入到程序中。。读取数据
输出流:数据从程序中出去。。写出数据
单位:
字节流:以字节为单位。
字符流:以字符为单位。
数据的本质都是01码。8个01码——>byte字节。字节流是一个最根本的流。
功能:
节点流:直接接触数据源的流
处理流:套在流上的流。又叫过滤流。
File,String,Date,Thread。。。
FileInputSteram,BufferedInputStream,BufferedOutputStream,ObjectInputStream,DataInputStream,ByteArrayInputStream。。。。
二、本节课内容
2.1、4大基类流
InputStream,字节输入流:抽象的
OutputStream:字节输出流:抽象的
Reader:字符输入流:抽象的
Writer:字符输出流:抽象的
2.2、IO流的操作步骤
step1:确定数据从哪到哪。文件信息。
step2:创建流:
流向:输入,输出
单位:字节,字符
子类流:文件,内存。。。。
step3:操作流
读取数据:输入
read()
写出数据:输出
write()
step4:关闭流
close()
2.3、FileInputStream
用于以字节为单位,读取文件中的数据,到程序中。
1、构造方法:
FileInputStream(Stringname)
通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的路径名name命名。
FileInputStream(Filefile)
通过打开与实际文件的连接创建一个FileInputStream,该文件由文件系统中的File对象file命名。
read()-->int
每次读取一个字节。返回值就是读入的数据本身。如果读到文件的末尾了,-1。
read(byte[] bs)-->int
每次读取多个字节,最多是bs数组的长度个。返回值是本次读取的实际的字节个数。如果到达末尾,-1.
int read(byte[] bs, int off, int len)
从该输入流读取最多 len字节的数据为字节数组 。第一个参数表示要存储本地读取的数据的数组,第二个参数,表示从哪个下标开始存储,第三个参数是表示本次读取预计的读取数量。该方法的返回值是本次读取的实际数量。如果到达文件末尾,-1。
byte[] bs = new byte[3];//内存资源
数据源:250个字节
数组:100个长度
1次:100,剩150 读取100个
2次:100,剩50 读取100个
3次:50,读完了 读取50个
int read(byte[] bs) -->读多个,最多数组长度,实际看返回值,数据在数组中,将读取到的数据存入到数组中,默认从头开始存储。
在操作IO流读取本地文件的数据,提升效率。
硬盘和内存
read()-->每次读取一个数据,
read(byte[] bs)--> 1000
每次读取一个字节:
使用字节数组作为缓冲区,读取数据:
2.4、FileOutputStream
构造方法:
FileOutputStream(String name) ,在文件开头写,擦除写
创建文件输出流以指定的名称写入文件。
FileOutputStream(String name, boolean append) ,在文件的末尾写数据,追加
创建文件输出流以指定的名称写入文件。
FileOutputStream(File file) ,在文件开头写,擦除写
创建文件输出流以写入由指定的 File对象表示的文件。
FileOutputStream(File file, boolean append) ,在文件的末尾写数据,追加
创建文件输出流以写入由指定的 File对象表示的文件。
写出去的数据,是清空写。将文件中原来的数据全部擦除,从头开始写数据。
voidwrite(intdata),将参数,这个字节数据写出去
voidwrite(byte[]b),将b.length个字节从指定的字节数组写入此文件输出流。
voidwrite(byte[]b,intoff,intlen) ,将len字节从位于偏移量off的指定字节数组写入此文件输出流。
String--->byte[]
String--->char[]
思考题:
1、向文件中写数据的时候,如果文件不存在,能写吗?如果文件所在的文件夹不存在,能写吗?
如果文件不存在,FileOutputStream在写出数据的时候,会先创建文件,再写出。
但是如果文件夹不存在,那么就报错。(java.io.FileNotFoundException: C:\Ruby\pro\aa\bb\abc.txt (系统找不到指定的路径。)
2、能不清空的写,屁股后面写,不擦除原来的数据?
FileOutputStream(path)-->开头写
FileOutputStream(path , append-->true)-->末尾写