Java基础--IO流

本文详细介绍了Java中File类的基本操作,包括创建文件和文件夹、判断文件类型、文件大小、路径获取以及文件删除等。此外,还涵盖了字节流和字符流的使用,如FileInputStream、FileOutputStream、FileReader和FileWriter,以及高级流如BufferedInputStream、BufferedReader、BufferedWriter、PrintStream/PrintWriter、DataOutputStream/DataInputStream和序列化流的使用方法。
摘要由CSDN通过智能技术生成

File

创建File对象(地址:D: \ \ text \ \ abc   ||   D: / text / abc || File.separator(文件路径分隔符))

构造器

                                                说明

public File​(String pathname)

根据文件路径创建文件对象

public File​(String parent, String child)

根据父路径和子路径名字创建文件对象

public File​(File  parent, String child)

根据父路径对应文件对象和子路径名字创建文件对象

File提供的方法

方法名称

                                                        说明

public boolean exists()

判断当前文件对象,对应的文件路径是否存在,存在返回true

public boolean isFile()

判断当前文件对象指代的是否是文件,是文件返回true,反之。

public boolean isDirectory()

判断当前文件对象指代的是否是文件夹,是文件夹返回true,反之。

public String getName()

获取文件的名称(包含后缀)

public long length()

获取文件的大小,返回字节个数

public long lastModified()

获取文件的最后修改时间。

public String getPath()

获取创建文件对象时,使用的路径

public String getAbsolutePath()

获取绝对路径

File创建文件

方法名称

说明

public boolean createNewFile()

创建一个新的空的文件

public boolean mkdir()

只能创建一级文件夹

public boolean mkdirs()

可以创建多级文件夹

File删除文件

方法名称

说明

public boolean delete​()

删除文件、空文件夹

删除文件需要注意什么?

        可以删除文件、空文件夹。

        默认不能删除非空文件夹。

delete方法默认只能删除文件和空文件夹,删除后的文件不会进入回收站

如何删除非空文件夹

File类提供的遍历文件夹的功能

方法名称

说明

public String[] list()

获取当前目录下所有的"一级文件名称"到一个字符串数组中去返回。

public File[] listFiles()

获取当前目录下所有的"一级文件对象"到一个文件对象数组中去返回(重点)

使用listFiles方法时的注意事项:

        当主调是文件,或者路径不存在时,返回null

        当主调是空文件夹时,返回一个长度为0的数组

        当主调是一个有内容的文件夹时,将里面所有一级文件和文件夹的路径放在File数组中返回

        当主调是一个文件夹,且里面有隐藏文件时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件

        当主调是一个文件夹,但是没有权限访问该文件夹时,返回null

利用方法递归进行多级文件搜索

import java.io.File;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;

public class RecursiveFileSearch {

    public static void main(String[] args) {
        String rootDirectory = "path/to/search/from";  // 替换为要搜索的根目录路径
        List<Path> matchingFiles = searchFiles(rootDirectory, ".*\\.txt");  // 示例:搜索所有.txt文件
        for (Path filePath : matchingFiles) {
            System.out.println(filePath);
        }
    }

    public static List<Path> searchFiles(String directoryPath, String regexPattern) {
        File directory = new File(directoryPath);
        if (!directory.exists() || !directory.isDirectory()) {
            throw new IllegalArgumentException("Invalid directory path: " + directoryPath);
        }

        List<Path> matchingFiles = new ArrayList<>();
        searchFilesRecursively(directory.toPath(), regexPattern, matchingFiles);

        return matchingFiles;
    }

    private static void searchFilesRecursively(Path directory, String regexPattern, List<Path> matchingFiles) {
        try (var filesStream = Files.list(directory)) {
            filesStream.forEach(file -> {
                if (file.toFile().isDirectory()) {
                    searchFilesRecursively(file, regexPattern, matchingFiles);
                } else if (file.toFile().isFile() && file.getFileName().toString().matches(regexPattern)) {
                    matchingFiles.add(file);
                }
            });
        } catch (IOException e) {
            System.err.println("An error occurred while searching directory: " + directory);
            e.printStackTrace();
        }
    }
}

IO流

io流基本的四类

        字节输入流:以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流

        字节输出流:以内存为基准,把内存中的数据以字节写出到磁盘文件或者网络中去的流。

        字符输入流:以内存为基准,来自磁盘文件/网络中的数据以字符的形式读入到内存中去的流。

        字符输出流:以内存为基准,把内存中的数据以字符写出到磁盘文件或者网络介质中去的流。

FileInputStream(文件字节输入流)

构造器

                                   说明

   public FileInputStream​(File file)

创建字节输入流管道与源文件接通

   public FileInputStream​(String pathname)

创建字节输入流管道与源文件接通

方法名称

说明

   public int read()

每次读取一个字节返回,如果发现没有数据可读会返回-1.

   public int read(byte[] buffer)

每次用一个字节数组去读取数据,返回字节数组读取了多少个字节

如果发现没有数据可读会返回-1.

import java.io.*;

public class FileInputStreamExample {
    public static void main(String[] args) {
        String filePath = "example.txt";  // 替换为你要读取的文件路径

        try (FileInputStream fis = new FileInputStream(filePath)) {
            // 读取文件字节
            byte[] buffer = new byte[1024];  // 创建一个1024字节的缓冲区
            int bytesRead;
            while ((bytesRead = fis.read(buffer)) != -1) {
                // 处理读取到的字节数据
                // 在这里,我们仅打印字节的十六进制表示
                for (int i = 0; i < bytesRead; i++) {
                    System.out.printf("%02X ", buffer[i]);
                }
                System.out.println();
            }
        } catch (FileNotFoundException e) {
            System.err.println("File not found: " + filePath);
            e.printStackTrace();
        } catch (IOException e) {
            System.err.println("An error occurred while reading the file:");
            e.printStackTrace();
        }
    }
}

