java 之IO流全(File,递归 字节流 高效流 转换流 打印流 序列化)

    IO流全(File,递归 字节流 高效流 转换流 打印流 序列化)

1. 文件: file, 用来存储具体的数据的.
目录(文件夹): directory, 用来存储文件或者文件夹
路径: path, 表示文件或者文件夹的位置

File类: 用来表示文件或者文件夹在电脑或者项目中的位置的类;与系统环境无关(平台无关性,在任何平台使用是一样的步骤)
1> 导入包, import java.io.File;
2> 获取对象,构造方法
3> 使用,成员方法,成员变量

静态成员变量
File.pathSeparator; 表示路径与路径之间的分隔符
File.separator; 文件夹和文件或者文件夹之间的分割

2. File类的构造方法:

1> public File(String pathName); 根据一个字符串路径创建对象
2> public File(String parent, String child); 根据两个字符串路径创建对象
3> public File(File parent, String child); 根据file对象和字符串子路径创建对象

路径分为两种:
相对路径: 以文件夹作为基准, java\aaa bbb\aaa
绝对路径: 以电脑的盘符作为基准, 比如: C:\Users\sszz\Desktop

注意点:
1> 如果文件之间的分割是以反斜杠作为分割,需要写上两个反斜杠\, 如果以正斜杠,只需要写一个即可 /
2> File对象进行输出的时候不是地址值,说明已经覆盖了Object中的toString方法, JDK中的大部分类都这样
3> 使用File去创建对象的时候仅仅是,以字符串构建了一个路径而已,无所谓字符串路径存不存在.

3. File类中常用方法之创建方法;
1> public boolean creatNewFile(); 创建一个文件,如果文件存在不能创建,不存在则创建成功
2> public boolean mkdir(); 创建一个单级文件夹(目录)
3> public boolean mkdirs(); 创建多级文件夹, 可以代替上面的创建单级的方法

注意: 不能以文件是否有后缀来区分是否是文件或者文件夹

4. File类中的成员方法之判断方法:
1> public boolean exists(); 判断文件或者文件夹是否存在
2> public boolean isFile(); 判断是否是文件
3> public boolean isDirectory(); 判断文件夹

5. File类的成员方法之获取方法:
1> public String getName(); 获取文件或者文件夹的名字
2> public String getPath(); 获取文件或者文件夹的路径
3> public long length(); 文件的字节大小
4> public String getParent(); 获取文件或者文件夹的父路径
5> public File getParentFile(); 获取文件或者文件夹的父路径,以File形式返回
6> public String getAbsolutePath(); 获取绝对路径
7> public File getAbsoluteFile(); 获取绝对路径, 以File形式返回

6. File类中的获取列表的方法:
1> public static File[] listRoots(); 获取所有的根目录(盘符)
2> public String[] list(); 获取到对象中路径下所有的文件或者文件夹的名字
3> public File[] listFiles(); 获取到对象中路径下的所有文件或者文件夹,全路径

可以使用增强for的容器:
1> 数组
2> Collection集合体系

7. 使用过滤器,获取指定的文件
File类中的过滤器方法:
public File[] listFiles(FileFilter filter); 传入一个过滤器参数进行

FileFilter是一个接口,不能直接创建对象,有两种使用使用方式:
1> 定义一个实现类, 重写接口中的抽象方法
a.定义一个类, 实现FileFilter接口
b.重写accept抽象方法
c.在accept中编写过滤逻辑

2> 使用这个接口的匿名内部类
a. 创建一个匿名内部类,FileFilter的
b. 重写accept方法
c. 在accept方法中编写过滤逻辑


匿名内部类的格式:
接口/抽象类 变量名 = new 接口/抽象类(){
// 重写接口或者是抽象类中的抽象方法
};

8. File类中的成员方法之删除方法
1> public boolean delete(); 删除文件或者文件夹


注意点:
1> 如果文件夹中还有内容,不能删除
2> 删除的过程不走回收站,操作需谨慎!

9. 递归: 并不是一个开发技术, 而是一种编程经验
代码解释: 方法自己调用自己, 一旦调用的层级结构过深之后,容易出现栈内存溢出: StackOverflowError

10. OutputStream: 所有字节输出流的抽象父类,在java.io包下面,里面常用的子类是:FileOutputStream;
使用步骤:
1> 导入包: import java.io.FileOutputStream;
2> 创建对象,构造方法
public FileOutputStream(File pathName);
public FileOutputStream(String pathName);

3> 成员方法
public void write(int b); 写入单个字节到文件中
public void write(byte[]buf); 写一个字节数组到文件中
public void write(byte[]buf, int offset, int len); 写字节数组的一部分到文件中
public void flush();
public void close();

