Java中File类和I/O

File 类

  • File类是java.io包中很重要的一个类

  • File类的对象可以表示文件,还可以表示目录,在程序中的一个File类对象可以代表一个文件或目录

  • File对象可以对文件或目录的属性进行操作,如:文件名,最后修改日期,文件大小等

  • File对象无法操作文件的具体数据,即不能对文件进行的操作

File 构造方法

方 法 原 型 说明
File (String pathname) 指定文件(或目录)名和路径创建文件对象
//在当前目录先创建一个与aaa.txt文件名相关联的文件对象
File f1 = new File("aaa.txt");
//指明详细的路径以及文件名,请注意双斜线或用反斜杠
File f2 = new File("D:\\Java\\Hello.java");
//指明详细的路径以及目录名,请注意双斜线
File f3 = new File("D\\Java");
方法原型 说明
boolean exists() 判断文件是否存在 存在-true 不存在-false
boolean isFile() 判断是否为文件,是-true 不是-false
boolean isDirectory() 判断是否为目录,是目录-true 不是-false
String getName() 获取文件名称
long length() 获取文件长度(字节数)
boolean creatNewFile()throws IOException 创建新文件,成功-true 失败false,有可能抛出IOException异常,必须捕捉
boolean delete() 删除文件,成功-true 失败-false
public String[] list() 将目录下的子目录以及文件的名字,返回到String数组
public Flie[] listFiles() 将目录下的子目录以及文件的实例返回到File数组

输入输出(I/O)

  • 输入输出(I/O)把电脑硬盘的数据读到程序中,称为输入,即input,进行数据的read操作从程序往外部设备写数据,称为输出,即output,进行数据的write操作

体系图

IO体系图

字节流与字符流

  • 从数据流编码格式上划分为
    • 字符流
    • 字节流

输入流与输出流

  • 流按着数据的传输方向分为:

    • 输入流: 往程序中读叫输入流
    • 字节流:从程序中往外写叫输出流
    • InputStreamOutputStream的子类都是字节流,可以读写二进制文件,主要处理音频图片,歌曲,字节流,处理单元为 一个字节
    • ReaderWriter的子类都是字符流 主要处理字符或字符串,字符流处理的单元为 一个字符. 字节流将读取到的字节数据,去指定的编码表中获取对应文字字符
  • 字节流中常用的类

    • 字节输入流 FIleInputStream
    • 字节输出流FileOutputStream
  • 字符流的常用类

    • 字符输入流 FileReader
    • 字符输出流FileWriter

输入输出字节流

构造方法

FileInputStream in =new FileInputStream("D:\\777\\新建 文本文档.txt");//括号里面也可以是File对象
FileOutputStream out = new FileOutputStream("D:\\aaaa.c");////括号里面也可以是File对象

方法

InputStream 基本方法

public int read() throws IOException

  • 读取一个字节并以整数的形式返回(0~255),如果返回-1,已到输入流的末尾

public int read(byte[] buffer) throws IOException

  • 读取一系列字节并存储到一个数组buffer,返回实际读取的字节数,如果读取前已到输入流的末尾,返回-1

public void close() throws IOException

  • 关闭流,释放内存资源

OutputStream 基本方法

public void write(int b) throws IOException

  • 向输出写入一个字节数据,该字节数据位参数b的低8位

public void write(byte[] b,int off,int len) throws IOException

  • 将一个字节类型数组中的从指定位置(off)开始到len个字节写入输出流

public void close() throws IOException

  • 关闭流释放内存资源

实际使用

public class StreamDemo {
    public static void main(String[] args) throws IOException {
        FileInputStream in =new FileInputStream("D:\\777\\新建 文本文档.txt");
        FileOutputStream out = new 			 FileOutputStream("D:\\aaaa.c");
//        System.out.println(in.read()); //每read一次返回一个字节编码 读完返回-1
//
//        System.out.println(in.read());
/*
    int read() 默认一次读一个字节,返回的是读到的字节编码 返回效率低
    int read(byte[] b) 默认一次读一个指定大小的byte个字节 返回的数组中一次实际
                    装入的字节个数
 */
        int t;
        while((t=in.read())!=-1){
            out.write(t);
        }
        int size;
        byte[] b = new byte[10000];
        while((size=in.read(b))!=-1){
            out.write(b,0,size);//从0开始读,读到文件字节长度,比直接write(b)节省空间

        }
        //关闭流对文件的占用
        in.close();
        out.close();
    }
}

  • DataOutputStreamDataInputStream 也属于输入输出字节流,与FIleOutputStream,FileInputStream区别:前者的输入输出是以原始数据类型为基本单位输入输出(char ,int ),后者则是以 字节 为单位进行读写

  • DataOutputStreamDataInputStream底层还是对字节的处理

输入输出字符流(Reader Writer)

构造方法

File file =new File("D:/777/888/999/新建 文本文档.txt");
Reader read = new FileReader(file);
//....还有其他多种构造对象方法
 Writer writer = new FileWriter(file);

方法

方法与上面方法名与用法一样,区别:Reader与Writer只能处理纯字符的文件!!!!

Print流

  • Print 打印流
    • 只做输出没有输入 打印流分为字节打印流和字符打印流
    • PrintWrite
      • 字符打印流 print 方法可以打印各种类型数据
      • 在javaweb 项目中,服务器端相应数据以打印流的方式响应

对象输入输出流--对象序列化

序言:对象的寿命通常随着生成该对象的程序终止而终止,有时候,可能需要将对象的状态保存下来,在需要时候再将对象恢复

对象的序列化可以形象地比喻为将一个对象从内存中“拍成照片”,并将其存储在可以持久化的存储设备(如磁盘)上。当需要还原这些数据时,可以通过反序列化的过程,将这些照片重新“冲洗”出来,并还原成原始对象

  • 对象的输入输出流
  • 主要作用:用于写入对象信息与读取对象信息,对象信息一旦写到文件上那么对象的信息就可以做到持久化
    • 对象输出流ObjectOutputStream
    • 对象输入流ObjectInputStream
    • 当然也有对应的读写方法
      • readObject()方法读取一个对象
      • writeObject方法将对象保存到输出流
  • 对象的输出流将制定的对象写入到文件的过程中,就是将对象序列化的过程
  • 对象的输入流将指定序列化好的文件读出来的过程,就是将对象反序列化
  • 对象的输出流将对象写入到文件中称为对象的序列化, 所以被序列化的对象必须要实现 Serializable接口,Serializable接口中没有任何方法.  当一个类声明实现Serializable接口后,表明该类可被序列化

private static final long serialVersionUID = -5974713180104013488L

  • 随机生成 唯一serialVersionUID用来表明实现序列化类的不同版本间的兼容性. 某个类在与之对应的对象已经序列化出去后做了修改,该对象依然可以被正确的反序列化
  • 如果不显示生成序列号,那么将会隐式生产,但隐式生成后,类一旦发生改变,序列号也会随之变化

transient 关键字

  • 默认情况下当执行了对象序列化的时候会将类中的全部属性的内容进行全部的序列化操作但是很多情况下有一些属性并不需要序列化处理,这个时候就可以在属性的定义上使用transient关键字;来完成了
  • private transient String name;

idea中设置 ,在类中生成序列化id

image-20231019221304773

image-20231019221323832

posted @ 2024-05-26 17:59  Yang0710  阅读(9)  评论(0编辑  收藏  举报