基本概念

  • 操作系统中,信息可以持久化的存储在硬盘上,存储在硬盘上的数据就是文件
  • 文件夹是用于将不同的文件进行分类的单位
  • 在JDK中提供了java.io.File类对文件进行相关的操作

    文件的基本操作

  • 创建一个文件对象(并不代表在硬盘上就创建一个文件,只是将这个文件的基本信息存储在内存中而已)

    1. //绝对路径
    2. File file1 = new File("d:/temp/a.txt");
    3. File file2 = new File("d:\\temp\\a.txt");
    4. //相对路径,相对是当前的工程目录src
    5. File file3 = new File("a.txt");
  • 需要通过相关的代码才可以真正的创建文件

    1. //判断文件是否存在
    2. if(file3.exists()){
    3. System.out.println("file3存在");
    4. }else{
    5. System.out.println("file3并不存在,创建一个新的");
    6. //在硬盘上创建一个文件
    7. file3.createNewFile();
    8. }
  • 文件的相关api操作 :::info createNewFile()//创建一个新文件
    mkdir()//创建一个新目录
    delete()//删除文件或空目录
    exists()//判断File对象所对象所代表的对象是否存在
    getAbsolutePath()//获取文件的绝对路径
    getName()//取得名字
    getParent()//获取文件/目录所在的目录
    isDirectory()//是否是目录
    isFile()//是否是文件
    length()//获得文件的长度
    listFiles()//列出目录中的所有内容
    renameTo()//修改文件名为 :::

