【Java高级】IO流概述

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

目录

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 printSubFil
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值