【Java高级】IO流概述

本文详细介绍了Java中的File类使用,包括创建实例、常用方法、文件操作等。接着探讨了IO流的原理、分类和体系,讲解了节点流(如FileReader/FileWriter、FileInputStream/FileOutputStream)在处理文本和非文本文件的应用。缓冲流的使用提高了数据读写效率,而转换流则实现了字节流与字符流之间的转换。此外,文章还涵盖了标准输入输出流、打印流、数据流、对象流(序列化与反序列化)的概念和操作,以及NIO.2中的Path、Paths、Files类的使用,帮助开发者全面理解Java IO操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

01 File类的使用

1.1 创建File实例

1.2 File类的常用方法

1.2.1 File类的获取功能

1.2.2 重命名功能  

1.2.3 File类的判断功能

1.2.4 File类文件删除和创建功能

1.3 课后练习

02 IO流原理及流的分类

2.1 Java IO原理

2.2 流的分类

2.3 IO流体系

03 节点流(文件流)

3.1 FileReader 和 FileWriter(char[] 处理文本文件)

3.1.1  FileReader中使用read(char[] cbuf)读入数据

3.1.2 FileWriter写出数据的操作

 3.1.3 使用FileReader和FileWriter实现文本文件的复制

3.2 FileInputStream 和FileOutputStream(byte[] 处理非文本文件)

 3.2.1 处理非文本文件会有乱码

3.2.2 读写非文本文件(.doc\.jpg\.mp3)

3.2.3 实现指定路径下文件的复制

04 缓冲流

4.1 缓冲流实现非文本文件的复制

4.2 缓冲流(字符型)实现文本文件的复制

4.3 缓冲流练习

05 转换流

5.1 转换流概述

5.2 转换流实现文件的读入和写出

5.3 补充: 字符编码

5.3.1 常见编码

5.3.2 unicode转换 

06 标准输入输出流

 07 打印流

08 数据流

09 对象流(掌握)

9.1 对象流序列化和反序列化操作

 9.1.1 对象的序列化

 9.1.2 对象的反序列化

 9.2 自定义类实现序列化与反序列化操作

 9.3 全局常量serialVersionUID的理解

 10 NIO.2中Path、Paths、Files类的使用


01 File类的使用

  • java .io.File 类: 文件 和文件目录路径 的抽象表示形式 ,与平台无关
  • File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。
  • 如果需要访问文件内容本身,则需要使用输入输出 流
  • 想 要在 Java 程序中表示一个真实存在的文件或目录,那么必须有一个 File 对象 ,但是 Java 程序中的一个 File 对象,可能没有一个真实存在的文件或目录 。
  • File 对象可以作为参数传递给流的构造器

1.1 创建File实例

1如何实例化File实例: 调用构造器
File(String filePath)
File(String parentPath,String childPath)
File(File parentFile,String childPath)
@Test
    public void test1(){
        // 构造器1  File(String filePath)
        File file = new File("hello.txt"); //相对于当前modul
        File file1 = new File("G:\\Java_study\\Java_Gaoji\\IOStream\\he.txt");// 决对路径

        System.out.println(file);
        System.out.println(file1); // 内存层面的对象

        // 构造器2  File(String parentPath,String childPath)
        File file2 = new File("\"G:\\\\Java_study","Java_Gaoji");
        System.out.println(file2);

        // 构造器3 File(File parentFile, String childPath)
        File file3 = new File(file2,"hi.txt");
        System.out.println(file3);


    }

注意:路径分隔符

  •       windows:\\
  •       unix:/

     Java程序支持跨平台运行,因此路径分隔符要慎用。

  •      为了解决这个隐患,File类提供了一个常量:

        public  static final String separator
        根据操作系统,动态的提供分隔符。

   File file1= new File("d:\\Work\\info.txt");
      File file2= new File("d:"+ File.separator+ "Work"+ File.separator+ "info.txt");
      File file3= new File("d:/Work");

1.2 File类的常用方法

1.2.1 File类的获取功能

  1.  public String getAbsolutePath():获取绝对路径
  2.  public String getPath() :获取路径
  3. public String getName() :获取名称
  4. public String getParent():获取上层文件目录路径。若无,返回null
  5.  public long length() :获取文件长度(即:字节数)。不能获取目录的长度。
  6. public long lastModified() :获取最后一次的修改时间,毫秒值
@Test
    // File类的常用方法,获取功能
    public void test2(){

        File file = new File("hello.txt");
        File file1 = new File("G:\\Java_study\\Java_Gaoji\\IOStream\\he.txt");

        System.out.println(file.getAbsoluteFile());// G:\Java_study\Java_Gaoji\IOStream\hello.txt
        System.out.println(file.getPath());//hello.txt
        System.out.println(file.getName());//hello.txt
        System.out.println(file.getParent());//null
        System.out.println(file.length()); //未定义时: 0 、有文件时:输出文件长度
        System.out.println(file.lastModified());//0 、 1646169028263

        System.out.println();

        System.out.println(file1.getAbsoluteFile());//G:\Java_study\Java_Gaoji\IOStream\he.txt
        System.out.println(file1.getPath());// G:\Java_study\Java_Gaoji\IOStream\he.txt
        System.out.println(file1.getName());//he.txt
        System.out.println(file1.getParent());//G:\Java_study\Java_Gaoji\IOStream
        System.out.println(file1.length()); //0
        System.out.println(file1.lastModified());//0


    }

     如下的两个方法适用于文件目录:
     public String[] list() :获取指定目录下的所有文件或者文件目录的名称数组
     public File[] listFiles() :获取指定目录下的所有文件或者文件目录的File数组

