Java IO(File、字节输入输出流、字符输入输出流、打印流)附带相关面试题

简介: 1.File类,2.字节输入输出流(InputStream Outputstream),3.Writer与Reader字符输入输出流,4.打印流



1.File类

file类专门用于管理file文件的,比如文件的创建,删除,修改名称等等

以下是File类的常用方法:

方法 描述
exists() 判断文件或目录是否存在
canRead() 判断文件是否可读
canWrite() 判断文件是否可写
isFile() 判断路径是否表示一个文件
isDirectory() 判断路径是否表示一个目录
getName() 获取文件或目录的名称
getParent() 获取文件或目录的父级路径
getPath() 获取文件或目录的路径
isAbsolute() 判断路径是否为绝对路径
lastModified() 获取文件或目录的最后修改时间
length() 获取文件的大小
mkdir() 创建目录
mkdirs() 创建目录及其父目录
createNewFile() 创建新文件
delete() 删除文件或目录
renameTo() 重命名文件或目录
list() 返回目录下的文件和目录列表
listFiles() 返回目录下的文件和目录数组
getAbsolutePath() 获取文件或目录的绝对路径

文件路径需要掌握File.separator分隔符相当于"\\",为什么要有这个东西呢?因为在不同的操作系统中路径的分隔符并不一样,由此出现File.separator,会根据自己的系统自动转换相应的分隔符

1.使用案例:在一个路径上,如果存在一个文件java.txt,则将其删除,如果不存在则创建一个文件java.txt,再将其名字改为java.html并且输出上次的修改日期

package Example1605;
import java.io.File;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
public class javaDemo {
    public static void main(String[] args)throws Exception {
        File file = new File("E:"+File.separator+"jiawa"+File.separator+"java.txt");
//        判断文件是否存在
        if (file.exists()){
            file.delete();
        }else {
//            创建文件
            file.createNewFile();
//            实现文件改名
            String newName = file.getName().substring(0,file.getName().lastIndexOf('.'))+".html";
            File newFile = new File(file.getParentFile(),newName);
            file.renameTo(newFile);
//            上次修改日期
            System.out.println(new Date(file.lastModified()));
        }
    }
}

image.gif

image.gif编辑

2.通过递归实现输出C盘所有文件内容

package Example1601;
import java.io.File;
public class javaDemo {
    public static void main(String[] args) {
        int count = 0;
       File file =  new File("C:"+ File.separator);
       list(file,count);
        System.out.println(count);
    }
    public static void list(File file,int count){
//        判断是否目录如果是则深入目录
        if (file.isDirectory()){
            File result[] = file.listFiles();
//            判断目录里面是否有内容没有就跳过,有则继续深入
            if (result!=null){
                for (int i=0;i< result.length;i++){
                    list(result[i],count++);
                }
            }
        }
    }
}

image.gif

*面试题Files的常用方法都有哪些?

exist、createFile、createDirectory、write、read、copy、size、delete、move


2.字节输入输出流(InputStream Outputstream)

字节输入输出流的最基本单位是byte字节,注意InputStream和OutputStream都是抽象类,所以实例化对象分别是其子类FileInputStream(File file)与FileOutputStream(File file)

首先介绍OutoutStream字节输出流的常用方法:

方法 描述
write(byte[] buffer) 将byte数组中的数据写入输出流
write(byte[] buffer, int off, int len) 将byte数组中指定范围的数据写入输出流
write(int b) 将单个字节写入输出流
flush() 刷新输出流,确保所有缓冲区中的数据都被写出
close() 关闭输出流,并释放相关资源

InputStream的常用方法:

方法 描述
read() 读取输入流中的下一个字节
read(byte[] buffer) 将输入流中的数据读入到byte数组中
read(byte[] buffer, int off, int len) 将输入流中的数据读入到指定范围的byte数组中
skip(long n) 跳过并丢弃输入流中的n个字节
available() 返回可以从输入流中读取(或跳过)的字节数
close() 关闭输入流,并释放相关资源