文件字节输入流:一次读取完全部字节

方式一:自己定义一个字节数组与被读取的文件大小一样大,然后使用该字节数组,一次读完文件的全部字节

方法名称

                                                 说明

   public int read(byte[] buffer)

每次用一个字节数组去读取,返回字节数组读取了多少个字节

如果发现没有数据可读会返回-1.

方式二Java官方为InputStream提供了如下方法,可以直接把文件的全部字节读取到一个字节数组中返回。

方法名称

                                              说明

public byte[] readAllBytes() throws IOException

直接将当前字节输入流对应的文件对象的字节数据

装到一个字节数组返回

FileOutputStream(文件字节输)

作用:以内存为基准,把内存中的数据以字节的形式写出到文件中去。

构造器

                                说明

public FileOutputStream​(File file)

创建字节输流管道与源文件对象接通

public FileOutputStream​(String filepath)

创建字节输流管道与源文件路径接通

public FileOutputStream​(File fileboolean append)

创建字节输流管道与源文件对象接通,可追加数据

public FileOutputStream​(String filepathboolean append)

创建字节输流管道与源文件路径接通,可追加数据

方法名称

                                        说明

public void write(int a)

写一个字节出去

public void write(byte[] buffer)

写一个字节数组出去

public void write(byte[] buffer , int pos , int len)

写一个字节数组的一部分出去。

public void close() throws IOException

关闭流。

FileReader(文件字符输入流)

作用:以内存为基准,可以把文件中的数据以字符的形式读到内存中去。

构造器

说明

   public FileReader​(File file)

创建字符输入流管道与源文件接通

   public FileReader​(String pathname)

创建字符输入流管道与源文件接通

方法名称

说明

   public int read()

每次读取一个字符返回,如果发现没有数据可读会返回-1.

   public int read(char[] buffer)

每次用一个字符数组去读取数据,返回字符数组读取了多少个字符

如果发现没有数据可读会返回-1.

FileWriter(文件字符)

作用:以内存为基准,把内存中的数据以字符的形式写出到文件中去。

构造器

说明

public FileWriter​(File file)

创建字节输流管道与源文件对象接通

public FileWriter​(String filepath)

创建字节输流管道与源文件路径接通

public FileWriter(File fileboolean append)

创建字节输流管道与源文件对象接通,可追加数据

public FileWriter(String filepathboolean append)

创建字节输流管道与源文件路径接通,可追加数据

方法名称

说明

void write​(int c)

写一个字符

void write​(String str)

写一个字符串

void write​(String str, int off, int len)

写一个字符串的一部分

void write​(char[] cbuf)

写入一个字符数组

void write​(char[] cbuf, int off, int len)

写入字符数组的一部分

字节缓冲流

字节缓冲输入流自带了8KB缓冲池字节缓冲输出流自带了8KB缓冲池

构造器

                                          说明

public BufferedInputStream​(InputStream is)

把低级的字节输入流包装成一个高级的缓冲字节输入流

从而提高读数据的性能

public BufferedOutputStream​(OutputStream os)

把低级的字节输出流包装成一个高级的缓冲字节输出流

从而提高写数据的性能

BufferedReader(字符缓冲输入流)

构造器

说明

public BufferedReader​(Reader r)

把低级的字符输入流包装成字符缓冲输入流管道

从而提高字符输入流读字符数据的性能

方法

说明

public String readLine()

读取一行数据返回,如果没有数据可读了,会返回null

BufferedWriter(字符缓冲输出流)

构造器

说明

public BufferedWriter​(Writer r)

把低级的字符输出流包装成一个高级的缓冲字符输出流管道

从而提高字符输出流写数据的性能

转换流

InputStreamReader字符输入转换流

OutputStreamWriter字符输出转换流

打印流

PrintStream/PrintWriter(打印流)

作用:打印流可以实现更方便、更高效的打印数据出去,能实现打印啥出去就是啥出去。

PrintStream

构造器

                                     说明

public PrintStream​(OutputStream/File/String)

打印流直接通向字节输出流/文件/文件路径

public PrintStream​(String fileName, Charset charset)

可以指定写出去的字符编码

public PrintStream​(OutputStream out, boolean autoFlush)

可以指定实现自动刷新

public PrintStream​(OutputStream out, boolean autoFlush, String encoding)

可以指定实现自动刷新,并可指定字符的编码

PrintWriter

构造器

说明

public PrintWriter​(OutputStream/Writer/File/String)

打印流直接通向字节输出流/文件/文件路径

public PrintWriter​(String fileName, Charset charset)

可以指定写出去的字符编码

public PrintWriter​(OutputStream out/Writer, boolean autoFlush)

可以指定实现自动刷新

public PrintWriter​(OutputStream out, boolean autoFlush, String encoding)

可以指定实现自动刷新,并可指定字符的编码

PrintStreamPrintWriter的区别

        打印数据的功能上是一模一样的:都是使用方便,性能高效(核心优势)

        PrintStream继承自字节输出流OutputStream,因此支持写字节数据的方法。

        PrintWriter继承自字符输出流Writer,因此支持写字符数据出去。

数据流

DataOutputStream(数据输出流)

DataInputStream(数据输入流)

序列化流

ObjectOutputStream(对象字节输出流)

ObjectInputStream(对象字节输入流)

  • 25
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值