@Test
    // File类的常用方法
    public void test3(){
        File file = new File("G:\\Java_study"); // 要求文件存在!!!
        String[] list = file.list(); //获取指定目录下的所有文件或文件目录的名称数组
        for(String s : list){
            System.out.println(s);
        }

        File[] list2 =  file.listFiles();
        for(File f : list2){
            System.out.println(f);
        }
    }

1.2.2 重命名功能  

public boolean renameTo(File dest):把文件重命名为指定的文件路径
       比如:file1.renameTo(file2)为例:
           要想保证返回true,需要file1在硬盘中是存在的,且file2不能在硬盘中存在

public void test4(){
        File file = new File("hello.txt");
        File file2 = new File("G:\\Java_study\\Java_Gaoji\\IOStream\\he.txt");

        boolean rename = file.renameTo(file2); //想要返回true,要保证file必须存在,且file2不存在
        System.out.println(rename); //返回的是布尔型变量
    }

1.2.3 File类的判断功能

  1. public boolean isDirectory():判断是否是文件目录
  2. public boolean isFile() :判断是否是文件
  3. public boolean exists() :判断是否存在
  4. public boolean canRead() :判断是否可读
  5. public boolean canWrite() :判断是否可写
  6. public boolean isHidden() :判断是否隐藏
@Test
    public void test5(){
        File file = new File("he.txt"); //一个文件,相对路径,四那个对于当前Module
        System.out.println(file.isFile());  //判断是不是文件 true
        System.out.println(file.isDirectory());//判断是不是文件夹 false
        System.out.println(file.exists());//判断是不是存在 true
        System.out.println(file.canRead());//判断是不是可读 true
        System.out.println(file.canWrite());//判断是不是可写 true
        System.out.println(file.isHidden());//判断是不是隐藏 false
    }

1.2.4 File类文件删除和创建功能

 创建硬盘中对应的文件
     public boolean createNewFile() :创建文件。若文件存在,则不创建,返回false
 删除磁盘中的文件或文件目录
     public boolean delete():删除文件或者文件夹
     *    删除注意事项:Java中的删除不走回收站。要想删除成功,该文件目录下不能有子文件或文件目录

  // File类的文件创建和删除功能
    @Test
    public void test6() throws IOException {
        File file = new File("hi.txt"); //目前不存在
        if (!file.exists()){
            file.createNewFile();
            System.out.println("创建成功");
        }else { //文件存在
            file.delete();
            System.out.println("删除成功");
        }
    }

创建硬盘中的文件夹

public boolean mkdir() :创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
public boolean mkdirs() :创建文件目录。如果此文件目录存在,就不创建了。如果上层文件目录不存在,一并创建 

@Test
    // 文件夹的创建
    // file.mkdir(): 当file文件上层目录不存在时,就不创建
    //file.mkdirs(): 当file文件上层目录不存在时,会连同上层目录一并创建
    public void test7(){
        File file = new File("G:\\Java_study\\Java_Gaoji\\IOStream\\IO1"); // IO1上层存在
        boolean mkdir = file.mkdir();
        if(mkdir == true){
            System.out.println("创建成功");
        }
        File file2 = new File("G:\\Java_study\\Java_Gaoji\\IOStream\\IO2");
        boolean mkdir2 = file2.mkdirs();
        if(mkdir2){
            System.out.println("创建成功2");
        }
   //要想删除成功,io4文件目录下不能有子目录或文件
        File file3 = new File("D:\\io\\io1\\io4");
        file3 = new File("D:\\io\\io1");
        System.out.println(file3.delete());
    }
}

1.3 课后练习

public class FileTest {
    @Test
    public void test() throws IOException {
        File file = new File("D:\\io\\io1\\hello.txt");
        //创建一个与file同目录下的另外一个文件,文件名为:hi.txt
        File destFile = new File(file.getParent(),"i.txt");
        boolean newFile = destFile.createNewFile();
        if(newFile){
            System.out.println("创建成功!");
        }
    }
}

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
//判断 指定目录下是否有后缀名为 .jpg 的文件,如果有,就输出该文件 名称

public class FileCondtructor {
    public static void main(String[] args) throws IOException {
        File file = new File("G:\\Java_study\\Java_Gaoji\\IOStream");//确定指定文件目录
        //方式一
        String[] list = file.list();
        for (String s: list){
            if(s.endsWith(".jpg")){
                System.out.println(s);
            }
        }

        // 方法二
        File[] files = file.listFiles();
        for(File f:files){
            if(f.getName().endsWith(".jpg")){
                System.out.println(f.getAbsolutePath());
            }
        }

        // 方法三
        /**
         * File类提供了两个文件过滤器方法
         * public String[] list(FilenameFilter filter)
         * public File[] listFiles(FileFilter filter)
         */
        File[] subFiles = file.listFiles(new FilenameFilter() {

            @Override
            public boolean accept(File dir, String name) {
                return name.endsWith(".jpg");
            }
        });

        for(File f : subFiles){
            System.out.println(f.getAbsolutePath());
        }
    }

    }

public class fILE {
    public static void main(String[] args) {
        File file = new File("G:\\Java_study\\Java_Gaoji\\IOStream");
        printSubFile(file);
        System.out.println(getFileLength(file));
    }

    public static void printSubFi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值