案例代码:

实现在java.txt中通过OutputStream的wirte函数实现第一次覆盖内容实现输入Hello,第二次实现追加在Hello后面加入World

package Example1603;
import java.io.*;
import java.nio.charset.StandardCharsets;
public class javaDemo {
    public static void main(String[] args)throws Exception {
//        确保路径有效可以对其进行判定此处暂略
        File file =  new File("E:"+File.separator+"jiawa"+File.separator+"java.txt");
//        正常情况下
        OutputStream out = new FileOutputStream(file);
        out.write("Hello".getBytes(StandardCharsets.UTF_8));
        out.close();
//        通过构造方法设置true实现文件内容追加
        OutputStream outer = new FileOutputStream(file,true);
        outer.write("World".getBytes(StandardCharsets.UTF_8));
        outer.close();
//        输出文件内容
        InputStream input = new FileInputStream(file);
        byte[] data = new byte[1024];
        int len =  input.read(data);
        System.out.println(new String(data,0,len));
    }
}

image.gif

image.gif编辑

注意在创建实例化对象执行完函数后都要进行close();除非使用AutoCloseable接口

案例2:在刚才基础上读取时候跳过Hello

package Example1604;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class javaDemo {
    public static void main(String[] args)throws Exception {
        File file =  new File("E:"+File.separator+"jiawa"+File.separator+"java.txt");
        InputStream input = new FileInputStream(file);
        byte[] data =new byte[1024];
        input.skip(5);
        int len = input.read(data);
        System.out.println(new String(data,0,len));
        input.close();
    }
}

image.gif


3.Writer与Reader字符输入输出流

