IO流-流的基本概述(流的划分/字符和字节的区别/File文件类/Charset文件类)
目录:
流的基本概述
流的划分
数据的读取流程
字节和字符的区别
几种常用字符码表
java提供的编码类:Charset
File类详解
得到给定路径下所有包含filter关键字的文件
流的基本概述:
- 什么是流: 流的本质是数据传输,数据有序集合,能从一个端传输到另一端的过程流;
- java对数据的操作是通过流的方式,java用于流操作的对象都在IO包中;
流的划分:
按照方向划分: 输入流,输出流;
- 输入流:将数据从介质(磁盘,网络)到当前程序的传输称为输入流;
- 输出流:将数据从程序写入到存储介质中称为输出流;
- 输入流是以InputStream和Reader作为基类;
- 输出流是以OutputStream和Writer作为基类;
按照操作单元: 分为字节流和字符流;
- 字节流:二进制表示的数据,一个字节8bit位;
- 字符流:将数据以字符形式表示; ads234等等;
- 字节流是以 InputStream和OutputStream作为基类;
- 字符流是以Reader和Writer作为基类;
类型 | 字节流 | 字符流 |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
按照角色划分:节点流,处理流;
- 节点流(介质流):数据从(向)一个介质(磁盘,鼠标,屏幕)读(写)的流称为节点流,也称为低级流;
- 处理流(高级流):和节点流直接相连的流;
- 节点流和处理流的区别:
- 节点流直接和介质相连接;
- 处理流和节点流相连接;
数据的读取流程:
字节和字符的区别:字节存储的数据为二进制;字符存储的数据为字符;
-
读写单元不同:
-
字节流是以字节为单位(8bit);
-
字符流以字符为单位,根据码表映射字符,一次可以读取多个字节;
-
处理对象不同:
-
字节流能处理所有类型的数据(图片,avi等);
-
字符流只能处理字符类型的数据;
-
处理效率:
-
字节流处理效率较高,直接进行读取;
-
字符流效率较低,涉及到编码解码过程;
-
可移植性:
-
字节流可一直性高,和平台无关;
-
字符流需要考虑编码解码过程,编码解码表需要保持一致;
几种常用字符码表:
码表是将字符和数字建立起映射关系,实现字节和字符的相互转换;
- 解码:字节-》字符;
- 编码:字符-》字节;
- ASCII码:一个字符用(一个字节的低)7位表示,对应字节都是整数,总共可以表示127个字符;
- ISO-8899-1: 拉丁码表:用一个字节的8位表示,可以表示整数和负数;
- GBK(国标,中文码表): 用两个字节表示,2个字节的第一个字节最高位为1,第二个字节最高位为0;
- Unicode: 国际标准码表,无论什么文字都是两个字节表示;
- UTF-8:基于Unicode,一个字节表示存储信息,每一个字节头加入了编码信息;
java提供的编码类:Charset
//当前默认的编码
Charset charset = Charset.defaultCharset();
//当前系统支持的所有字符集编码
SortedMap <String, Charset> sortedMap = Charset.availableCharsets();
Iterator <Map.Entry <String, Charset>> iterator =
sortedMap.entrySet().iterator();
//是否支持指定的编码格式
boolean supported = Charset.isSupported("UTF-8");
//利用Charset进行指定格式的编码解码过程
String utf = "UTF-8";
//解码
//方法一:
try {
String s = new String("haha".getBytes(), utf);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//方法二:
Charset UTF = Charset.forName(utf);//得到utf编码的对象
//ByteBuffer.wrap("Hello".getBytes()) // 将 byte 数组包装到缓冲区中
//decode()//将给定buffer流进行解码
CharBuffer buffer = UTF.decode(ByteBuffer.wrap("Hello".getBytes()));
System.out.println(buffer);
//编码
ByteBuffer byteBuffer = UTF.encode(buffer); //编码函数
File类详解:IO流在jdk中的 java.io目录下;
相对路径和绝对路径:
- 绝对路径:带有盘符的路径;(window c://file linux/Unix)
- 相对路径:不带盘符的路径称为相对路径;(.(表示当前路径) …(表示父路径))
File file=new File("路径"); //创建一个文件
boolean isFile() //判断file实例是否是文件 true:文件 false:非文件
boolean isDirectory() //判断file实例是否是目录
boolean exists() //判断file实例是否存在
String getName() //获取当前实例的名字
boolean createNewFile() //创建新文件\文件目录存在即返回不会抛异常
boolean mkdir() //创建目录
boolean delete() //立即删除
void deleteOnExit() //延时删除
String[] list() //查询所有的文件列表,包含隐藏文件
String[] list(FilenameFilter filter) //返回过滤后的数据刘表
练习:得到给定路径下所有包含filter关键字的文件,并且此文件非隐藏文件
public static void searchFile(String path, String filter) {
File file = new File(path); //创建一个新文件
if(!file.exists()) return; //判断此路径文件是否存在
if (file.isFile() && file.getName().contains(filter)) {
//如果file是一个文件(非目录)并且文件名包含我们所需要的关键字
System.out.println(file.getAbsoluteFile());
//得到该文件的文件名
return;
}
if (file.isDirectory()) {
//此file是路径,说明下面还存在文件,递归查找
searchDir(file, filter);
}
}
private static void searchDir(File file, String filter) {
//需要过滤
FilenameFilter fileFilter = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
File file1 = new File(dir, name);
return file1.isFile() && !file1.isHidden();
//如果是文件,并且是非隐藏文件;
}
};
File[] list = file.listFiles(fileFilter);
for (int i = 0; i < list.length; i++) {
File path1 = list[i];
if (path1.getName().contains(filter))
System.out.println(path1.getAbsolutePath());
//得到绝对路径
}
FilenameFilter dirFilter = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
File file1 = new File(dir, name);
return file1.isDirectory();
//是否是路径
}
};
File[] dir = file.listFiles(dirFilter);//得到只有路径的数组
for (int i = 0; i < dir.length; i++) {
File file1 = dir[i];
searchDir(file1, filter);
//是路径,继续进行查找
}
}