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` 对象,但是它们的参数类型不同,并且在用法上略有不同。


    目录
    相关文章
    |
    15天前
    |
    监控 Java 应用服务中间件
    高级java面试---spring.factories文件的解析源码API机制
    【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
    45 2
    |
    3天前
    |
    Java 程序员
    Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
    小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
    26 14
    |
    20天前
    |
    存储 算法 Java
    大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
    本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
    大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
    |
    25天前
    |
    存储 缓存 Oracle
    Java I/O流面试之道
    NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
    Java I/O流面试之道
    |
    21天前
    |
    存储 缓存 Java
    大厂面试必看!Java基本数据类型和包装类的那些坑
    本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
    43 4
    |
    22天前
    |
    存储 Java 程序员
    Java基础的灵魂——Object类方法详解(社招面试不踩坑)
    本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
    75 4
    |
    1月前
    |
    算法 Java
    JAVA 二叉树面试题
    JAVA 二叉树面试题
    17 0
    |
    SQL 缓存 安全
    Java高频面试题目
    面试时面试官最常问的问题总结归纳!
    146 0
    JAVA高频面试题目集锦(6)
    JAVA高频面试题目集锦(6)
    142 0
    JAVA高频面试题目集锦(6)
    |
    存储 安全 Java
    JAVA高频面试题目集锦(5)
    JAVA高频面试题目集锦(5)
    187 0
    JAVA高频面试题目集锦(5)