Java---IO流讲解(1)

发布时间:2023年12月24日


1. File类

1.1 File类概述和构造方法

?1. File:它是文件和目录路径名的抽象表示,文件和目录是可以通过File封装成对象的。

?2. 构造方法:

方法名说明
File pathname通过将给定的路径名字符串转换为抽象路径名来创建新的File实例
File(String parent, String child)从父路径名字符串和子路径名字符串创建新的File实例
File(File parent, String child)从父抽象路径名和子抽象路径名字符串来创建新的File实例
import java.io.File;

public class Demo {
    public static void main(String[] args) {
        File f1 = new File("D:\\123\\java.txt");
        System.out.println(f1); //D:\123\java.txt

        File f2 = new File("D:\\123","java.txt");
        System.out.println(f2); //D:\123\java.txt

        File f3 = new File("D:\\123");
        File f4 = new File(f3,"java.txt");
        System.out.println(f4); //D:\123\java.txt
    }
}

1.2 File类创建功能

方法名说明
public boolean createNewFile()当具有该名称的文件不存在时,创建一个由该抽象路径命名的新空文件
public boolean mkdir()创建由此抽象路径名命名的目录
public boolean mkdirs()创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录
public class Demo {
    public static void main(String[] args) throws IOException {
        File f1 = new File("D:\\123\\java.txt");
        f1.createNewFile();

        File f2 = new File("D:\\123\\java");
        f2.mkdir();

        File f3 = new File("D:\\123\\java1\\java2");
        f3.mkdirs();
    }
}

在这里插入图片描述

1.3 File类删除功能

方法名说明
public boolean delete()删除由此抽象路径名表示的文件或目录
public class Demo {
    public static void main(String[] args) throws IOException {
        File f1 = new File("D:\\123\\java.txt");
        f1.createNewFile();

        File f2 = new File("D:\\123\\java");
        f2.mkdir();

        File f3 = new File("D:\\123\\java1\\java2");
        f3.mkdirs();

        f1.delete();
    }
}

在这里插入图片描述

2. IO流

2.1 IO流概述

?1. IO:输入和输出(Input/Output)。

?2. 流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输成为流,流的本质是数据传输。

?3. IO流就是用来处理设备间传输问题的。常见的应用:文件复制、文件传输、文件下载。

在这里插入图片描述

2.2 分类

?1. 按照数据的流向:(1) 输入流:读数据。 (2) 输出流:写数据。

?2. 按照数据类型来分:(1) 字节流。 (2) 字符流。
?简单来说:如果数据在记事本上打开,我们能读懂里面的内容就使用字符流;反之使用字节流。

在这里插入图片描述

3 字节流

3.1 字节流写数据

?1. 字节流抽象类:

  • InputStream:这个抽象类是表示字节输入流的所有类的超类。
  • OutputStream:这个抽象类是表示字节输出流的所有类的超类。
  • 子类名特点:子类名称都是以其父类名作为子类名的后缀。

?2. FileOutputStream:文件输出流用于将数据写入File。步骤:(1) 创建字节输出流对象。 (2) 调用字节输出流对象。 (3) 释放资源。

import java.io.FileOutputStream;
import java.io.IOException;
public class Demo {
    public static void main(String[] args) throws IOException { //文件名注意加引号
        FileOutputStream f=new FileOutputStream("D:\\fos.txt");
        f.write(97);
        f.close();
    }
}

3.2 字节流写数据的3种格式

方法名说明
void write(int b)将指定的字节写入此文件输出流,一次写一个字节数据
void write(byte[] b)将b.length字节从指定的字节数组写入此文件输出流,一次写一个字节数组数据
void write(byte[] b, int off, int len)将len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流,一次写一个字节数组的部分数据
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo {
    public static void main(String[] args) throws IOException { //文件名注意加引号
        FileOutputStream f=new FileOutputStream("D:\\fos.txt");
        f.write(97);

        byte[] bys={98,99,100,101};
        f.write(bys);

        f.write(bys,1,3);
        f.close();
    }
}

在这里插入图片描述

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

?1. 如何实现换行?写完数据后加换行符:f.write("\r\n".getBytes())

?2. 如何实现追加写入?创建文件时加第二个参数:true