文件的增删改查操作

  • 查询文件夹下所有的文件

    1. public static void showAllFile(File folder){
    2. //判断是否是文件夹
    3. if(folder.isDirectory()){
    4. File[] files = folder.listFiles();//获取当前文件夹下所有的文件
    5. for (File file :files) {
    6. System.out.println(file.getAbsoluteFile());
    7. }
    8. }else{
    9. System.out.println("当前的文件不是文件夹");
    10. }
    11. }
  • 创建文件夹

    1. public static void createFolder(String folderPath){
    2. File file = new File(folderPath);
    3. if(!file.exists()){
    4. file.mkdir();
    5. System.out.println("创建文件夹成功");
    6. }
    7. }
  • 修改名称
    file.renameTo(dist);

  • 删除文件夹

    1. //要支持删除文件夹
    2. public static void deleteFile(File file){
    3. if(file.isDirectory()){
    4. //是文件夹
    5. File[] files = file.listFiles();
    6. for (File f :files) {
    7. deleteFile(f);//删除当前目录下所有的文件
    8. }
    9. }
    10. file.delete();//删除当前文件
    11. System.out.println(file.getAbsoluteFile()+"被删除了");
    12. }

    流操作

    基本概述

  • 流的操作,就是实现了两个媒介之间的信息通信,总的来说主要是内存和其他存储设备之间的数据传递

  • 根据方向可以分为两类
    • 输入流(InputStream):参照物体是内存,指的是从其他媒介将数据输入到内存中。
    • 输出流(OutputStream):参照物体是也是内存,指的是从内存中向其他的媒介输出数据
  • 按照单位进行分类

    • 字节流:就是二进制的文件,存储的数据是byte,例如音频,视频,等等一切文件
    • 字符流:就是以char字符的文件,主要存储的是字符串,方便字符串的操作,不可以传递音频,视频只能传递文本

      字节流的操作

  • 文件夹流是对一般的流的子类实现,主要是对文件进行操作

  • 文件的读取(输入流的使用)

    • 基本的读取操作
      1. File file = new File("a.txt");
      2. //通过文件创建一个输入
      3. InputStream is = new FileInputStream(file);
      4. //将文件中的内容读取出来
      5. int size = is.available();
      6. byte[] buffer = new byte[size];
      7. is.read(buffer);//读取数据
      8. is.close();//关闭流
      9. System.out.println("文件内容的大小:"+size);
      10. System.out.println("文件中的内容:"+new String(buffer));
  • 文件的写入操作

    • 基本操作
      1. File file = new File("a.txt");
      2. //打开一个输出流,第二参数是append是否是新增
      3. OutputStream os = new FileOutputStream(file,true);
      4. os.write("这个是新添加的内容".getBytes(StandardCharsets.UTF_8));
      5. os.close();;
  • 实现文件的复制

    1. public static void copy(File srcFile, File distFile){
    2. try {
    3. //1,打开读取流
    4. InputStream in = new FileInputStream(srcFile);
    5. //2,打开输出流
    6. OutputStream os = new FileOutputStream(distFile);
    7. //将数据出来放在内存的缓存中
    8. byte[] buffer = new byte[in.available()];
    9. in.read(buffer);
    10. //将buffer中的数据输出到dist文件中
    11. os.write(buffer);
    12. //关闭流
    13. in.close();
    14. os.close();
    15. System.out.println("复制完毕");
    16. } catch (FileNotFoundException e) {
    17. e.printStackTrace();
    18. } catch (IOException e) {
    19. e.printStackTrace();
    20. }
    21. }

    字节缓冲流

  • 为什么要使用缓存流?

    • 就是为了减少io的次数
    • 不使用available读取数据(会带上000多余的数据)

      1. File file = new File("a.txt");
      2. InputStream in = new FileInputStream(file);
      3. byte[] buffer = new byte[1024];
      4. StringBuilder sb = new StringBuilder();
      5. //获取每次堆区数据的长度
      6. while(in.read(buffer)!=-1){
      7. //每次读取完毕,都将buffer中的数据放入到StringBuffer
      8. sb.append(new String(buffer));
      9. }
      10. //读取数据完毕
      11. in.close();
      12. System.out.println(sb.toString());
    • 解决多余的000的问题

      1. File file = new File("a.txt");
      2. InputStream in = new FileInputStream(file);
      3. byte[] buffer = new byte[1024];
      4. StringBuilder sb = new StringBuilder();
      5. //获取每次堆区数据的长度
      6. int len;
      7. while( (len=in.read(buffer))!=-1){
      8. //每次读取完毕,都将buffer中的数据放入到StringBuffer
      9. sb.append(new String(buffer,0,len));
      10. }
      11. //读取数据完毕
      12. in.close();
      13. System.out.println(sb.toString());
  • 缓存读取流

    1. File file = new File("a.txt");
    2. InputStream in = new FileInputStream(file);
    3. //使用缓存流,减少io的次数
    4. BufferedInputStream bis = new BufferedInputStream(in);
    5. byte[] buffer = new byte[1024];
    6. StringBuilder sb = new StringBuilder();
    7. //获取每次堆区数据的长度
    8. int len;
    9. while( (len=bis.read(buffer))!=-1){
    10. //每次读取完毕,都将buffer中的数据放入到StringBuffer
    11. sb.append(new String(buffer,0,len));
    12. }
    13. //读取数据完毕
    14. bis.close();
    15. in.close();
    16. //输出结果
    17. System.out.println(sb.toString());
  • 缓存输出流

    1. File file = new File("e:/2.mp4");
    2. File distFile = new File("b.mp4");
    3. InputStream in = new FileInputStream(file);
    4. //使用缓存流,减少io的次数
    5. BufferedInputStream bis = new BufferedInputStream(in);
    6. //创建输出流
    7. OutputStream os = new FileOutputStream(distFile);
    8. BufferedOutputStream bos = new BufferedOutputStream(os);
    9. byte[] buffer = new byte[1024];
    10. //获取每次堆区数据的长度
    11. int len;
    12. while( (len=bis.read(buffer))!=-1){
    13. bos.write(buffer,0,len);//输出到缓存中
    14. }
    15. bos.flush();//确保缓存流中的数据输出到文件中
    16. bos.close();
    17. os.close();
    18. //读取数据完毕
    19. bis.close();
    20. in.close();
    21. System.out.println("复制完毕");

    字符流

  • 是为了简化对字符串的操作,字符流只能对字符串进行操作,不可以对文件进行操作

    • Reader:读取字符到内存中
    • Writer:从内存中输出字符
  • 字符读取流的使用

    • 基本使用

      1. File file = new File("a.txt");
      2. Reader reader = new FileReader(file);
      3. //创建缓存流
      4. BufferedReader br= new BufferedReader(reader);
      5. StringBuilder sb = new StringBuilder();
      6. String line;
      7. while( (line=br.readLine())!=null){
      8. sb.append(line +"\n");
      9. }
      10. System.out.println(sb.toString());
    • 缓存流的使用(BufferedReader)

      1. File file = new File("a.txt");
      2. Reader reader = new FileReader(file);
      3. //创建缓存流
      4. char[] ch = new char[1024];
      5. StringBuilder sb = new StringBuilder();
      6. int len;
      7. while((len =reader.read(ch))>0){
      8. sb.append(new String(ch,0,len));
      9. }
      10. System.out.println(sb.toString());
  • 字符在输出的时候,可以使用打印流(PrintWriter)

    1. File file = new File("b.txt");
    2. PrintWriter printWriter = new PrintWriter(file);
    3. printWriter.println("第一行数据");
    4. printWriter.print("1,小明;");
    5. printWriter.print("2,小黑;");
    6. printWriter.close();

    文件流

  • 可以直接将对象输出到文件中

    • 创建一个对象,必须要实现序列化

      1. public class UserEntity implements Serializable {
      2. String name;
      3. String password;
      4. }
    • 实现对象的输出

      1. UserEntity userEntity = new UserEntity("小明","123");
      2. File file = new File("d:/user.dat");
      3. //文件输出流
      4. OutputStream os = new FileOutputStream(file);
      5. //对象输出流
      6. ObjectOutputStream oos = new ObjectOutputStream(os);
      7. //输出对象
      8. oos.writeObject(userEntity);
      9. oos.flush();//清除缓存流
      10. //关闭流
      11. oos.close();
      12. os.close();
      13. System.out.println("对象保存到文件中");
  • 也可以从文件中读取对象

    1. File file = new File("d:/user.dat");
    2. //根据文件创建输入流
    3. InputStream is = new FileInputStream(file);
    4. //创建对象输入流
    5. ObjectInputStream ois = new ObjectInputStream(is);
    6. //读取对象
    7. UserEntity userEntity = (UserEntity) ois.readObject();
    8. System.out.println(userEntity.getName()+":"+userEntity.getPassword());
  • 什么是序列化?

    • 对象在内存中存储的数据不一定是连续,这样在传递的数据(脱离内存)的时候并不方便
    • 需要将内存的数据进行压缩排序,一次性发送
    • 有序列化就会有反序列化
      • 由于序列化的对象只存储数据,可能会在反序列化的时候出现混淆的问题
      • 这个时候可以使用serialVersionUID 为每个不同的类进行标识

public static final long serialVersionUID = 3121231L;

  • 可以通过idea设置自动生成序列化的UIDimage-20220518145652476.png

    Properties

  • 主要用于java的配置文件的设置
  • 可以在java工程创建创建后缀名称为properties的文件
    • 在文件中以key=value的形式存储内容

name=小王

  • 在代码中通过Properties对象读取数据

    1. //创建一个Properties
    2. Properties ps = new Properties();
    3. //加载properties文件
    4. //从src目录下获取
    5. InputStream in = TestProperties.class.getClassLoader().getResourceAsStream("com/java2022/io/ps/my.properties");
    6. //可以从当前类所在的包下打开一个文件的io流
    7. //InputStream in = TestProperties.class.getResourceAsStream("my.properties");
    8. /*
    9. File file = new File("my.properties");
    10. InputStream in = new FileInputStream(file);*/
    11. ps.load(in);
    12. //加载完毕之后直接可以key获取值
    13. String name = ps.getProperty("name");
    14. System.out.println("名称:"+name);