1、IO流(JDK API 1.6.0中文版)
I : intput输入 O : output输出
-
流:内存与存储设备之间传输数据的通道
-
流的分类:
- 按方向:输入流——将<内存设备>中的内容读入到<内存>中
输出流——将<内存>中的内容读入到<内存内存设备>中
-
按单位:字节流——以字节为单位,可以读写所有数据
字符流——以字符为单位,只能读写文本数据
-
按功能:节点流——具有实际传输数据的读写能力
过滤流——在节点流基础上的增强功能
2、字节流(抽象类)
-
字节流的父类(抽象类):
抽象类不能直接实例化
- InputStream:字节输入流
- OutputStream:字节输出流
2.1FileInputStream(文件字节流)的使用
-
FileInputStream:
public int read(byte[] b) 从流中读取多个字节,将读到的内容存入b数组,返回实际读到的字节数;如果达到文件底部,则返回-1
-
创建FileInputStream,并指定文件路径(提前抛出异常-查找不到文件)
-
读取文件read();
2.1 一次读取一个字节,采用while循环(注意读取的是字节,具体内容需要强制转换)
2.2一次读取多个字节(通过数组)-使用循环实现更简介
-
关闭close();IO流结束一定要关闭,节省空间
-
package byteStream;
public class Demo1
2.2FileOutputStream的使用
- FileOutputStream:
public void write(byte[] b) 一次写多个字节,将b数组中的所有字节,写入输出流
-
创建FileInputStream,并指定文件路径(提前抛出异常-查找不到文件)
-
写入文件write();
2.1 一次读取一个字节
2.2一次读取多个字节 getBytes();如果不覆盖式添加,前面要加true
-
关闭
package byteStream;
public class Demo2
2.3字节流复制文件
-
创建流
1.1文件字节输入流
1.2文件字节输出流
-
一边读,一边写
-
关闭
package byteStream;
public class Demo3
2.4BufferedFile(In)OutputStream(字节缓冲流)的使用
- 缓冲流 BufferedFileInputStream/BufferedFileOutputStream
- 特点
- 提高IO效率,减少访问磁盘的次数
- 数据存储在缓冲区内,flush是将缓冲区的内容写入文件中,也可以直接close
使用BufferedFileInputStream输出文件
-
创建 BufferedFileInputStream
-
读取(有所不同)
也可以自己创建一个缓冲区
-
关闭
package byteStream;
public class Demo4
注意——参数类型不同
System.out.print((char)data);
System.out.println(new String(buf,0,count));
使用字节缓冲流BufferedFileOutputStream写入文件
- 创建 BufferedFileOutputStream
- 写入文件(先写入缓冲区)用flush();//写一次刷新一次就写入了
- 关闭
package byteStream;
public class Demo5
2.5Object(In)OutpuItStream(对象流)的使用
ObjectInputStream/ObjectOutpuItStream
-
增强了缓冲区功能
-
增强了读写8种基本类型和字符串功能
-
增强了读写对象的功能——使用流传输对象的过程称为序列化和反序列化
read()object();从流中读取一个对象--反序列化
writeObject(Object obj);向流中写入一个对象--序列化
-
注意事项:
-
实现(反)序列化类,必须实现Serializable接口
-
实现(反)序列化类,对象属性(class)也要实现Serializable接口
-
序列化版本ID,可以保证序列化和反序列化的类是同一个类(不要去改,默认为同一个类(报错就改成一样的))
-
使用transient(瞬间)修饰的属性,这个属性就不能被序列化
-
静态属性(static)也不能序列化
-
序列化多个对象
在序列化中加Student,在反序列化中加s2
也可以使用ArrayList集合,序列化集合就可以了
-
实现序列化(写入流):ObjectOutpuItStream
-
创建对象流
-
实现序列化
类必须实现一个接口Serializable(在Student中)
-
关闭
package byteStream;
public class Demo6
实现反序列化(输出流):ObjectInputStream
-
创建对象流
-
实现反序列化
类必须实现一个接口Serializable(在Student中)
原文件里没有就别读,会抛出异常
-
关闭
package byteStream;
public class Demo7
//原文件里没有就别读,会抛出异常 Student s2=(Student)ois.readObject();
3、字符流
常见的字符编码(当编码方式和读码方式不一致时,会出现乱码):
-
ISO-8859-1 收录除ASCII外,还包括西欧、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号
-
UTF-8 针对Unicode码表的可变长字符编码(国际编码)
-
GB2312 简体中文
-
GBK 简体中文、扩充
-
BIG5 台湾-繁体中文
通过记事本(文件另存为)看文件是什么编码(不能用字节流来读取中文)
- 创建FileInputStream对象
- 读取
- 关闭
package characterStream; public class Demo1
3.1字符流(抽象类)
字符流的父类(抽象类):
- Reader:字符输入流
- Writer: 字符输出流
3.2FileReader(Writer)的使用
-
FileReader:public int read(char[] c)
从流中读取多个字符,将读入数据存入到c数组,返回实际读到的字符数;如果到达文件底部,则返回-1
-
FileWriter: public void write(String str)
一次写多个字符,将b数组中的所有字符,写入输出流
字符流可以读中文
FileReader的使用
-
创建FileReader 文件字符输入流
-
读取
2.1单个字符读取
2.2多个字符读取
-
关闭
package characterStream;
public class Demo2
FileWriter的使用
-
创建FileWriter对象
-
写入
记着写入要刷新一下flush
-
关闭
package characterStream;
public class Demo3
3.3字符流复制文件
FileReader(Writer)只能复制文本文件,不能复制图片、声音和视频等二进制文件
- 创建FileReader(Writer)
- 读写
- 关闭
package characterStream;
public class Demo4
3.3BufferedReader(Writter)(字符缓冲流)的使用
-
高效读写
-
支持输入换行符
-
可一次写一行、读一行
BufferedReader的使用
-
创建缓冲流
-
读取
2.1字符串读取
2.2一行一行的读取 readLine -
关闭
package characterStream;
public class Demo5
BufferedWritter的使用
-
创建缓冲流
-
写入
bw.newLine();//写入一个换行
-
关闭
package characterStream;
public class Demo6
4、PrintWriter(打印流)
- 支持写入后换行
- 支持数据原样打印
- 创建一个打印流
- 打印println方法
- 关闭
package printStream;
public class Demo1
5、(桥)转换流
(桥)转换流 :InputStreamReader/OutputStreamWriter(字节流和字符流的抽象类和在了一起)
-
可将字节流准换为字符流
-
可设置字符的编码方式
-
的字符编码(当编码方式和读码方式不一致时,会出现乱码):
- ISO-8859-1 收录除ASCII外,还包括西欧、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号
- UTF-8 针对Unicode码表的可变长字符编码(国际编码)
- GB2312 简体中文
- GBK 简体中文、扩充
- BIG5 台湾-繁体中文
- 创建InputStreamReader,并指定编码方式
使用的编码要和文件编码方式一致(或者将文件另存为更改编码格式) - 读取文件
- 关闭
package reverseStream;
public class Demo1
- OutputStreamWriter写入文件,并指定编码
- 写入
- 关闭
package printStream;
public class Demo2
6、File类
对文件进行操作
6.1 file类的使用
-
分隔符
System.out.println("路径分隔符"+ File.pathSeparator);//; System.out.println("名称分隔符"+File.separator);//\
-
文件操作
-
创建文件creatNewFile
判断是否创建成功
File file=new File("D:\\Java-Code\\Process\\Process3\\e.txt"); boolean b=file.createNewFile();//判断是否创建成功 System.out.println("创建结果:"+b);
-
删除文件
2.1直接删除
2.2使用jvm退出时删除deleteOnExit
file.deleteOnExit(); Thread.sleep(5000);//休眠5秒钟
-
获取文件信息
System.out.println("获取文件的绝对路径"+file.getAbsolutePath()); System.out.println("获取路径"+file.getPath());//写的什么路径就是什么路径 System.out.println("获取名称"+file.getName()); System.out.println("获取父目录"+file.getParent()); System.out.println("获取文件长度"+file.length()); System.out.println("文件创建时间"+new Date(file.lastModified()).toLocaleString());
-
判断
System.out.println("是否可写"+file.canExecute()); System.out.println("是否为文件"+file.isFile()); System.out.println("是否隐藏"+file.isHidden());
-
-
文件夹操作(与文件操作类似)
-
创建文件夹
-
删除文件夹
2.1直接删除-删除最底层目录(且最底层目录必须为空)
System.out.println("删除结果:"+dir.delete());//删除最底层目录(且最底层目录必须为空)
2.2使用jvm退出时删除deleteOnExit-System.out.println("删除结果:"+dir.delete());//删除最底层目录(且最底层目录必须为空)
-
获取文件夹信息
文件夹没有长度
-
判断
文件夹没有是否可写
-
遍历文件夹
File dir2 = new File("D:\\Java-Code\\Process\\Process3"); String[] files = dir2.list(); System.out.println("=================="); for(String string : files){ System.out.println(string); }
-
package fileManage;
public class Demo1
6.2FileFileter接口
public interface FileFilter
-
boolean accept(File pathname)
-
当调用File类中的listFile()方法时,支持传入FileFilter接口实现类,对获取文件进行过滤,只有满足条件的文件才可以出现在返回值中
File[] files1 = dir2.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { if (pathname.getName().endsWith(".jpg")) { return true; } return false; } }); for(File file : files1) { System.out.println(file.getName()); }
package fileManage;
public class Demo1