import java.io.FileOutputStream;
import java.io.IOException;

public class Demo {
    public static void main(String[] args) throws IOException { //文件名注意加引号
        FileOutputStream f=new FileOutputStream("D:\\fos.txt",true);
        f.write(97);

        byte[] bys={98,99,100,101};
        f.write(bys);

        f.write("\r\n".getBytes());
        f.write(bys,1,3);
        f.close();
    }
}

在这里插入图片描述

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

?在前面展现的一些代码块中都是通过throws IOException完成的,也可以改成try...catch

import java.io.FileOutputStream;
import java.io.IOException;

public class Demo {
    public static void main(String[] args) { //文件名注意加引号
        try {
            FileOutputStream f = new FileOutputStream("D:\\fos.txt", true);
            f.write(97);

            byte[] bys = {98, 99, 100, 101};
            f.write(bys);

            f.write("\r\n".getBytes());
            f.write(bys, 1, 3);
            f.close();
        }catch(IOException e){
            e.printStackTrace();
        }
    }
}

3.5 字节流读数据

?1. FileInputStream:从文件系统中的文件获取输入字节。步骤:(1) 创建字节输入流对象。 (2) 调用字节输入流对象的读数据方法。 (3) 释放资源。

?2. 一次读一个字节数据的代码块:

在这里插入图片描述

import java.io.*;

public class Demo {
    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("D:\\fos.txt");
        //第一次读数据
        int by=fis.read();
        System.out.println(by);//97
        System.out.println((char)by);//a
        //第二次读数据
        by=fis.read();
        System.out.println(by);//98
        System.out.println((char)by);//b
        fis.close();
    }
}

?优化读:

public class Demo {
    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("D:\\fos.txt");
        int by;
        while((by=fis.read())!=-1){
            System.out.print((char)by);
            //不加ln,可以读取到换行
        }
    }
}

在这里插入图片描述
?3. 一次读一个字节数组数据的代码块:
在这里插入图片描述

import java.io.*;

public class Demo {
    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("D:\\fos.txt");
        byte[] bys=new byte[5];
        int len= fis.read(bys);
        System.out.println(len);//5 表示读入的个数
        System.out.println(new String(bys,0,len));

        len= fis.read(bys);
        System.out.println(len);//5 表示读入的个数
        System.out.println(new String(bys,0,len));

        len= fis.read(bys);
        System.out.println(len);//5 表示读入的个数
        System.out.println(new String(bys,0,len));
        //hello\r\n
        //world\r\n
        fis.close();
    }
}

在这里插入图片描述

?优化读:

import java.io.*;

public class Demo {
    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("D:\\fos.txt");
        byte[] bys=new byte[1024];//一般是1024整数倍
        int len;
        while((len= fis.read(bys))!=-1){
            System.out.print(new String(bys,0,len));
        }
        fis.close();
    }
}

在这里插入图片描述

3.6 字节缓冲流

?1. 字节缓冲流是为了提高读取和写入字节的效率,构造方法有两个:

  • 字节缓冲输出流:BufferedOutputStream(OutputStream out)
  • 字节缓冲输入流:BufferedInputStream(InputStream in)

?2. 为什么构造方法需要的是字节流,而不是具体的文件或者路径呢?

  • 字节缓冲流仅仅提供缓冲区,而真正的读写数据还得依靠基本的字节流对象进行操作。
import java.io.*;
public class Demo {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos=new FileOutputStream("D:\\fos.txt");
        BufferedOutputStream bos=new BufferedOutputStream(fos);
        bos.write("hello\r\n".getBytes());
        bos.write("world\r\n".getBytes());
        bos.close();

        FileInputStream fis=new FileInputStream("D:\\fos.txt");
        BufferedInputStream bis=new BufferedInputStream(fis);

        //一次读取一个字节方式
        //int by;
        //while ((by=bis.read())!=-1){
        //    System.out.print((char)by);
        //}
        //bis.close();

        //一次读取一个字节数组方式
        byte[] by=new byte[1024];
        int len;
        while((len=bis.read(by))!=-1){
            System.out.print(new String(by,0,len));
        }
        bis.close();
    }
}

在这里插入图片描述

文章来源:https://blog.csdn.net/m0_62881487/article/details/135160464
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。