File类:(学IO流的大前提)
作用:在java程序中,对磁盘文件进行描述的类。文件和目录路径名的抽象表示形式。
//包括构造方法,四个属性(分隔符)
普通方法:
boolean | canExecute() 测试应用程序是否可以执行此抽象路径名表示的文件。 |
boolean | canRead() 测试应用程序是否可以读取此抽象路径名表示的文件。 |
boolean | canWrite() 测试应用程序是否可以修改此抽象路径名表示的文件。 |
int | compareTo(File) 按字母顺序比较两个抽象路径名。 |
boolean | exists() 测试此抽象路径名表示的文件或目录是否存在。 |
boolean | createNewFile() 创建一个新的空文件(若存在则创建失败) |
boolean | delete() 只能删除文件和空文件夹,非空文件夹不能使用delete方法删除 deleteOnExit() 退出虚拟机之后再删除 |
File | getAbsoluteFile() 返回此抽象路径名的绝对路径名形式。 |
String | getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。 |
File | getCanonicalFile() 返回此抽象路径名的规范形式。 |
String | getCanonicalPath() 返回此抽象路径名的规范路径名字符串。 |
String | getName() 返回由此抽象路径名表示的文件或目录的名称。 |
String | getParent() 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。 |
File | getParentFile() 返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录则返回 null。 |
String | getPath() 将此抽象路径名转换为一个路径名字符串。 |
boolean | isDirectory() 测试此抽象路径名表示的文件是否是一个目录。 |
boolean | isFile() 测试此抽象路径名表示的文件是否是一个标准文件。 |
boolean | isHidden() 测试此抽象路径名指定的文件是否是一个隐藏文件。 |
String[] | list() 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。 |
boolean | mkdir() 创建此抽象路径名指定的目录。 |
boolean | mkdirs() 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。 |
boolean | renameTo(File dest) 重新命名此抽象路径名表示的文件。 |
File[] | listFiles() 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 |
FilenameFilter接口:是文件名过滤器
list(FilenameFilter filter) 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
IO流:(以内存为参照物)
0、什么情况下,会用到IO流:
上传,下载
通信
复制粘贴剪切
对文件内容进行编辑
1) 数据库本质上也是文件存储的
2) 可以将一些数据存入到文件中或者读取文件中的内容
1、什么是IO流:
磁盘上的文件和内存之间进行交互,数据的交互需要有一个媒介或者管道,把这个媒介或者管道就称为IO流,也被称为输入输出流【I:Input O:Output】
输入:从外部存储设备到内存叫输入|读取。
输出: 从内存到外部存储设备叫输出|写入。
2、流的作用和原理:
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
3、IO流的种类
按照流的流向分:输入流和输出流
按照数据单位分:字节流和字符流(2个字节)注:图片,视频,音乐等都以字节流传输
FileInputStream文件输入流(字节流):
是输入流InputSream类(抽象类)的子类。
1.构造方法:
FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。
2.普通方法:(注:返回值是如果已到达文件末尾,则返回 -1)
void | close() 关闭此输入流并释放与该流关联的所有系统资源。 |
abstract int | read() 从输入流中读取数据的下一个字节。 |
int | read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。 |
int | read(byte[] b, int off, int len)将输入流中最多 len 个数据字节读入 byte 数组。 |
FileOutputStream文件输出流(字节流):
是输出流OutputSream类(抽象类)的子类。
1.构造方法:
FileOutputStream(File file) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。 |
FileOutputStream(File file, boolean append) 创建文件输出流,append表示是否重写文件内容,true表示将字节写入文件末尾处,而不是写入文件开始处。上面默认是false,重写文件内容! |
FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流。 |
FileOutputStream(String name, boolean append) 创建文件流,append同上! |
2.普通方法:
void | close() 关闭此输出流并释放与此流有关的所有系统资源。 |
void | flush() 刷新此输出流并强制写出所有缓冲的输出字节。 |
void | write(byte[] b) 将 b.length 个字节从指定的 byte 数组写入此输出流。 |
void | write(byte[] b, int off, int len)将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。 |
abstract void | write(int b) 将指定的字节写入此输出流。 |
Reader类字节输入流:
Reader:是所有字符输入流的父类,为一个抽象类,不能实例化对象,使用它的子类FileReader类。
1.FileReader构造方法:
FileReader(File file) 在给定从中读取数据的 File 的情况下创建一个新 FileReader。
FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader。
2.Reader普通方法(FileReader继承)
abstract void | close() 关闭该流并释放与之关联的所有资源。 |
int | read() 读取单个字符。 |
int | read(char[] cbuf) 将字符读入数组。 |
abstract int | read(char[] cbuf, int off, int len) 将字符读入数组的某一部分。 |
Writer类字符输出流:
Writer:是所有字符输出流的父类,为一个抽象类,不能实例化对象,使用它的子类FileWriter类
1.FileWriter构造方法:
FileWriter(File file) 根据给定的 File 对象构造一个 FileWriter 对象。 |
FileWriter(File file, boolean append) 根据给定的 File 对象构造一个 FileWriter 对象。 |
FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象。 |
FileWriter(String fileName, boolean append) 根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。 |
2.Writer普通方法:
abstract void | close() 关闭此流,但要先刷新它。 |
abstract void | flush() 刷新该流的缓冲。强制写入磁盘! |
void | write(char[] cbuf) 写入字符数组。 |
abstract void | write(char[] cbuf, int off, int len) 写入字符数组的某一部分。 |
void | write(int c) 写入单个字符。 |
void | write(String str) 写入字符串。 |
void | write(String str, int off, int len)写入字符串的某一部分。 |
使用字节流复制文件(字符流复制文件同理)
复制的文件是文本文件 ,用字节流和字符流都可以
复制的文件是图片、音乐、电影, 用字符流复制会出现问题,一定要使用字节流
转换流:
作用:
a.实现字节流到字符流的转换
b.解决中文乱码的问题
GBK (英文数字都是一个字节,中文是两个或四个字节)
Unicode (2个字节)
utf-8 (1,2,3个字节)
c.只有转换流才能指定读取和写入的字符集
1,InputStreamReader类:
是Reader类的子类,所以它是字符输入流!它也是FileReader类的父类。
InputStreamReader:字节字符转换输入流,将字节输入流转换为字符输入流
1>构造方法:
InputStreamReader(InputStream in) 创建一个使用默认字符集的 InputStreamReader。
InputStreamReader(InputStream in,String charsetName)创建使用指定字符集的 InputStreamReader。
//注:如果要读的文件,它的内容不是以charsetName编码方式编写的,读出来的内容就可能会乱码!
例子:
public static void main(String[] args) throws Exception {
//1.实例化File的对象
//File file = new File("file/input1.txt");
//2.实例化转换输入流的对象
//注意:当一个流的存在的意义是为了实例化另外一个流,则这个流不需要手动进行关闭
//InputStream input = new FileInputStream(file);
//InputStreamReader reader = new InputStreamReader(input);
//使用默认的字符集【GBK】进行实例化转换流
//InputStreamReader reader = new InputStreamReader(new FileInputStream(new File("file/input1.txt")));
//使用指定字符集进行实例化转换流
//字符集一般使用字符串直接传参,不区分大小写,但是,如果字符集书写有误的话,则会跑出java.io.UnsupportedEncodingException的异常
InputStreamReader reader = new InputStreamReader(new FileInputStream(new File("file/input1.txt")),"UTF-8");
//3.读取
char[] arr = new char[16];
int len = 0;
while((len = reader.read(arr)) != -1) {
String string = new String(arr, 0, len);
System.out.println(string);
}
reader.close();
}
2>普通方法:close,read
2,OutputStreamWriter类
是Writer类的子类,所以它是字符输出流!它也是FileWriter类的父类。
OutputStreamWriter:字节字符转换输出流,将内存中的字节转成字符保存到硬盘中。
1>构造方法:
OutputStreamWriter(OutputStream out) 创建使用默认字符编码的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, String charsetName) 创建使用指定字符集的 OutputStreamWriter。
//以charsetName编码方式编码要写的文件的内容!
2>普通方法:flush,close,write
缓冲流:
作用:主要是为了增强基础流的功能而存在的,提高了流的工作效率【读写效率】
1,BufferedInputStream类
它实际上就是FileInputStream的增强类(是FilterInputStream类的子类,FilterInputStream类是InputStream(字节流)的子类)。
构造方法:
BufferedInputStream(InputStream in) 创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
普通方法:同FileInputStream
2,BufferedOutputStream类(同1)
3,BufferedReader类
它实际就是FileReader的增强类(也是Reader类的子类)
构造方法:
BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。
普通方法:同FileReader,增加了readLine() 读取一个文本行。
4,BufferedWriter类(同3)
普通方法增加了newLine() 写入一个行分隔符。
内存流:(字节流)
输入和输出都是从文件中来的,当然,也可将输出的位置设置在内存(定义的一个数组)上,这就需要ByteArrayInputStream和ByteArrayOutputStream
ByteArrayInputStream:将内容写入到内存(数组)中,是Inputstream的子类
ByteArrayOutputStream:将内存(数组)中数据输出,是OutputStream的子类
此时的操作应该以内存(数组)为操作点
1,ByteArrayInputStream类:
构造方法:
ByteArrayInputStream(byte[] buf) 创建一个 ByteArrayInputStream,使用 buf 作为其缓冲区数组。 |
ByteArrayInputStream(byte[] buf, int offset, int length) 创建 ByteArrayInputStream,使用 buf 作为其缓冲区数组。 |
普通方法:close,read //注意每次读入的是一个字节!
2,ByteArrayOutputStream类:
构造方法:ByteArrayOutputStream() 创建一个新的 byte 数组输出流。
普通方法:close,write,增加了
toString() 使用平台默认的字符集,通过解码字节将缓冲区内容转换为字符串。
toString(String charsetName) 使用指定的 charsetName,通过解码字节将缓冲区内容转换为字符串。
//注意:该方法将字节数据组合成了字符数据!
例子:
结果:
标准输入输出流:
Java的标准输入/输出分别通过System.in和System.out实现,默认情况下分别代表是键盘和显示器
System.out 是PrintStream类的一个实例化对象,继承FilterOutputStream(继承OutputStreaml类)类
1,PrintStream类
构造方法:
PrintStream(File file) 创建具有指定文件且不带自动行刷新的新打印流。
PrintStream(String fileName) 创建具有指定文件名称且不带自动行刷新的新打印流。
普通方法:常用print,printf,println等
setOut(PrintStream out) 重新分配“标准”输出流。
2,System.in 是InputStream类的实例化对象
System.setIn(InputStream in);
对象流:ObjectOutputStream和ObjectInputStream
流中流动的数据是对象:
如果将一个对象写入到本地文件中,被称为对象的序列化(文件打开也是乱码)
如果将一个本地文本中的对象读取出来,被称为解对象序列化
1,ObjectOutputStream类
构造方法:
ObjectOutputStream(OutputStream out) 创建写入指定FileOutputStream 的 ObjectOutputStream。
普通方法:
writeObject(Object obj);//object对象要实现Serializable接口(序列化接口),否则会出现java.io.NotSerializableException异常
序列化之后的Object类要写一个属性serialversionUID,它就像一个编号,在反序列时使用。
将来使用输入流从文本中拿到这个对象时要进行反序列化(对象在网络中传输必须序列化)
序列化类似于编码(加密),反序列化相当于解码
2,ObjectInputStream类
其中readObject();只能用一次!不可以连续读!解决方法:写入List集合,就读出一个List集合,再分解!
而writeObject(Object obj)可以写入多个对象。