Java-文件与IO

标准输入输出流概述

  • System. in
    • 标准字节输入流,用来读取从键盘录入的数据
  • System.out
    • 标准字节输出流,用来将数据输出到控制台
  • System.err
    • 标准错误流,属于字节输出流,用来将数据输出到控制台,字体为红,表示错误
  • 标准输入输出错误流,由于都是用static修饰的,全局只有三个,只要某个地方关闭了,其他地方也就用不了了

OutputStreamWriter的概述和使用

  • 输出转换流
    • 将字节输出流转换为字符输出流
    OutputStreamWriter(OutputStream out);       //将字节输出流out转换为字符输出流
    

InputStreamReader的概述和使用

  • 输入转换流
    • 将字节输入流转换为字符输入流
    InputStreamReader(InputStream in);       //将字节输入流in转换为字符输入流
    

打印流的概述

  • PrintWriter

    • 字符打印流,是Writer的子类
  • PrintStream

    • 字节打印流,是OutputStream的子类
  • 方法

void print(String str);     //输出任意类型的数据
void println(String str);   //输出任意类型的数据,然后自动换行
  • 注意事项
    • 打印流都是输出流,只能输出不能输入
    • 打印流是可以直接操作文件的流
    FileWriter fw = new FileWriter("a.txt");
    PrintWriter pw = new PrintWriter("a.txt");
    
    • 包装流
    BufferedWriter br = new BufferedWriter(new FileWriter("a.txt");
    
    • PrintWriter的构造方法
    PrintWriter(Writer out)         //包装
      PrintWriter(OutputStream out)   //起到转换的作用
    
    • 打印流也是一个包装流

打印流特有功能

  • 特有功能
    • 自动刷新
      • flush();
    • 自动换行
      • newline();
  • 注意事项
    • 构造方法中的开关
      • 只有打开了构造方法里的开关才能有自动刷新和自动换行的功能
      PrintStream ps = new PrintStream(new FileOutputStream("a.txt"),true);
      

使用打印流复制文本文件

public class CopyFile {
    public static void main(String[] args) throws IOException{
        PrintWriter pw = new PrintWriter(new FileWriter("a.txt"),true);
        BufferedReader br = new BufferedReader(new FileReader("b.txt"));
        String line;
        while((line= br.readLine())!=null){
            pw.println(line);
        }
    }
}
  • 基本流程
println()
write()
newline()
flush()
close()

对象操作流的概述

  • 可以对对象进行文件的读写操作
    • ObjectOutputStream
      • 把对象写出到文件中,这个过程叫序列化
    • ObjectInputStream
      • 把对象读入到内存中,这个过程叫反序列化

使用对象操作流读写对象

  • 对象操作流所读写的对象必须实现了Serializables接口
  • Serializables接口下没有方法,这样的接口成为标记接口

解决对象输入流读取对象出现异常的问题

  • 使用对象输入流读取对象时,读到文件的末尾再往下读时,就会报出异常
  • 解决方法
    1. 将要输出到文件的n个对象封装到一个集合中,读取的时候只读取一次就可以了
    2. 使用死循环+try catch结构的方法规避异常
    try {
        while (true) {
            Object obj = ois.readObject();
            System.out.println(obj);
        }
    } catch(EOFException e) {
        System.out.println("读到了文件尾");
    }
    

解决对实现序列化接口出现的警告问题

  • 问题:将一个对象输出到文件中之后,这个对象所对应的类发生了改变,再读入这个对象的时候就会报错
  • 出错原因
    • 当一个类实现了Serializables接口时,会根据其内部的成员变量以及属性自动生成一个序列化的版本号,这个版本号是随着其内部的变化而变化的,所以当这个类发生改变时,其版本号也会发生改变,再读取时由于读取对象的版本号与当前已经发生改变的类的版本号不一致,故报出异常
  • 解决方法:
    • 在这个类中固定序列化版本号
    private static final long serialVersionUID = 6361890890437825953L;
    

Properties的概述

  • Properties是一双列集合,线程安全,效率低下
  • 用于读写properties配置文件

Properties和IO流结合的功能

void list(PrintWriter p);                   //将其中的内容通过p进行输出
void store(Writer w, String comments);      //将其中的内容输出到文件
void load(Reader r);                        //读取文件中的内容到内存

编码表的概述

  • ASCII编码
    • 基于拉丁字母的编码系统
  • GBK
    • 中文编码表
  • Unicode
    • 所有的字符都占两个字节
  • UTF-8
    • 长度可变的码表
  • ANSI
    • 本地编码表

Java中字符串的编码

  • 默认使用ANSI(GBK)
InputStreamReader(InputStream in, CharsetDecoder dec)            //创建使用给定字符集解码器的 InputStreamReader

OutputStreamWriter(OutputStream out, CharsetEncoder enc)         //创建使用给定字符集编码器的 OutputStreamWriter

字符流中的编码

  • FileWriter的默认缓冲区编码是系统默认编码

保证不乱码,就编码一致


File类的概述和常用功能

  • File是用来描述系统的文件和文件夹的
  • 常用方法
//构造方法
File(String path);                      //创建一个指向path路径的File对象
File(String parent, String child);      //创建一个根据parent 抽象路径名和child路径名的File对象
File(File parent, String child);        //创建一个指向根据parent路径名和child路径名的File对象

File类的创建和删除功能

boolean createNewFile();    //创建一个File对象所指向的对应文件,创建成功则返回true,失败则返回false
boolean mkdir();            //创建一个File对象所指向的对应文件夹,创建成功则返回true,失败则返回false
boolean mkdirs();           //创建此File对象的抽象路径名指定的目录,包括所有必需但不存在的父目录
boolean delete();           //删除File对象所指向的文件或文件夹,但在删除文件夹时,文件夹内部不能包含子目录或文件

File类的判断功能

boolean exists();           //判断File对象所指向的文件或文件夹是否存在
boolean isAbsolute();           //判断File对象所对应的路径是否为绝对路径
boolean isDirectory();      //判断File对象所指向的是否为文件夹
boolean isFile();           //判断File对象所指向的是否为文件
boolean isHidden();         //判断File对象所指向的文件是否隐藏

File类的获取功能和修改名字功能

String getAbsolutePath();       //获取文件绝对路径名
File getAbsoluteFile();         //获取当前文件的绝对路径名形式文件
File getParentFile();           //获取此抽象路径名父目录的抽象路径名
String getPath();               //将此抽象路径名转换为一个路径名字符串
String getName();               //获取此文件的名称
long lastModified();            //获取文件最后一次被修改的时间
long length();                  //获取文件大小
boolean setLastModified();      //设置最后修改时间
boolean renameTo(File file);    //重命名文件

File的重要获取功能

String[] list();                //获取文件下所有文件的文件名数组
File[] listFiles();             //获取文件夹下的所有文件
static File[] listRoots();      //获取可用的文件系统根目录

输出指定目录下的所有Java文件名(包含子目录)

  • 递归的思想
    • 先获得指定目录下的文件
    • 如果为目录,则进入继续查看
    • 如果为文件,则判断是否为Java文件,如果是则输出

删除指定的目录(包含子目录)

  • 递归的思想
    • 先获得指定目录下的文件
    • 如果为目录,则进入继续删除
    • 如果为文件,则直接删除

IO流的分类

  • 按底层操作的数据来分
    • 字符流
      • 操作的是字符,有编码,有缓冲区
      • 能够复制的文件只有**“纯文本文件”**(能用txt正常打开的文件)
      • 字符输入流:实现的抽象类为Reader
      • 字符输出流:实现的抽象类为Writer
    • 字节流
      • 操作的是字节,是计算机的最小存储单元
      • 能够操作复制所有的文件
      • 字节输入流:实现的抽象类为InputStream
      • 字节输出流:实现的抽象类为OutputStream

字符流进行图片的复制

  • 字符流进行文件复制
    • 字符流进行非纯文本文件的复制时,由于其操作的是字符而且有编码,当遇到无法转换为字符的编码时,就会发生文件的损坏,
    • 由于编码的减少,文件的总体也会变小

将指定目录(包含内容)复制到另一个目录中

  • 递归的思想
    • 先创建指定的目录
    • 进入指定的目录获得文件
    • 如果为目录则直接创建并进入继续复制
    • 如果为文件则直接复制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值