目录
反序列化流:java.io.ObjectInputStream类
File类
//作用: 在Java程序中用来对文件数据进行定义的类型(表示:文件类型)
//File:即可以当做文件,也可以当做目录
//构造方法
File file = new File(String 路径);
File file = new File(String 父路径 , String 子路径);
File file = new File(File 父对象 , String 子路径);
//常用方法:
创建文件 //boolean createNewFile()
创建目录 //boolean mkdir()、mkdirs()
删除文件或目录 //boolean delete()
判断:文件或目录是否存在 //boolean exists()
判断:是文件 //boolean isFile()
判断:是目录 //boolean isDirectory()
获取:文件名 //String getName()
获取:目录下的所有内容 //File[] listFiles()
获取:父级目录 //String getParent();
获取:文件大小 //boolean length()
字节流
字节输出流:FileOutputStream类
//作用: 以字节为单位,向文件中写入字节数据
//构造方法 (关联文件不存在时:创建文件; )
FileOutputStream fos = new FileOutputStream("关联文件路径");//覆盖写入
FileOutputStream fos = new FileOutputStream("关联文件路径", true);//追加写入
FileOutputStream fos = new FileOutputStream(File 文件对象);//覆盖写入
FileOutputStream fos = new FileOutputStream(File 文件对象, true);//追加写入
//常用方法
write(int data)//写入1个字节数据
write(byte[] buf) //写入多个字节数据
write(byte[] buf, int index , int len);//从buf数组的index索引开始,取len个字节写入到文件
close() //释放资源
字节输入流:FileInputStream类
//作用: 以字节为单位,从文件中读取字节数据
//构造方法
FileInputStream fis = new FileInputStream("关联文件路径");
FileInputStream fis = new FileInputStream(File 文件对象);
//常用方法
int read(); //读取1个字节数据,返回实际读取到的字节数据。 读取到文件末尾时:返回-1
int read(byte[] buf); //最多读取buf.length()个字节数据,读取到的字节数据存储到buf数组中,并返回实际读取到的字节数据个数。 读取到文件末尾时:返回-1
close() //释放资源
字节缓冲流
字节输入缓冲流:BufferedInputStream类
//作用: 以字节为单位,从文件中读取字节数据。 性能比普通字节流高一些。
//特殊之处: 字节缓冲流自身不具备读数据的操作,需要依赖普通的字节流实现读数据
//构造方法
BufferedInputStream bis = new BufferedInputStream( new FileInputStream("关联文件"));
//常用方法: 参照普通字节输入流
字节输出缓冲流:BufferedOutputStream类
//作用: 以字节为单位,向文件中写入字节数据。 性能比普通字节流高一些。
//特殊之处: 字节缓冲流自身不具备写数据的操作,需要依赖普通的字节流实现写数据
//构造方法
BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream("关联文件"));//覆盖写入
BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream("关联文件", true));//追加写入
//常用方法: 参照普通字节输出流
属性集:Properties
//作用: 从配置文件中读取数据。把读取到的数据以key/value形式存储
//构造方法
Properties prop = new Properties();
//常用方法:
//做为集合
void setProperty(String key , String value);
String getProperty(String key);
Set<String> stringPropertyNames(); //获取所有key元素
//结合IO流
void load(InputStream input); //把配置文件中的信息读取到Properties对象中
void store(OutputStream output,String 注释);//把Properties对象中的数据写入到配置文件中
JavaBean:
Bean:翻译过来是"豆"意思。 Bean:是Java中是一个统称。
JavaBean: 其实就是一个Java封装类。
Java封装类:
1. 私有成员变量
2. 构造方法
3. 公开的getter、setter方法
ResourceBundle工具类
-
属于包:java.util
-
作用: 用来读取程序以.properties结尾的配置文件
-
结论:可以代替之前学习的Properties类
-
-
使用
//获取ResourceBundle对象
ResourceBundle getBundle(String 配置文件名字);
//要求: 1、只需要书写配置文件名,不要扩展名; 2、配置文件必须存放在项目的src目录下
//示例: 在当前项目的src目录下有一个名为: itheima.properties 文件
ResourceBundle bundle = ResourceBundle.getBundle("itheima");
//常用方法
String value = ResourceBundle对象.getString(String key)
结论:ResourceBundle工具类,会自动的去项目src目录下,读取以.properties结尾的配置文件
递归
//什么是递归?
方法自己调用自己(递归是应用在方法的调用上)
递归 = 递进 + 回归
//在使用递归时的弊端:
递归需要方法进入到栈内存中运行,当递归次数过多时,栈内存可能会被占满,会造成:内存溢出
//示例:
public int getSum(int num){
//边界条件:控制递归的上限(不能无限递归)
if(num==1){
return 1;//回归
}
//递进:调用方法,每次-1
int sum = num + getSum(num-1);
return sum;
}
字符流:
以字符为单位,对文件进行读写操作
字符流 = 字节流 + 编码表
-
字符流底层还是使用字节流读写数据
-
在使用字节流读写数据时,会根据编码表,来进行数据转换
-
字节流读数据时,会根据编码表来决定读几个字节,当编码表为
GBK
编码表时,会一次读取2个字节,在把2个字节根据GBK编码表,合并为一个中文文件内容: 你好 编码表: GBK 你 = -22 -111 好 = -19 -76 字节流读取时,是GBK编码,就一次会读取2个字节: -22 -111 在根据GBK编码表,把-22和-111合并,转换为:生活中的数据
字符输出流:Writer类(抽象类)
-
以字符为单位,向文件中写入字符数据
-
使用字符输出流时,使用的是Writer类的子类:FileWriter
-
构造方法:
//根据给定的File对象,创建字符输出流对象 FileWriter fw = new FileWriter(File file); //覆盖写入 //根据给定的文件路径,创建字符输出流对象 FileWriter fw = new FileWriter(String path); //覆盖写入 FileWriter fw = new FileWriter(String path , true);//追加写入 FileWriter fw = new FileWriter(File file , true); //追加写入
常用方法:
-
//写字符数据 write(int data) //写入一个字符数据 write(char[] chs) //写入多个字符数据 write(char[] cbuf , int index , int len) //写入多个字符数据 write(String str)//写入字符串数据 write(String str , int index , int len) //刷新流 flush() //关闭流 close()
-
字符输出流的使用步骤:
-
创: 创建字符输出流对象,并关联一个文件
-
写: 写入字符数据
-
关: 释放资源
-
-
使用字符流时的注意事项:
字符流 = 字节流 + 编码表
底层在使用字节流,写入中文数据时:是把中文的两个或三个字节数据,先写入到一个缓冲区[数组]
结论:字符数据并不是直接写入到文件中,而先写入到缓冲区(数组:在内存中存储)
//刷新流 (流没有关闭)
flush() //把缓冲区中的字节数据写入到文件中
字符输入流:Reader类(抽象类)
-
以字符为单位,从文件中读取字符数据
-
使用字符输入流时,使用的是Reader类的子类:FileReader
-
构造方法:
-
//根据给定的File对象,创建字符输入流对象 FileReader fr = new FileReader(File file); //根据给定的文件路径,创建字符输入流对象 FileReader fr = new FileReader(String path);
常用方法:
-
//读字符数据 //读取1个字符 int read() //一次读取1个字符数据,返回读取到的字符数据(编码值),读取到文件末尾返回:-1 //读取多个字符(存储在字符数组中) int read(char[] cbuf) //一次最多读取cbuf.length()个字符数据,并把读取到的字符数据存储到cbuf数组中。返回实际读取到字符数据的个数, 读取到文件末尾返回:-1
字符缓冲流:
-
字符输入缓冲流:BufferedReader类
-
缓冲流,自身并不具备直接读数据的能力,需要依赖普通的字符输入流实现
-
-
字符输出缓冲流:BufferedWriter类
-
缓冲流,自身并不具备直接写数据的能力,需要依赖普通的字符输出流实现
//创建字符输入缓冲流对象 BufferedReader br = new BufferedReader( new FileReader("关联文件") ); //创建字符输出缓冲流对象 BufferedWriter bw = new BufferedWriter( new FileWriter("关联文件") );
使用普通字符流和字符缓冲流:复制文件,对比性能:
-
读1个字符、写1个字符:
-
普通字符流:46毫秒
-
缓冲流:7毫秒
-
-
在开发中,使用字符缓冲流的最方便之处:可以实现按行读取数据
-
字符输入缓冲流特有方法:
字符输出流:
-
按行读取字符数据: 一次读取一行文本数据
-
String readLine(); //一次读取一行数据(不包含:\r\n), 读取到文件末尾时:返回null
字符输出缓冲流特有方法:
-
写入换行符:
-
void newLine(); //根据不同的操作系统,写入不同换行符 //windows系统: \r\n //linux系统:\n //mac系统:\r //通常在开发Java程序,Java程序可以实现跨平台。也就希望:换行符也能跨平台 fw.write("\r\n");//向文件中写入换行符(windows系统专用)
流分类
-
基础流:
-
普通的字节流
-
普通的字符流
-
高效流
-
字节缓冲流
-
字符缓冲流
-
特殊的流
-
转换流
-
对象操作流(序列化流)
-
打印流
-
字节输入流
-
顶层父类:Reader
-
子类:InputStreamReader (转换流)
-
子类:FileReader
-
-
-
字节输出流
-
顶层父类:Writer
-
子类:OutputStreamWriter (转换流)
-
子类:FileWriter
-
-
转换流的作用:
-
在字节流和字符流之间进行转换
-
把字节流转换为字符流
-
把字符流转换为字节流
-
-
使用转换流对特定编码的文本文件进行读写操作
//转换流: 把GBK编码的文件读取出来后,以UTF-8编码写入到另一个文件
//源文件:GBK编码
//目标文件:UTF-8编码
字节转换为字符的流:InputStreamReader类
//转换流:自身不具备直接读写文件的能力,需要依赖普通字节流
//创建一个使用默认字符集(编码表:UTF-8),来读取字符数据的转换流对象
InputStreamReader isr = new InputStreamReader(new FileInputStream("关联文件"));
//经常使用的构造方法:
//在创建转换流对象时,指定编码表
InputStreamReader isr = new InputStreamReader(new FileInputStream("关联文件"),String 编码表名字);
//示例: 指定编码表为gbk
InputStreamReader isr = new InputStreamReader(new FileInputStream("关联文件"),"gbk");
编码、解码:
-
编码和解码时,必须保证使用同一个编码表
-
当编码和解码时,使用的不是同一个编码表时,会出现:乱码
字符转换为字节的流:OutputStreamWriter类
//根据给定的编码表名字,创建转换流对象
//按照给定的编码表,来向文件中写入符合编码表的字符数据
OutputStreamWriter osw = new OutputStreamWriter(new FileWriter("关联文件"), 编码表名字);
//创建一个使用默认字符集(编码表:UTF-8),写入字符数据的转换流对象
OutputStreamWriter osw = new OutputStreamWriter(new FileWriter("关联文件"));
对象操作流: 也称为序列化流
-
在Java中使用最多的就是对象(创建对象,对象中存储数据)
-
对象操作流作用: 把创建的对象(含对象中存储的数据)写入到文件中
对象操作流的分类:
-
序列化流:java.io.ObjectOutputStream类
-
把内存中的对象,写入到文件中(打开文件是看不懂的)
-
把内存中的对象,向网络中另一台计算机中传输
-
-
反序列化流:java.io.ObjectInputStream类
-
把文件中存储的对象,读取到内存中(在内存中会重新生这个对象)
-
接收网络中另一台计算机传递过来的对象
-
ObjectOutputStream:
//构造方法
ObjectOutputStream oos = new ObjectOutputStream(OutpuStream output);
//常用方法:
//把对象写入到文件中
void writeObject(Object obj)
在使用序列化流,向文件中写入对象时,会遇到一个异常:NotSerializableException
引发异常的原因: 实例化的对象没有实现Serializable接口
解决方案:让类实现Serializable接口
ObjectInputStream类
//构造方法
ObjectInputStream osi = new ObjectInputStream(InputStream input)
//常用方法:
//读取文本中存储的对象
Object readObject();