• 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); 删除文件夹
    *
    * 注意点:
    * 一般过期的方法,不建议使用,可能会存在安全隐患

  • 相关阅读:
    $(this)的意思
    Springmvc框架文件上传单文件上传
    保险业务知识价税分离
    SpringMVC框架,json
    使用springmvc框架实现多文件上传
    oracle数据库中的绑定变量
    使用Springmvc框架实现多文件上传(二)
    Springmvc框架json对象的处理
    Springmvc框架json数据传递处理,解决方案2
    [算法] 6 种排序的重写,很熟练!
  • 原文地址:https://www.cnblogs.com/youyouxiaosheng-lh/p/8343309.html
Copyright © 2020-2023  润新知