1.核心类
- File 文件类
- InputStream 字节输入流
- OutputStream 字节输出流
- Reader 字符输入流
- Writer 字符输出流
- Closeable 关闭流接口
- Flushable 刷新流接口
- Serializable 序列化接口
2.流分类
- 输入流:数据源到程序(InputStream、Reader读进来)
- 输出流:程序到目的地(OutputStream、Writer写进去)
- 节点流:可以直接从数据源或 目的地读写数据
- 处理流:不直接连接到数据源或目的地,是其他流进行封装。目的主要是简化操作和提高性能
- 节点流和处理流的关系:
- 节点流处于IO操作的第一线,所有操作必须用过他们进行
- 处理流可以对其他流进行处理(提高效率或操作灵活性)
- 字节流:按照字节读取数据(InputStream、OutputStream)
- 字符流:按照字符读取数据(Reader、Writer),因为文件编码的不同,从而有了对字符进行高效操作的字符流对象。
- 原理:底层还是基于字节流操作,自动搜寻了指定的码表
3.File常用API及文件编码
文件路径推荐表示法:
1.path= “D:/XXX/XXX/XXX.png”;
2.path=”D:”+File.separator+”java300”+File.separator+”XXX.png”;
API
- pathSeparator separator 路径|路径分隔符
- File(String parent,String child) 构造器
- File(File parent,String child)
- File(String name)
- getName() 文件名、路径名
- getPath()
- getAbsolutePath()
- getParent
- exists() 判断状态
- isFile()
- isDirectorv()
- length() 文件长度
- createNewFile() 创建新文件
- delete() 删除文件
- mkdir() 创建目录,需要确保上级目录存在,不存在时创建失败
- mkdirs() 创建目录,当父目录不存在时一同创建
- list() 下级名称
- listFiles() 下级File
- listRoots() 根路径
4.IO流读写操作
- InputStream 字节输入流的父类,数据单位为字节
- int read()
- void close()
- OutputStream 字节输出流的父类,数据单位为字节
- void write(int)
- void flush()
- void close()
- Reader 字符输入流的父类,数据单位为字符
- int read()
- void close()
- Writer 字符输出流的父类,数据单位为字符
- void write(String)
- void flush()
- void close()
5.代码段
输入流代码演示
1 package wangyue;
2
3 import java.io.*;
4
5 public class IoStudy02 {
6 public static void main(String[] args) {
7 //1.创建源
8 File file = new File("test");
9 //2.创建流
10 InputStream is = null;
11 try {
12 is = new FileInputStream(file);
13 byte[] flush = new byte[30];//缓冲容器
14 int len;//接收长度
15 while ((len = is.read(flush)) != -1) {
16 String str = new String(flush, 0, len);
17 System.out.println(str);
18 }
19 } catch (FileNotFoundException e) {
20 e.printStackTrace();
21 } catch (IOException e) {
22 e.printStackTrace();
23 }finally {
24 if (is != null) {
25 try {
26 is.close();
27 } catch (IOException e) {
28 e.printStackTrace();
29 }
30 }
31 }
32 }
33 }
34
知识兔div>输出流代码演示
1 package wangyue;
2
3 import java.io.*;
4
5 public class IoStudy03 {
6 public static void main(String[] args) {
7 //1.创建源
8 File dest = new File("output.txt");
9 //2.选择流
10 OutputStream os = null;
11 try {
12 os = new FileOutputStream(dest);
13 //3.操作
14 String msg = "向文件中写入一些没什么用的东西";
15 byte[] datas = msg.getBytes();//字符串--》字节数组 (编码)
16 os.write(datas, 0, datas.length);
17 //刷新流,避免有数据存在在缓存中。即使os.close() 也会刷新流,此处也再刷新一次
18 os.flush();
19 } catch (FileNotFoundException e) {
20 e.printStackTrace();
21 } catch (IOException e) {
22 e.printStackTrace();
23 }finally {
24 if (os != null) {
25 try {
26 os.close();
27 } catch (IOException e) {
28 e.printStackTrace();
29 }
30 }
31 }
32
33 }
34 }
35
知识兔div>文件拷贝
1 package wangyue;
2
3 import java.io.*;
4
5 public class IoStudy04 {
6 public static void main(String[] args) {
7 //1.创建源
8 File src = new File("C:/Users/86178/Desktop/微信截图_20191006134845.png");
9 File dest = new File("C:/Users/86178/Desktop/copy.png");
10 //2.选择流
11 InputStream is = null;
12 OutputStream os = null;
13 try {
14 is = new FileInputStream(src);
15 os = new FileOutputStream(dest,false);
16 //3.操作
17 byte[] flush = new byte[1024];
18 int len;
19 while ((len = is.read(flush)) != -1) {
20 os.write(flush, 0, len);
21 }
22 //刷新流,避免有数据存在在缓存中。即使os.close() 也会刷新流,此处也再刷新一次
23 os.flush();
24 } catch (FileNotFoundException e) {
25 e.printStackTrace();
26 } catch (IOException e) {
27 e.printStackTrace();
28 }finally {
29 if (os != null && is != null) {
30 //4.关闭资源,先打开的后关闭。注意要分别关闭
31 try {
32 is.close();
33 } catch (IOException e) {
34 e.printStackTrace();
35 }
36 try {
37 os.close();
38 } catch (IOException e) {
39 e.printStackTrace();
40 }
41 }
42 }
43
44 }
45 }
46
知识兔div>6.字节数组流 ByteArrayInputStream & ByteArrayOutputStream
字节数组流无需关闭,由java虚拟机gc进行回收.
7.IO工具类
1 package wangyue;
2
3 import java.io.*;
4
5 /**
6 * 1、封装拷贝
7 * 2、封装释放资源
8 */
9 public class FileUtils {
10
11 public static void main(String[] args) {
12
13 byte[] datas = null;
14 //文件到文件
15 try {
16 InputStream is = new FileInputStream("test");
17 OutputStream os = new FileOutputStream("test-copy.txt");
18 copy(is, os);
19 } catch (IOException e) {
20 e.printStackTrace();
21 }
22 //文件到字节数组
23 try {
24 InputStream is = new FileInputStream("test.png");
25 ByteArrayOutputStream os = new ByteArrayOutputStream();
26 copy(is, os);
27 datas = os.toByteArray();
28 System.out.println(datas.length);
29 } catch (IOException e) {
30 e.printStackTrace();
31 }
32 //字节数组到文件
33 try {
34 InputStream is = new ByteArrayInputStream(datas);
35 OutputStream os = new FileOutputStream("test-copy.png");
36 copy(is,os);
37 } catch (FileNotFoundException e) {
38 e.printStackTrace();
39 }
40 }
41
42 /**
43 * 对接输入输出流
44 * @param is
45 * @param os
46 */
47 public static void copy(InputStream is, OutputStream os) {
48 try {
49 byte[] flush = new byte[2014];//缓冲容器
50 int len;
51 while ((len = is.read(flush)) != -1) {
52 os.write(flush, 0, len);
53 }
54 os.flush();
55 } catch (IOException e) {
56 e.printStackTrace();
57 }finally {
58 close(is,os);
59 }
60 }
61
62 /**
63 * 释放资源
64 * @param is
65 * @param os
66 */
67 public static void close(InputStream is,OutputStream os) {
68 try {
69 if (is != null) {
70 is.close();
71 }
72 } catch (IOException e) {
73 e.printStackTrace();
74 }
75
76 try {
77 if (os != null) {
78 os.close();
79 }
80 } catch (IOException e) {
81 e.printStackTrace();
82 }
83 }
84
85 /**
86 * 释放资源
87 * @param ios
88 */
89 public static void close(Closeable... ios) {
90 for (Closeable io : ios) {
91 try {
92 if (null != io) {
93 io.close();
94 }
95 } catch (IOException e) {
96 e.printStackTrace();
97 }
98 }
99 }
100
101 }
102
知识兔div> 1 package wangyue;
2
3 import java.io.*;
4
5 public class FileUtils2 {
6 /**
7 * 对接输入输出流
8 * try...with...resource
9 * 不需要在finally中释放资源,只要try(is,os)即可,系统自动释放资源,不需要关心释放顺序
10 * @param is
11 * @param os
12 */
13 public static void copy(InputStream is, OutputStream os) {
14 try (InputStream iss = new FileInputStream("sdf");
15 OutputStream oss = new FileOutputStream("test")) {
16
17 byte[] flush = new byte[2014];//缓冲容器
18 int len;
19 while ((len = is.read(flush)) != -1) {
20 os.write(flush, 0, len);
21 }
22 os.flush();
23 } catch (IOException e) {
24 e.printStackTrace();
25 }
26 }
27 }
28
知识兔div>8.装饰器设计模式,原理剖析
1 package wangyue;
2
3 /**
4 * 模拟咖啡
5 * 1、抽象组件:需要装饰的抽象对象(接口或抽象父类)
6 * 2、具体组件:需要装饰的对象
7 * 3、抽象装饰类:包含了对抽象组件的引用,以及装饰者共有的方法
8 * 4、具体装饰类:被装饰的对象
9 */
10 public class DecorateTest02 {
11
12 public static void main(String[] args) {
13 Drink coffee = new Coffee();
14 Drink sugar = new Sugar(coffee);
15 System.out.println(sugar.info() + "-->" + sugar.cost());
16 Drink milk = new Milk(coffee);
17 System.out.println(milk.info() + "-->" + milk.cost());
18 }
19 }
20 //抽象组件
21 interface Drink {
22 double cost();//费用
23 String info();//说明
24 }
25
26 //具体组件
27 class Coffee implements Drink {
28 private String name = "原味咖啡";
29
30 @Override
31 public double cost() {
32 return 10;
33 }
34
35 @Override
36 public String info() {
37 return name;
38 }
39 }
40
41 //抽象装饰类
42 abstract class Decorate implements Drink {
43
44 //对抽象组件的引用
45 private Drink drink;
46
47 public Decorate(Drink drink) {
48 this.drink = drink;
49 }
50
51 @Override
52 public double cost() {
53 return this.drink.cost();
54 }
55
56 @Override
57 public String info() {
58 return this.drink.info();
59 }
60 }
61
62 //具体的装饰类
63 class Milk extends Decorate {
64
65 public Milk(Drink drink) {
66 super(drink);
67 }
68 @Override
69 public double cost() {
70 return super.cost() * 4;
71 }
72
73 @Override
74 public String info() {
75 return super.info() + "牛奶";
76 }
77 }
78 //具体的装饰类
79 class Sugar extends Decorate {
80
81 public Sugar(Drink drink) {
82 super(drink);
83 }
84 @Override
85 public double cost() {
86 return super.cost() * 2;
87 }
88
89 @Override
90 public String info() {
91 return super.info() + "加入优质方糖";
92 }
93 }
94
95
知识兔div>