File类和字节流

1.File类

1.1File类介绍

  1. 它是文件和目录路径名的抽象表示
  2. 文件和目录是可以通过File封装成对象的
  3. 对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。它可以是存在的,也可以 是不存在的。将来是要通过具体的操作把这个路径的内容转换为具体存在的

1.2File类的构造方法

方法名

说明

File(String pathname)

通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例

File(String parent, String child)

从父路径名字符串和子路径名字符串创建新的 File实例

File(File parent, String child)

从父抽象路径名和子路径名字符串创建新的 File实例

示例代码:

public class FileDemo1 {
    public static void main(String[] args) {
        //File(String pathname):通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
        File f1 = new File("E:\\demo\\java.txt");
        System.out.println(f1);
        
        //File(String parent, String child):从父路径名字符串和子路径名字符串创建新的 File实例。
        File f2 = new File("E:\\demo","java.txt");
        System.out.println(f2);
        
        //File(File parent, String child):从父抽象路径名和子路径名字符串创建新的 File实例。
        File f3 = new File("E:\\demo");
        File f4 = new File(f3,"java.txt");
        System.out.println(f4);
    }
}

 1.3File类创建功能

方法名

说明

public boolean createNewFile()

当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空 文件

public boolean mkdir()

创建由此抽象路径名命名的目录

public boolean mkdirs()

创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录

 示例代码:

public class FileDemo2 {
    public static void main(String[] args) throws IOException {
    //需求1:我要在E:\\demot目录下创建一个文件java.txt
    File f1 = new File("E:\\demo\\java.txt");
    System.out.println(f1.createNewFile());
    System.out.println("--------");
    //需求2:我要在E:\\demo目录下创建一个目录JavaSE
    File f2 = new File("E:\\demo\\JavaSE");
    System.out.println(f2.mkdir());
    System.out.println("--------");
    //需求3:我要在E:\\demo目录下创建一个多级目录JavaWEB\\HTML
    File f3 = new File("E:\\demo\\JavaWEB\\HTML");
//        System.out.println(f3.mkdir());
    System.out.println(f3.mkdirs());
    System.out.println("--------");
    //需求4:我要在E:\\demo目录下创建一个文件javase.txt
    File f4 = new File("E:\\demo\\javase.txt");
//        System.out.println(f4.mkdir());
    System.out.println(f4.createNewFile());
}}

1.4File类判断和获取功能

  1. 判断方法

方法名

说明

public boolean isDirectory()

测试此抽象路径名表示的File是否为目录

public boolean isFile()

测试此抽象路径名表示的File是否为文件

public boolean exists()

测试此抽象路径名表示的File是否存在 

        2. 获取功能 

方法名

说明

public String getAbsolutePath()

返回此抽象路径名的绝对路径名字符串

public String getPath()

将此抽象路径名转换为路径名字符串

public String getName()

返回由此抽象路径名表示的文件或目录的名称

public String[] list()

返回此抽象路径名表示的目录中的文件和目录的名称字符串数组

public File[] listFiles()

返回此抽象路径名表示的目录中的文件和目录的File对象数组 

示例代码:

public class FileDemo04 {
    public static void main(String[] args) throws IOException {
        //创建一个File对象
//        File f1 = new File("demo_file\\java.txt");
//        System.out.println(f1.createNewFile());
        File f = new File("demo_file\\java.txt");
//        public boolean isDirectory():测试此抽象路径名表示的File是否为目录
//        public boolean isFile():测试此抽象路径名表示的File是否为文件
//        public boolean exists():测试此抽象路径名表示的File是否存在
        System.out.println(f.isDirectory());
        System.out.println(f.isFile());
        System.out.println(f.exists());
//        public String getAbsolutePath():返回此抽象路径名的绝对路径名字符串
//        public String getPath():将此抽象路径名转换为路径名字符串
//        public String getName():返回由此抽象路径名表示的文件或目录的名称
        System.out.println(f.getAbsolutePath());
        System.out.println(f.getPath());
        System.out.println(f.getName());
        System.out.println("--------");
//        public String[] list():返回此抽象路径名表示的目录中的文件和目录的名称字符串数组
//        public File[] listFiles():返回此抽象路径名表示的目录中的文件和目录的File对象数组
        File f2 = new File("E:\\demo");
        String[] strArray = f2.list();
        for(String str : strArray) {
            System.out.println(str);
        }
        System.out.println("--------");
        File[] fileArray = f2.listFiles();
        for(File file : fileArray) {
//            System.out.println(file);
//            System.out.println(file.getName());
            if(file.isFile()) {
                System.out.println(file.getName());
            }
        }
    }
}

 1.5File类删除功能