1.字符输入流与字节输入流有什么区别:

    1. 数据单位:字节流以字节为单位进行输入和输出,而字符流以字符为单位进行输入和输出。字符流可以直接处理Unicode字符,而字节流需要通过字符编码和解码来处理文本数据。
    2. 编码支持:字符流默认使用平台默认的字符编码(如UTF-8),并提供了更多的字符编码支持(如UTF-16、ISO-8859-1等)。字节流不关心编码,只是原样传输字节数据。
    3. 数据处理:字符流提供了更高级别的数据处理功能,能够方便地读取和写入文本数据,包括按行读取、字符缓冲等操作。字节流主要用于二进制数据的读写,处理相对底层。
    4. 效率:由于字符流需要进行字符编码和解码,所以在处理大量数据时可能会比字节流略慢。对于文本数据的处理,字符流的效率通常比较高。

    综上所述,字符流更适合处理文本数据,提供了更多的字符编码支持和便捷的高级功能;而字节流适用于处理二进制数据,更为底层和灵活。选择使用哪种流类型取决于具体的输入/输出需求和数据类型。

    2.Writer与Reader也都是抽象类,所以实例化的时候需要向上转型为其子类,FileWriter与FileReader

    Writer的常用方法:

    方法 描述
    write(int c) 将指定字符写入输出流
    write(char[] cbuf) 将字符数组的所有字符写入输出流
    write(String str) 将字符串中的所有字符写入输出流
    write(String str, int off, int len) 将字符串中指定范围的字符写入输出流
    append(CharSequence csq) 将指定的字符序列追加到输出流
    append(CharSequence csq, int start, int end) 将指定范围的字符序列追加到输出流
    flush() 刷新输出流,将缓冲区的数据写入目标设备
    close() 关闭输出流,并释放相关资源

    Reader的常用方法:

    方法 描述
    read() 读取单个字符,返回读取的字符的ASCII码值或-1(如果已达到流的末尾)
    read(char[] cbuf) 将字符读入数组,并返回读取的字符数
    read(char[] cbuf, int off, int len) 将字符读入数组的指定范围,并返回读取的字符数
    read(CharBuffer target) 将字符读入CharBuffer对象中,并返回读取的字符数
    skip(long n) 跳过n个字符的读取
    ready() 判断是否可以读取(准备读取)
    mark(int readAheadLimit) 在当前位置设置一个标记,以供稍后的reset()方法使用
    reset() 将位置重置为最近的标记位置
    close() 关闭输入流,并释放相关资源

    案例代码1:

    package Example1606;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Writer;
    public class javaDemo {
        public static void main(String[] args)throws Exception {
            File file = new File("E:"+File.separator+"jiawa"+File.separator+"java.txt");
            try{
                if (file.exists()){
                    Writer out = new FileWriter(file);
                    out.write("大家好,我系渣渣辉");
    //                Witer的追加是通过函数apend()
                    out.append(",其实我不系了啦");
                    out.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }

    image.gif

    image.gif编辑

    案例代码2:

    package Example1607;
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.Reader;
    public class javaDemo {
        public static void main(String[] args) {
            File file =new File("E:"+File.separator+"jiawa"+File.separator+"java.txt");
            try {
                Reader read = new FileReader(file);
                char data[] =new char[1024];
                int len = read.read(data);
                System.out.println(new String(data,0,len));
                read.close();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }

    image.gif

    面试题java 中 IO 流分为几种?

    (1)按流划分,可以分为输入流和输出流;

    (2)按单位划分,可以分为字节流和字符流;

    字节流:inputStream、outputStream;

    字符流:reader、writer


    4.打印流

    虽然说io中对数据的输出可以通过OutputStream与Writer,但是两者都有一定的限制,比如OutputStream只允许输出字节数据,Writer只允许输出字符数据和字符串数据,在实际的开发过程会有多种数据类型的输出就引出了PrintWriter

    下面介绍PrintWriter的常用方法:

    void print(boolean x) 将boolean值打印到输出流。
    void print(char x) 将字符打印到输出流。
    void print(int x) 将整数打印到输出流。
    void print(long x) 将长整数打印到输出流。
    void print(float x) 将浮点数打印到输出流。
    void print(double x) 将双精度浮点数打印到输出流。
    void print(char[] x) 将字符数组打印到输出流。
    void print(String x) 将字符串打印到输出流。
    void println() 打印一个换行符。
    void println(boolean x) 打印boolean值,并在结尾添加换行符。
    void println(char x) 打印字符,并在结尾添加换行符。
    void println(int x) 打印整数,并在结尾添加换行符。
    void println(long x) 打印长整数,并在结尾添加换行符。
    void println(float x) 打印浮点数,并在结尾添加换行符。
    void println(double x) 打印双精度浮点数,并在结尾添加换行符。
    void println(char[] x) 打印字符数组,并在结尾添加换行符。
    void println(String x) 打印字符串,并在结尾添加换行符。
    void format(String format, Object... args) 使用指定格式将参数写入输出流。
    void write(char[] buf, int off, int len) 将字符数组的一部分写入输出流。
    void flush() 刷新输出流,即将缓冲区的内容写入目标设备。
    void close() 关闭输出流,释放相关资源。

    1.通过打印一个print.txt内容为:

    姓名:黄小龙

    年龄15

    案例代码:

    package Example08;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.PrintWriter;
    public class javaDemo {
        public static void main(String[] args) {
            File file =  new File("E:"+File.separator+"jiawa"+File.separator+"print.txt");
            if (!file.exists()){
                try {
                    file.createNewFile();
                    PrintWriter w = new PrintWriter(new FileOutputStream(file));
                    w.println("姓名:黄小龙");
                    w.print("年龄");
                    w.println(15);
    //                释放资源
                    w.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
        }
    }

    image.gif

    image.gif编辑

    构造方法PrintWriter(File file)与PrintWriter(FileOutputStream out)有什么区别:

    `PrintWriter(File file)` 和 `PrintWriter(FileOutputStream out)` 都创建了一个新的 `PrintWriter` 对象,用于写入字符流。它们的区别在于它们的构造函数参数类型不同。

    `PrintWriter(File file)` 构造函数接受一个 `File` 对象作为参数,表示要写入的文件。当您使用这个构造函数创建一个 `PrintWriter` 对象时,它将自动为您创建一个 `FileOutputStream` 对象并将其与您指定的文件关联。这意味着您可以直接向 `PrintWriter` 对象写入字符,而不必手动创建 `FileOutputStream` 对象。

    例如,以下代码使用 `PrintWriter(File file)` 构造函数创建一个新的 `PrintWriter` 对象,并将其用于向 `example.txt` 文件写入字符:

    ```java

    File file = new File("example.txt");

    PrintWriter writer = new PrintWriter(file);

    writer.println("Hello, world!");

    writer.close();

    ```

    相比之下,`PrintWriter(FileOutputStream out)` 构造函数接受一个 `FileOutputStream` 对象作为参数,表示要与该对象关联的输出流。如果您已经有一个 `FileOutputStream` 对象,并且希望将其用作 `PrintWriter` 对象的输出流,可以使用这个构造函数。

    例如,以下代码创建一个新的 `FileOutputStream` 对象,并将其用作 `PrintWriter` 对象的输出流:

    ```java

    FileOutputStream outputStream = new FileOutputStream("example.txt");

    PrintWriter writer = new PrintWriter(outputStream);

    writer.println("Hello, world!");

    writer.close();

    ```

    总之,这两种构造函数都可以用于创建一个 `PrintWriter` 对象,但是它们的参数类型不同,并且在用法上略有不同。


    目录
    相关文章
    |
    12月前
    |
    监控 Java API
    现代 Java IO 高性能实践从原理到落地的高效实现路径与实战指南
    本文深入解析现代Java高性能IO实践,涵盖异步非阻塞IO、操作系统优化、大文件处理、响应式网络编程与数据库访问,结合Netty、Reactor等技术落地高并发应用,助力构建高效可扩展的IO系统。
    340 0
    |
    9月前
    |
    Java Unix Go
    【Java】(8)Stream流、文件File相关操作,IO的含义与运用
    Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
    331 1
    |
    11月前
    |
    Java 测试技术 API
    Java IO流(二):文件操作与NIO入门
    本文详解Java NIO与传统IO的区别与优势,涵盖Path、Files类、Channel、Buffer、Selector等核心概念,深入讲解文件操作、目录遍历、NIO实战及性能优化技巧,适合处理大文件与高并发场景,助力高效IO编程与面试准备。
    |
    12月前
    |
    存储 Java Linux
    操作系统层面视角下 Java IO 的演进路径及核心技术变革解析
    本文从操作系统层面深入解析Java IO的演进历程,涵盖BIO、NIO、多路复用器及Netty等核心技术。分析各阶段IO模型的原理、优缺点及系统调用机制,探讨Java如何通过底层优化提升并发性能与数据处理效率,全面呈现IO技术的变革路径与发展趋势。
    243 3
    |
    11月前
    |
    SQL Java 数据库连接
    Java IO流(一):字节流与字符流基础
    本文全面解析Java IO流,涵盖字节流、字符流及其使用场景,帮助开发者理解IO流分类与用途,掌握文件读写、编码转换、异常处理等核心技术,通过实战案例提升IO编程能力。
    |
    存储 网络协议 安全
    Java网络编程,多线程,IO流综合小项目一一ChatBoxes
    **项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
    665 23
    |
    缓存 网络协议 Java
    JAVA网络IO之NIO/BIO
    本文介绍了Java网络编程的基础与历史演进,重点阐述了IO和Socket的概念。Java的IO分为设备和接口两部分,通过流、字节、字符等方式实现与外部的交互。
    558 0
    |
    存储 缓存 Java
    java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
    这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
    554 1
    java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
    |
    Java
    java 中 IO 流
    Java中的IO流是用于处理输入输出操作的机制,主要包括字节流和字符流两大类。字节流以8位字节为单位处理数据,如FileInputStream和FileOutputStream;字符流以16位Unicode字符为单位,如FileReader和FileWriter。这些流提供了读写文件、网络传输等基本功能。
    362 10