注意点:
1> 在使用字节流向文件中写数据的时候,写入的97是一个字节,但是文件会自动进行翻译所以看到的是a
2> 一个字符在java的内存中占用的是两个字节,但是在文件中占用几个字节取决于操作系统

12. FileOutputStream中常用的成员方法:
public void write(int b); 写入单个字节到文件中
public void write(byte[]buf); 写一个字节数组到文件中
public void write(byte[]buf, int offset, int len); 写字节数组的一部分到文件中
public void flush();
public void close();


注意点:
1> 使用字节流写文件的时候,没有缓冲区,所以不需要刷新
2> 任何流,使用完成之后都应当将资源释放掉(close)

13. 如何需要将一个字符串输出到文件中该怎么办?
答: 需要将字符串转成字节数组

1> 字符串转成字节数组,使用String类的 getBytes方法
public byte[] getBytes();

2> 字节数组转成字符串,使用字符串的构造方法
public String(byte[]buf);
public String(byte[]buf, int offset, int len);

14. 在使用字节流向文件中输出内容的时候如何进行换行?
平台(操作系统) 换行符
windows
MacOS
Linux
注意点: 一般写在第一行数据的结尾,第二行数据的开头

在使用字节流向文件中输出内容的时候,如何进行续写(追加写)?
需要使用另外一个构造方法:
public FileOutputStream(File pathName, boolean append);
public FileOutputStream(String pathName, boolean append);
pathName:表示数据要输出的目的地
append: 如果为true可以追加写, 如果为false不能追加(覆盖之前的内容)

15. InputStream: 是所有字节输入流的抽象父类,在java.io包下面, 需要使用子类FileInputStream;
使用步骤:
1. 导入包, import java.io.FileInputStream;
2. 创建对象,使用构造方法
public FileInputStream(String pathName);
public FileInputStream(File pathName);
3. 使用成员方法
public int read(); 读取单个字节
public int read(byte[]buf); 将读取到的内容存储到buf数组中, 返回实际读取到的长度(个数)
字节流是专门用来做文件的拷贝操作的, 不是读取来给程序员看的.

16. BufferedOutputStream: 缓冲输出流对象,也是OutputStream的子类, 在java.io包中,默认缓冲区大小是8k
使用步骤:
1> 导入包, import java.io.BufferedOutputStream;
2> 创建对象, 使用构造方法
public BufferedOutputStream(OutputStream out);
out:需要传入一个字节流对象, 所以可以传入FileOutputStream;

3> 成员方法;
和FileOutputStream完全一样. write(单个字节/ 字节数组/ 字节数组一部分)

17. BufferedInputStream: 缓冲字节输入流对象, 也是InputStream的子类,在java.io包下面,默认缓冲区8k
使用步骤:
1> 导入包, import java.io.BufferedInputStream;
2> 创建对象, 构造方法
public BufferedInputStream(InputStream in);
in: 需要InputStream类型的参数, 可以传入FileInputStream对象;
3> 使用成员方法
和FileInputStream完全一样
public int read() 读取单个字节
public int read(byte[]buf); 将读取的内容存储到buf中, 返回实际读取到的个数
四种拷贝文件的方式选择:
1. 普通流,一次读取单个字节方式拷贝
2. 普通流,一次读取字节数组方式拷贝
3. 缓冲流,一次读取单个字节方式拷贝
4. 缓冲流,一次读取字节数组方式拷贝

选择顺序: 4 > 2 > 3 > 1

18. 异常和IO流的典型用法
try{
创建IO流
拷贝操作
}catch(异常类名 变量名){
打印提示信息
}finally{
释放资源,关闭流
}

19. OutputStreamWriter: 字符流, 可以将字符转成字节进行输出,所以也称为"转换流"
使用步骤:
1> 导入包, import java.io.OutputStreamWriter
2> 创建对象,使用构造方法
public OutputStreamWriter(OutputStream out); // 使用默认编码输出
public OutputStreamWriter(OutputStream out, String charsetName)//自定义编码输出

3> 使用成员方法
和FileWriter使用的方法完全一样, write(字符串/字符串的一部分/单个字符/字符数组/字符数组一部分)

20. IntputStreamReader: 字符流, 可以以字节的形式读取文件转换成字符流,所以也成为"转换流"
使用步骤:
1> 导入包 import java.io.InputStreamReader;
2> 创建对象,使用构造方法
public InputStreamReader(InputStream in)// 使用默认编码
public InputStreamReader(InputStream in, String charSetName);// 使用指定编码

3> 使用成员方法
和FileReader一样
read() 读取单个字符
read(char[]array) 读取字符数组

21. 转换流和普通的字符流区别(如何选择)?
转换流: OutputStreamWriter(字符流转字节流的桥梁), InputStreamReader(字节转字符流的桥梁)
普通字符流: FileWriter, FileReader

