跳转至

JavaIO流01

1.文件基础知识

什么是文件?

文件,我们并不陌生。文件是保存数据的地方。比如大家经常使用的word文档,txt文件,excel文件等,都是文件。它既可以保存一张图片,也可以保存声音、视频……

  • 文件流

文件在程序中是以流的形式来操作的:

image-20220908232444746

流:数据在数据源(文件)和程序(内存)之间经历的路径

输入流:数据从数据源(文件)到程序(内存)之间的路径

输出流:数据从程序(内存)到数据源(文件)之间的路径

2.常用的文件操作(File类)

2.1创建文件

  • 创建文件对象相关构造器和方法

相关方法:

new File(String pathname)//根据路径构建一个File对象
new File(File patent,String child)//根据父目录文件+子路径构建
 new File(String parent,String child)//根据父目录+子路径构建

例子:应用案例演示:FileCreate

package li.io.file;

import org.junit.jupiter.api.Test;
import java.io.File;
import java.io.IOException;

//演示创建文件
public class FileCreate {
    public static void main(String[] args) {

    }

    //方式一 new File(String pathname)//根据路径构建一个File对象
    @Test
    public void creat01() {
        String filePath = "d:\\news1.txt";
        File file = new File(filePath);//在内存中创建一个File对象
        try {
            file.createNewFile();//创建文件
            System.out.println("文件创建成功");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //方式二 new File(File patent,String child)//根据父目录文件+子路径构建
    //例如:d:\\news.txt,父目录文件就是 d:\\
    @Test
    public void creat02() {
        File parenFile = new File("d:\\");
        String fileName = "news2.txt";
        //这里的file对象,在java程序中只是一个java对象而已
        //只有执行了createNewFile方法,才会真正地在磁盘创建文件
        File file = new File(parenFile, fileName);
        try {
            file.createNewFile();//创建文件
            System.out.println("创建成功~");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    //方式三 new File(String parent,String child)//根据父目录+子路径构建
    @Test
    public void creat03() {
        String parentPath = "d:\\";  //这里的两个 \\,其中有一个是转义符号,或者直接用 d:/
        String filePath = "news3.txt";
        File file = new File(parentPath, filePath);
        try {
            file.createNewFile();
            System.out.println("创建文件成功");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

image-20220909154552484

2.2获取文件的相关信息

方法名称 说明
boolean canRead() 测试应用程序是否能从指定的文件中进行读取
boolean canWrite() 测试应用程序是否能写当前文件
boolean delete() 删除当前对象指定的文件
boolean exists() 测试当前 File 是否存在
String getAbsolutePath() 返回由该对象表示的文件的绝对路径名
String getName() 返回表示当前对象的文件名或路径名(如果是路径,则返回最后一级子路径名)
String getParent() 返回当前 File 对象所对应目录(最后一级子目录)的父目录名
boolean isAbsolute() 测试当前 File 对象表示的文件是否为一个绝对路径名。该方法消除了不同平台的差异,可以直接判断 file 对象是否为绝对路径。在 UNIX/Linux/BSD 等系统上,如果路径名开头是一条斜线/,则表明该 File 对象对应一个绝对路径;在 Windows 等系统上,如果路径开头是盘符,则说明它是一个绝对路径。
boolean isDirectory() 测试当前 File 对象表示的文件是否为一个路径
boolean isFile() 测试当前 File 对象表示的文件是否为一个“普通”文件
long lastModified() 返回当前 File 对象表示的文件最后修改的时间
long length() 返回当前 File 对象表示的文件长度
String[] list() 返回当前 File 对象指定的路径文件列表
String[] list(FilenameFilter) 返回当前 File 对象指定的目录中满足指定过滤器的文件列表
boolean mkdir() 创建一个目录,它的路径名由当前 File 对象指定
boolean mkdirs() 创建一个目录,它的路径名由当前 File 对象指定
boolean renameTo(File) 将当前 File 对象指定的文件更名为给定参数 File 指定的路径名

例子:

package li.io.file;

import org.junit.jupiter.api.Test;

import java.io.File;

public class FileInformation {
    public static void main(String[] args) {

    }

    //获取文件的信息
    @Test
    public void info() {
        //先创建文件对象
        File file = new File("d:\\news1.txt");

        //调用相应方法,得到对应信息

        //文件名字-getName()
        System.out.println("文件名字="+file.getName());//文件名字=news1.txt

        //文件的绝对路径-getAbsolutePath()
        System.out.println("文件的绝对路径="+file.getAbsolutePath());//文件的绝对路径=d:\news1.txt

        //文件的父级目录-getParentFile()
        System.out.println("文件的父级目录="+file.getParentFile());//文件的父级目录=d:\

        //文件的大小(字节)-length()
        System.out.println("文件的大小(字节)="+file.length());//文件的大小(字节)=12 Hello World!

        //文件是否存在-exists()
        System.out.println("文件是否存在="+file.exists());//文件是否存在=true

        //是否为文件-isFile()
        System.out.println("是否为文件="+file.isFile());//是否为文件=true

        //是否为目录-isDirectory()
        System.out.println("是否为目录="+file.isDirectory());//是否为目录=false

    }
}

2.3目录的操作和文件删除

  • mkdir():创建一级目录

  • mkdirs():创建多级目录

  • delete():删除空目录或者文件

例子:

package li.io.file;

import org.junit.jupiter.api.Test;

import java.io.File;

public class Directory_ {
    public static void main(String[] args) {

    }

    //判断 d:\\news1.txt是否存在,如果存在就删除
    @Test
    public void m1() {
        String filePath = "d:\\news1.txt";
        File file = new File(filePath);
        if (file.exists()) {
            if (file.delete()) {
                System.out.println(filePath + "删除成功");
            } else {
                System.out.println("删除失败...");
            }
        } else {
            System.out.println("该文件不存在...");
        }
    }

    //判断 d:\\demo02 是否存在,存在就删除,否则就提示不存在
    //这里我们需要体会到,在java中,目录也被当做文件
    @Test
    public void m2() {
        String filePath = "d:\\demo02";
        File file = new File(filePath);
        if (file.exists()) {
            if (file.delete()) {
                System.out.println(filePath + "删除成功");//d:\demo02删除成功(先在d盘下创建一个名为 demo02的目录)
            } else {
                System.out.println("删除失败...");
            }
        } else {
            System.out.println("该目录不存在...");
        }
    }

    //判断d:\\demo\\a\\b\\c目录是否存在,如果存在就提示已经存在,否则创建
    @Test
    public void m3() {
        String directoryPath = "d:\\demo\\a\\b\\c";
        File file = new File(directoryPath);
        if (file.exists()) {
            System.out.println("该目录已经存在");
        } else {
            if (file.mkdirs()) {//多级目录使用 mkdirs方法,一级目录使用 mkdir
                System.out.println(directoryPath + "创建成功...");
            } else {
                System.out.println("创建失败...");
            }
        }
    }
}

3.IO流原理及流的分类

3.1Java IO流原理

  1. I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理数据传输。如读/写文件,网络通讯等
  2. Java程序中,对于数据的输入/输出操作以”流(Stream)“的方式进行
  3. java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过方法输入或输出数据
  4. 输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中
  5. 输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中

3.2流的分类

  • 按操作数据单位不同分为:字节流(8bit)、字符流(按字符)

字节流适用于二进制文件,字符流适用于文本文件

  • 按数据流的流向不同分为:输入流、输出流

  • 按流的角色不同分为:节点流、处理流(也叫包装流)

抽象基类 字节流 字符流
输入流 InputStream Reader
输出流 OutputStream Writer

202209091740

1)Java的IO流共涉及到40 多个类,实际上非常规则,都是从如上4个抽象基类派生的

InputStream、OutputStream、Reader、Writer都是抽象类,在使用的时候要去创建它们的实现子类

2)由这四个类派生出来的子类名称都是以其父类名作为子类名后缀