方法名

说明

public boolean delete()

删除由此抽象路径名表示的文件或目录

 示例代码:

public class FileDemo03 {
    public static void main(String[] args) throws IOException {
//        File f1 = new File("E:\\demo\\java.txt");
        //需求1:在当前模块目录下创建java.txt文件
        File f1 = new File("demo_file\\java.txt");
       System.out.println(f1.createNewFile());
        //需求2:删除当前模块目录下的java.txt文件
        System.out.println(f1.delete());
        System.out.println("--------");
        //需求3:在当前模块目录下创建demo目录
        File f2 = new File("demo_file\\demo");
//        System.out.println(f2.mkdir());
        //需求4:删除当前模块目录下的itcast目录
        System.out.println(f2.delete());
        System.out.println("--------");
        //需求5:在当前模块下创建一个目录demo,然后在该目录下创建一个文件java.txt
        File f3 = new File("demo_file\\demo");
//        System.out.println(f3.mkdir());
        File f4 = new File("demo_file\\demo\\java.txt");
//        System.out.println(f4.createNewFile());
        //需求6:删除当前模块下的目录itcast
        System.out.println(f4.delete());
        System.out.println(f3.delete());
    }
}

1.6相对路径与绝对路径

  1. 绝对路径:完整的路径名,不需要任何其他信息就可以定位它所表示的文件。例如:E:\demo\java.txt
  2. 相对路径:必须使用取自其他路径名的信息进行解释。例如:myFile\java.txt 

2.字节流

2.1IO流介绍

2.1.1IO流概念

  1. IO:输入/输出(Input/Output)
  2. 流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输
  3. IO流就是用来处理设备间数据传输问题的。常见的应用:文件复制;文件上传;文件下载

2.1.2IO流的分类

  1. 按照数据的流向
    1. 输入流:读数据
    2. 输出流:写数据
  2. 按照数据类型来分
    1. 字节流
      1. 字节输入流
      2. 字节输出流
    2. 字符流
      1. 字符输入流
      2. 字符输出流

2.1.3IO流的使用场景(重要)

  1. 如果操作的是纯文本文件,优先使用字符流
  2. 如果操作的是图片、视频、音频等二进制文件。
  3. 优先使用字节流 如果不确定文件类型,优先使用字节流。字节流是万能的流

2.2字节流写数据

  1. 字节流抽象基类
    1. InputStream:这个抽象类是表示字节输入流的所有类的超类
    2. OutputStream:这个抽象类是表示字节输出流的所有类的超类
    3. 子类名特点:子类名称都是以其父类名作为子类名的后缀
  2. 字节输出流
    1. FileOutputStream(String name):创建文件输出流以指定的名称写入文件
  3. 使用字节输出流写数据的步骤
    1. 创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)
    2. 调用字节输出流对象的写数据方法
    3. 释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源)
  4. 示例代码
    public class FileOutputStreamDemo01 {
        public static void main(String[] args) throws IOException {
            //创建字节输出流对象
            //FileOutputStream​(String name):创建文件输出流以指定的名称写入文件
            FileOutputStream fos = new FileOutputStream("demo_file\\fos.txt");
            /*
                做了三件事情:
                    A:调用系统功能创建了文件
                    B:创建了字节输出流对象
                    C:让字节输出流对象指向创建好的文件
             */
            //void write​(int b):将指定的字节写入此文件输出流
            fos.write(97);
    //        fos.write(57);
    //        fos.write(55);
            //最后都要释放资源
            //void close​():关闭此文件输出流并释放与此流相关联的任何系统资源。
            fos.close();
        }
    }
    
    