1> 如果已知文件编码的情况和所在的项目是一致的,使用普通字符流
2> 如果需要自定义编码,使用转换流
3> 如果做文件拷贝,字节流

22. ObjectOutputStream: 字节流,用来将对象的内容输出到文件中,也成为"序列化流"
ObjectInputStream: 字节流, 用来将文件中的对象信息,读取转换对象内容, 也成为"反序列化流"

使用步骤:
1> 导入包 import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;

2> 创建对象,使用构造方法
public ObjectOutputStream(OutputStream out)
参数out: 需要传入一个字节输出流对象,所以可以传入FileOutputStream

public ObjectInputStream(InputStream in)
参数in: 需要传入一个字节输入流对象, 所以可以传入FileInputStream

3> 使用成员方法
序列化流的成员方法: public writeObject(Object obj);
反序列化的成员方法: publilc Object readObject();

23. 如果是一个自定义的对象该如何进行序列化?
1> 这个类需要实现java.io.Serializable接口
2> Serializable接口中并没有任何抽象方法,仅仅是一个标记接口


反序列化的时候,有可能文件中的版本号和字节码文件的版本号不一致异常?
自定义版本号即可解决!

如果一个对象中的成员不想被序列化怎么办?
1> static修饰的内容不能被序列化, 因为不属于对象. 不推荐使用, 因为修饰之后所用对象共享了.
2> 如果一个成员变量不想被序列化, 可以使用关键字transient关键字(瞬态). 推荐使用
格式: transient 数据类型 变量名;

24. PrintWriter: 打印输出的字符流, 在java.io包中
PrintStream: 打印输出的字节流,在java.io包中

使用步骤:
1> 导入包 import java.io.PrintWriter
import java.io.PrintStream

2> 创建对象, 使用构造方法
public PrintWriter(String fileName);
public PrintStream(String fileName);

3> 使用成员方法,输入内容
print(任意数据); 不带换行
println(任意数据); 带换行输出

注意点:
1> 使用打印流的时候不关系数据的类型,只关心输出到的低点
2> 使用print,println不会产生异常信息
3> 所有的内容在进行打印输出的时候,都会被转成字符数组进行输出
4> 使用打印字符流的时候不会自动刷新

25. 如何让字符流在打印的时候也做到自动刷新的功能呢?
需要使用的构造方法:
PrintWriter(OutputStream out, boolean autoFlush)
out: 需要传入一个字节输出流对象, 所以可以传入FileOutputStream对象
autoFlush: 如果为true可以自动刷新, 否则不能.

注意点:
只有使用println, printf, format三个方法才具有刷新功能
format: "占位符", 具体的数据
比如: %s 对应的是字符串
%d 对应的是十进制数

26.补充:
* 什么是第三方?
* 第一方: Oracle
* 第二方: 开发者自己
* 第三方: 除了Oracle和开发者自己
*
* 什么是JAR包?
* 就是框架中一些特殊的文件格式, 里面包含一堆的源码的字节码文件信息,导入到项目中之后即可使用JAR包的功能
*
* 有哪些知名JAR包?
* 美国有个知名的软件基金会Apache(阿帕奇),网站: www.apache.org/
* 里面维护了很多知名的框架,比如: Structs,Lucence,Solr,ActiveMQ, Have,Hbase,Hadoop,Commons...等等350多个.
*
* 其中Commons中提供了一些常用的工具类:
* 比如:
* Commons-IO, 操作和IO流相关的内容
* Commons-Lang
* Commons-Collection
* Commons-dbcp
* ....
*
* 如何使用JAR包?
* 1. 在项目中创建一个文件夹,名字一般写成lib
* 2. 将对应的JAR包拷贝到该文件夹中
* 3. 右键选择build path, add to Build Path, 出现Referenced的引用即可以使用了
*
* 使用的工具类在: org.apache.commons.io.FileUtils;
* 使用步骤:
* 1. 导入包 import org.apache.commons.io.FileUtils;
* 2. 不需要创建对象,都是静态方法
* 3. 常用的静态方法:
* 3.1 public static void writeStringToFile(File file, String data, String charSetName); 写入字符串到指定的文件中
* 3.2 public static String readFileToString(File file, String charSetName);指定编码表读取内容
* 3.3 public static void copyFile(File srcFile, File destFile);拷贝文件
* 3.4 public static void copyDirectory(File srcDir, File destFile); 拷贝文件夹里面的内容
* 3.5 public static void copyDirectoryToDirectory(File srcDir, File destFile);拷贝整个文件夹到新的文件夹
* 3.6 public static void forceDelete(File file); 删除文件
* 3.7 public static void deleteDirectory(File dirFlie); 删除文件夹
*
* 注意点:
* 一般过期的方法,不建议使用,可能会存在安全隐患

原文地址:https://www.cnblogs.com/youyouxiaosheng-lh/p/8343309.html