IO流(输入流和输出流)的一些相关总结
2.File类
-
创建文件对象
-
File file = new File(String pathname);
-
String pathname:创建文件对象(物理文件或目录) 格式:“c:\\test.txt"或者"c:/test.txt"
-
-
-
通过文件对象的方法:操作文件或目录的属性(路径、权限、日期和时间等)
-
File类的常用方法
-
boolean exists();
-
判断文件或目录是否存在
-
-
boolean isFile();
-
判断是否是文件
-
-
boolean isDirectory();
-
判断是否是目录
-
-
String getPath();
-
返回此对象表示的文件的相对路径名
-
-
String getAbsolutePath();
-
返回此对象表示的文件的绝对路径名
-
-
String getName();
-
返回此对象表示的文件或目录的名称
-
-
boolean delete();
-
删除此对象指定的文件或目录
-
-
boolean createNewFile();
-
创建名称的空文件,不创建文件夹
-
-
long length();
-
返回文件的长度,单位为字节,如果文件不存在,则返回OL
-
-
boolean mkdir();
-
创建此抽象路径名指定的目录(文件夹) 注意:如果父路径不存在,则不会创建文件夹
-
-
boolean mkdirs() ;
-
如果父路径不存在,会自动先创建路径所需的文件夹,即会先创建父路径内容再创建文件夹
-
-
File.separator // 通用路径分隔符
-
3. IO流关键字
-
位于java.io包中:
-
FileInputStream //文件字节输入流
-
FileOutputStream//文件字节输出流
-
FileReader
-
FileWriter
-
-
BufferedReader
-
BufferedWriter
-
BufferedInputStream
-
BufferedOutputStream
-
-
DataInputStream
-
DataOutputStream
-
-
ObjectInputStream
-
ObjectOutputStream
-
转换流(字节流转换成字符流)
-
InputStreamReader
-
OutputStreamWriter
-
-
Printwriter
-
PrintStream //标准的输出流(默认输出到控制台)
-
4.java语言中的流分为:四大家族
-
Java流的分类
-
按流向分
-
输出流 OutputStream和Writer作为基类
-
输入流 InputStream和Reader作为基类
-
输入输出流是相对于计算机内存来说的
-
-
按照处理数据单元划分
-
字节流
-
字节输入流 InputStream基类
-
字节输出流 OutputStream基类
-
-
字符流
-
字符输入流 Reader基类
-
字符输出流 Writer基类
-
-
字节流是8位通用字节流,字符流是16位Unicode字符流
-
-
InputStream
-
OutputStream
-
Reader
-
Writer
InputStream和OutptStream继承结构图及关系
Reader和Writer继承结构图及关系
5.InputStream: 字节输入流(抽象类)
-
InputStream 类常用方法
-
int read():
-
从输入流一个字节一个字节的读,返回的是该字节的整数表示形式,如果到了输入流的末尾,返回-1.
-
-
-
int read(byte[] b):
-
从输入流读取若干字节,把这些字节保存到数组b中,返回的是读取到的字节数,如果到了流的末尾,返回-1.
-
-
int read(byte[] b, int off , int len):
-
从输入流读取若干字节,把这些字节保存到数组b中,off指的是字节数组中开始保存数据的起始下标,len指读取的字节数目。返回的是读取到的字节数,如果到了流的末尾,返回-1.
-
-
void close():
-
关闭流。
-
-
int available():
-
可以从输入流中读取的字节数目
-
-
子类FileInputStream 常用的构造方法
-
FileInputStream(File file) //new对象的时候可以传一个文件
-
FileInputStream(String name) //new对象的时候可以传一个路径,可以是相对路径,也可以是绝对路径
-
//要读取某文件,先与这个文件创建一个“输入流”
//1.创建流
String filePath = "D:\\EditPlus\\test";//文件路径:可以跟相对路径,也可以跟绝对路径
FileInputStream fis = new FileInputStream(filePath);
//如果文件在同一目录下,可以直接访问
FileInputStream fis = new FileInputStream(“file”);
//2.开始读写
//第一种读写方式
int i1 = fis.read();//以字节的方式读取,这种方式频繁访问磁盘,伤害磁盘,并且效率低。
System.out.println(i1);//如果已经读取到文件末尾,就会返回-1
————————————————————————————————————————————————————————————————————————————————————————
//第二种读写方式
//准备一个byte数组
byte[] bytes = new byte[long n];//每一次最多读取n表字节
//int read(byte[] bytes);该方法返回的int类型的值代表的是,这次读取了多少个字节。
int i1 = fis.read(bytes);
//将byte数组转换成字符串
System.out.println(new String(bytes));
int temp = 0;
//循环读取
while((temp = fis.read(bytes)) != -1) {
System.out.println(new String(bytes, 0, temp));//从下标0开始读,temp为返回读取字节的下标
}
//int available() 返回流中剩余的估计字节数。
System.out.println(fis.available());
fis.skip(long n);// 跳过n个字节不读取
————————————————————————————————————————————————————————————————————————————————————————
//3.关闭流
fis.close();
调用FileInputStream()方法时系统会抛出一个异常“FileNotFoundException”
调用读取【read()】方法和关闭【close()】方法时系统会抛出一个异常“IOException”
6.OutputStream 文件字节输出流(抽象类)
-
OutputStream类常用方法
-
void write(int c);
-
从输出流一个字节一个字节的往外写,返回的是该字节的整数表示形式
-
-
void write(byte[] buf);
-
从输出流写若干字节,把这些字节保存到数组b中,返回的是写出的字节数
-
-
void write(byte[] b, int off, int len);
-
从输出流读取若干字节,把这些字节保存到数组b中,off指的是字节数组中开始保存数据的起始下标,len指写出的字节数目。返回的是写出的字节数
-
-
void close();
-
关闭流
-
-
void flush();
-
强制把缓冲区的数据写到输出流中 //flush():强制将缓冲区清空
-
-
-
子类FileOutputStream
-
FileOutputStream 是将计算机内存中的数据写入硬盘文件中
-
常用的构造方法
-
FileOutputStream(File file);
-
new对象的时候可以传一个文件
-
-
FileOutputStream(String name);
-
new对象的时候可以传一个路径,可以是相对路径,也可以是绝对路径
-
-
FileOutputStream(String name,boolean append);
-
如果boolean append为true, 那他不会覆盖原有文本文件的内容,只是在原有的文本文件后面去追加内容;boolean append为false,那他就会覆盖原有的文本文件
-
-
-
//1.创建文件字节输出流
//谨慎使用,会将源文件内容覆盖。
FileOutputStream fos = new FileOutputStream("temp02"); //该文件不存在则自动创建。
//以追加的方式写入
FileOutputStream fos = new FileOutputStream("temp02",true);
//2.开始写
String msg = "HelloWorld!";
//将String转换成byte数组
byte[] bytes = msg.getBytes();
//将byte数组中所有的数据全部写入
fos.write(bytes);
//将byte数组一部分写入
fos.write(bytes, off, len);//从off下标开始写入,写到len下标为止
//推荐最后的时候为了保证数据完全写入硬盘,所以要刷新
fos.flush();//强制写入
//3.关闭流
fos.close();
7.Reader 字符输入流(抽象类)
-
常用方法
-
int read();
-
从输入流一个字符一个字符的读,返回的是该字节的整数表示形式,
-
-
int read(char[] c);
-
从输入流读取若干字符,把这些字符保存到数组b中,返回的是读取到的字符数,
-
-
read(char[] c, int off, int len);
-
从输入流读取若干字符,把这些字符保存到数组b中,off指的是字符数组中开始保存数据的起始下标,len指读取的字符数目。返回的是读取到的字符数,
-
-
void close();
-
关闭流
-
-
-
子类InputStreamReader常用的构造方法
-
InputStreamReader(InputStream in); //里面可以传一个字节流
-
InputStreamReader(InputStream in, String charsetName); //里面可以传一个字节流和编码格式,该方法可以指定编码格式
-
-
FileReader类是InputStreamReader的子类
-
FileReader(File file); //new对象的时候可以传一个文件
-
FileReader(String name); //new对象的时候可以传一个路径,可以是相对路径,也可以是绝对路径
-
-
该类只能按照本地平台的字符编码来读取数据,用户不能指定其他的字符编码类型
-
System.out.println(System.getProperty("file.encoding"));获得本地平台的字符编码类型
-
-
在读取文件的时候会出现中文乱码
-
原因:文件编码格式和程序环境的编码格式不一致
-
解决方案:字符流去读的时候,批定字符流的编码格式
-
FileReader 无法指定编码格式,会按照文件系统默认编码格式读取
-
我们可以使用InputStreamReader解决乱码问题
-
-
BufferedReader类(缓冲流)
-
BufferedReader类是Reader类的子类
-
BufferedReader类带有缓冲区,按行读取内容的readLine()方法
-
8.Writer 字符输出流(抽象类)
-
常用方法
-
write(String str);
-
从输出流已字符串的形式往外写
-
-
write(String str, int of, int len);
-
从输出流读取若干字符串,off指的是字节数组中开始保存数据的起始下标,len指写出的字节数目。
-
-
void close();
-
关闭流
-
-
void flush();
-
强制把缓冲区的数据写到输出流中 //flush():强制将缓冲区清空
-
-
-
子类OutputStreamWriter常用的构造方法
-
OutputStreamWriter(OutputStream out);
-
里面可以传一个字节流
-
-
OutputStreamWriter(OutputStream out, String charsetName);
-
//里面可以传一个字节流和编码格式,该方法可以指定编码格式
-
-
-
FileWriter类是OutputStreamWriter的子类
-
FileWriter(File file) ;//new对象的时候可以传一个文件
-
FileWriter(String name); //new对象的时候可以传一个路径,可以是相对路径,也可以是绝对路径
-
该类只能按照本地平台折字符编码来写数据,用户不能指定其他的字符编码类型
-
FileWriter与字节流FileOutputStream类实现向文本文件写入数据步骤类似
-
引入相关的类(导包)
-
创建FileReader对象 (构造BufferedWriter对象和FileWriter对象)
-
Writer fw = new FileWriter("相对路径/绝对路径");
-
-
写文本文件(调用write()方法写数据)
-
fw.write();
-
-
关闭相关的流对象(流对象的清空和关闭)
-
fw.close()和fw.flush();
-
-
-
-
BufferedWriter类是Writer类的子类,带有缓冲区
-
BufferedWriter类常用的构造方法
-
BufferedWriter(Writer out);
-
9.读写二进制文件
-
DataInputStream类
-
FileInputStream的子类
-
与FileInputStream类结合使用读取二进制文件
-
-
DataOutputStream类
-
FileOutputStream的子类
-
与FileOutputStream类结合使用写二进制文件
-
10.序列化和反序列化
-
序列化和反序列化过程
-
序列化是将对象的状态写入到特定的流中的过程
-
内存(Java对象) -------> 流(二进制的字节序列)
-
反序列化则是从特定的流中获取数据重新构建对象的过程
-
流(二进制的字节序列)-------> 内存(Java对象)
-
-
常见异常
-
NotSerializableException:类没有实现Serializable接口,不可被序列化
-
-
实现序列化
-
ObjectInputStream 反序列化 readObject() -----> 类型转换
-
ObjectOutputStream 序列化 writeObject(Object)
-
序列化的步骤
-
实现Serializable接口
-
创建对象输出流
-
调用writeObject()方法将对象写入文件
-
关闭对象输出流
-
-
-
transient 屏蔽某些敏感字段的序列化
-
该关键字加在声明变量类型的前面
-