2.3字节流写数据的两个小问题

  1. 字节流写数据如何实现换行
    1. windows:\r\n
    2. linux:\n
    3. mac:\r
  2. 字节流写数据如何实现追加写入
    1. public FileOutputStream(String name,boolean append)
    2. 创建文件输出流以指定的名称写入文件。如果第二个参数为true ,则字节将写入文件的末尾而不是开头

示例代码

public class FileOutputStreamDemo03 {
    public static void main(String[] args) throws IOException {
        //创建字节输出流对象
        //append实现追加内容
        FileOutputStream fos = new FileOutputStream("demo_file\\fos.txt",true);
        //写数据
        for (int i = 0; i < 10; i++) {
            fos.write("hello".getBytes());
            //实现换行
            fos.write("\r\n".getBytes());
        }
        //释放资源
        fos.close();
    }
}

2.4字节流写数据加异常处理

1.异常处理格式

//被finally控制的语句一定会执行,除非JVM退出
try{ 
    可能出现异常的代码; 
}catch(异常类名 变量名){
   异常的处理代码;
}finally{
   执行所有清除操作;
} 

2.示例代码

public class FileOutputStreamDemo04 {
    public static void main(String[] args) {
        //加入finally来实现释放资源
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream("demo_file\\fos.txt");
            fos.write("hello".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

2.5字节流读数据(一次读一个字节数据)

  1. 字节输入流
    1. FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream ,该文件由文 件系统中的路径名name命名
  2. 字节输入流读取数据的步骤
    1. 创建字节输入流对象
    2. 调用字节输入流对象的读数据方法
    3. 释放资源
  3. 示例代码
    public class FileInputStreamDemo01 {
        public static void main(String[] args) throws IOException {
            //创建字节输入流对象
            //FileInputStream(String name)
            FileInputStream fis = new FileInputStream("myByteStream\\fos.txt");
            //调用字节输入流对象的读数据方法
            //int read():从该输入流读取一个字节的数据
           
            int by;
            /*
                fis.read():读数据
                by=fis.read():把读取到的数据赋值给by
                by != -1:判断读取到的数据是否是-1
             */
            while ((by=fis.read())!=-1) {
                System.out.print((char)by);
            }
    
            //释放资源
            fis.close();
        }
    }
    
    

2.6 字节流读数据(一次读一个字节数组数据)

  1. 一次读一个字节数组的方法
    1. public int read(byte[] b):从输入流读取最多b.length个字节的数据
    2. 返回的是读入缓冲区的总字节数,也就是实际的读取字节个数
  2. 示例代码
    public class FileInputStreamDemo02 {
        public static void main(String[] args) throws IOException {
            //创建字节输入流对象
            FileInputStream fis = new FileInputStream("demo_file\\fos.txt");
            //调用字节输入流对象的读数据方法
            //int read​(byte[] b):从该输入流读取最多 b.length个字节的数据到一个字节数组
            /*
                hello\r\n
                world\r\n
                第一次:hello
                第二次:\r\nwor
                第三次:ld\r\nr
             */
            byte[] bys = new byte[1024]; //1024及其整数倍
            int len;
            while ((len=fis.read(bys))!=-1) {
                System.out.print(new String(bys,0,len));
            }
            //释放资源
            fis.close();
        }
    }
    
    

2.7案例(复制图片) 

  1. 案例需求
    1. 把“E:\demo\mn.jpg”复制到模块目录下的“mn.jpg”
  2. 实现步骤
    1. 根据数据源创建字节输入流对象 根据目的地创建字节输出流对象
    2. 读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)
    3. 释放资源
  3. 代码实现
    public class CopyJpgDemo {
        public static void main(String[] args) throws IOException {
            //根据数据源创建字节输入流对象
            FileInputStream fis = new FileInputStream("E:\\demo\\mn.jpg");
            //根据目的地创建字节输出流对象
            FileOutputStream fos = new FileOutputStream("demo_file\\mn.jpg");
            //读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)
            byte[] bys = new byte[1024];
            int len;
            while ((len=fis.read(bys))!=-1) {
                fos.write(bys,0,len);
            }
            //释放资源
            fos.close();
            fis.close();
        }
    }
    
    


版权声明:本文为weixin_45060598原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。