IO流&&
-
构造方法:
File(String pathname) //通过将给定的路径名字符串转换为抽象路径名来创建新的File实例
File(String parent, String child) //从父路径名字符串和子路径名字符串创建新的File实例
File(File parent, String child) //从父抽象路径名和子路径名字符串创建新的File实例 -
常用方法:
/*创建功能*/
public boolean createNewFile()//当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件
public boolean mkdir() //创建由此抽象路径名命名的目录
public boolean mkdirs() //创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录
/*判断功能*/
public boolean isDirectory() //测试此抽象路径名表示的File是否为目录
public boolean isFile() //测试此抽象路径名表示的File是否为文件
public boolean exists() //测试此抽象路径名表示的File是否存在
/*获取功能*/
public String getAbsolutePath() //返回此抽象路径名的绝对路径名字符串
public String getPath() //将此抽象路径名转换为路径名字符串
public String getName() //返回由此抽象路径名表示的文件或目录的名称
public String[] list() //返回此抽象路径名表示的目录中的文件和目录的名称字符串数组
public File[] listFiles() //返回此抽象路径名表示的目录中的文件和目录的File对象数组
/*删除功能*/
public boolean delete() //删除由此抽象路径名表示的文件或目录
递归遍历目录【案例】
//案例需求
//给定一个路径(E:\itcast),通过递归完成遍历该目录下所有内容,并把所有文件的绝对路径输出在控制台
public class DiGuiDemo02 {
public static void main(String[] args) {
//根据给定的路径创建一个File对象
// File srcFile = new File("E:\\itcast");
File srcFile = new File("E:\\itheima");
//调用方法
getAllFilePath(srcFile); }
//定义一个方法,用于获取给定目录下的所有内容,参数为第1步创建的File对象
public static void getAllFilePath(File srcFile) {
//获取给定的File目录下所有的文件或者目录的File数组
File[] fileArray = srcFile.listFiles();
//遍历该File数组,得到每一个File对象
if(fileArray != null) {
for(File file : fileArray) {
//判断该File对象是否是目录
if(file.isDirectory()) {
//是:递归调用
getAllFilePath(file);
} else {
//不是:获取绝对路径输出在控制台
System.out.println(file.getAbsolutePath());
}
}
}
}
}
IO流
-
IO流概述和分类
-
IO流介绍
-
IO:输入/输出(Input/Output)
-
流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输
-
IO流就是用来处理设备间数据传输问题的。常见的应用:文件复制;文件上传;文件下载
-
-
IO流的分类
-
按照数据的流向
-
输入流:读数据
-
输出流:写数据
-
-
按照数据类型来分
-
字节流
-
字节输入流
-
字节输出流
-
-
字符流
-
字符输入流
-
字符输出流
-
-
-
-
IO流的使用场景
-
如果操作的是纯文本文件,优先使用字符流
-
如果操作的是图片、视频、音频等二进制文件。优先使用字节流
-
如果不确定文件类型,优先使用字节流。字节流是万能的流
-
-
总结
字节流
-
字节流写数据【应用】
-
字节流抽象基类
-
InputStream:这个抽象类是表示字节输入流的所有类的超类
-
OutputStream:这个抽象类是表示字节输出流的所有类的超类
-
子类名特点:子类名称都是以其父类名作为子类名的后缀
-
-
字节输出流
-
FileOutputStream(String name):创建文件输出流以指定的名称写入文件
public class FileOutputStreamDemo01 {
public static void main(String[] args) throws IOException {
//创建字节输出流对象
//FileOutputStream(String name):创建文件输出流以指定的名称写入文件
//FileOutputStream fos = new FileOutputStream("myByteStream\\fos.txt");
//FileOutputStream(String name,boolean append),如果第二个参数为true ,则字节将写入文件的末尾而不是开头
FileOutputStream fos = new FileOutputStream("myByteStream\\fos.txt",true);
/* 做了三件事情:
A:调用系统功能创建了文件
B:创建了字节输出流对象
C:让字节输出流对象指向创建好的文件 */
//void write(int b):将指定的字节写入此文件输出流
fos.write(97);
/*字节流写数据如何实现换行
windows:\r\n
linux:\n
mac:\r */
fos.write("\r\n".getBytes());
//最后都要释放资源
//void close():关闭此文件输出流并释放与此流相关联的任何系统资源。
fos.close();
}
} -
-
-
字节流读数据【应用】
public class FileInputStreamDemo01 {
public static void main(String[] args) throws IOException {
//创建字节输入流对象
//FileInputStream(String name)
FileInputStream fis = new FileInputStream("myByteStream\\fos.txt");
//------------(一次读一个字节数据)------------
int by;
//fis.read()的返回值为-1时,说明读到头了
while ((by=fis.read())!=-1) {
System.out.print((char)by);
}
//------------(一次读一个字节数组数据)------------
byte[] bys = new byte[1024];
//从输入流读取最多b.length个字节的数据
int len;
//返回的是读入缓冲区的总字节数,也就是实际的读取字节个数
while ((len=fis.read(bys))!=-1) {
System.out.print(new String(bys,0,len));
}
//释放资源
fis.close();
}
}
字节缓冲流
-
字节缓冲流介绍
-
BufferOutputStream:该类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用。
-
BufferedInputStream:创建BufferedInputStream将创建一个内部缓冲区数组。 当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节。
-
字符流
-
为什么会出现字符流【理解】
-
字符流的介绍
-
由于字节流操作中文不是特别的方便,所以Java就提供字符流
-
字符流 = 字节流 + 编码表
-
-
中文的字节存储方式
-
用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接成中文。
-
如何识别是中文的呢?
-
汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数
-
-
-
-
编码表【理解】
-
什么是字符集
-
是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等。
-
计算机要准确的存储和识别各种字符集符号,就需要进行字符编码,一套字符集必然至少有一套字符编码。
-
常见字符集有ASCII字符集、GBXXX字符集、Unicode字符集等
-
-
常见的字符集
-
ASCII字符集:
-
ASCII:是基于拉丁字母的一套电脑编码系统,用于显示现代英语,主要包括控制字符(回车键、退格、换行键等)和可显示字符(英文大小写字符、阿拉伯数字和西文符号)
-
基本的ASCII字符集,使用7位表示一个字符,共128字符。ASCII的扩展字符集使用8位表示一个字符,共256字符,方便支持欧洲常用字符。是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等
-
-
GBXXX字符集:
-
GBK:最常用的中文码表。是在GB2312标准基础上的扩展规范,使用了双字节编码方案,共收录了21003个汉字,完全兼容GB2312标准,同时支持繁体汉字以及日韩汉字等
-
-
Unicode字符集:
-
UTF-8编码:可以用来表示Unicode标准中任意字符,它是电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。它使用一至四个字节为每个字符编码
-
编码规则:
-
128个US-ASCII字符,只需一个字节编码
-
拉丁文等字符,需要二个字节编码
-
大部分常用字(含中文),使用三个字节编码
-
其他极少使用的Unicode辅助字符,使用四字节编码
-
-
-
-
-
字符流中的编码解码问题【应用】
-
字符流中和编码解码问题相关的两个类
-
InputStreamReader类:是从字节流到字符流的桥梁
-
void write(int c) : 写一个字符//及一些重载方法
-
flush() :刷新流,之后还可以继续写数据
-
close() :关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据
-
-
OutputStreamWriter类:是从字符流到字节流的桥梁
-
int read() :一次读一个字符数据
-
-
-
对象序列化流
-
对象序列化介绍
-
对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象。
-
这种机制就是使用一个字节序列表示一个对象。
-
该字节序列包含:对象的类型、对象的数据和对象中存储的属性等信息。
-
字节序列写到文件之后,相当于文件中持久保存了一个对象的信息。
-
反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。
-
-
对象序列化流: ObjectOutputStream类
-
将Java对象的原始数据类型和图形写入OutputStream。 可以使用ObjectInputStream读取(重构)对象。 可以通过使用流的文件来实现对象的持久存储。 如果流是网络套接字流,则可以在另一个主机上或另一个进程中重构对象。
-
方法名:void writeObject(Object obj) 将指定的对象写入ObjectOutputStream
-
-
对象反序列化流: ObjectInputStream类
-
ObjectInputStream(InputStream in) 创建从指定的InputStream读取的ObjectInputStream
-
Object readObject() 从ObjectInputStream读取一个对象
-
-
实现Serializable接口:
-
一个对象要想被序列化,该对象所属的类必须必须实现Serializable 接口
-
Serializable是一个标记接口,实现该接口,不需要重写任何方法
-
用对象序列化流序列化了一个对象后,假如我们修改了对象所属的类文件,读取数据时会抛出
InvalidClassException
异常-
解决办法:
-
重新序列化
-
给对象所属的类加一个serialVersionUID
-
private static fifinal long serialVersionUID = 42L;
-
-
-
-
如果一个对象中的某个成员变量的值不想被序列化,可以给该成员变量加transient关键字或者static关键字修饰。
-
Properties集合
-
Properties介绍
-
是一个Map体系的集合类
-
Properties可以保存到流中或从流中加载
-
属性列表中的每个键及其对应的值都是一个字符串
-
-
Properties作为Map集合的特有方法【应用】
方法名 说明 Object setProperty(String key,String value) 设置集合的键和值,都是String类型,底层调用 Hashtable方法 put String getProperty(String key) 使用此属性列表中指定的键搜索属性 Set stringPropertyNames() 从该属性列表中返回一个不可修改的键集,其中键及其对应的 -
Properties和IO流相结合的方法【应用】
方法名 说明 void load(InputStream inStream) void load(Reader reader) 从输入字符流读取属性列表(键和元素对) void store(OutputStream out, String comments) 将此属性列表(键和元素对)写入此 Properties表中,以适合于使用load(InputStream)方法的格式写入输出字节流 void store(Writer writer,String comments) 将此属性列表(键和元素对)写入此 Properties表中,以适合使用load(Reader)方法的格式写入输出字符流