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


    目录
    相关文章
    |
    6月前
    |
    Java 开发工具
    【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
    本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
    486 6
    |
    6月前
    |
    Java Unix Go
    【Java】(8)Stream流、文件File相关操作,IO的含义与运用
    Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
    288 1
    |
    存储 传感器 缓存
    java变量与数据类型:整型、浮点型与字符类型
    ### Java数据类型全景表简介 本文详细介绍了Java的基本数据类型和引用数据类型,涵盖每种类型的存储空间、默认值、取值范围及使用场景。特别强调了`byte`、`int`、`long`、`float`、`double`等基本类型在不同应用场景中的选择与优化,如文件流处理、金融计算等。引用数据类型部分则解析了`String`、数组、类对象、接口和枚举的内存分配机制。
    511 15
    |
    Java 编译器 Maven
    Java“class file contains wrong class”解决
    当Java程序运行时出现“class file contains wrong class”错误,通常是因为类文件与预期的类名不匹配。解决方法包括:1. 确保类名和文件名一致;2. 清理并重新编译项目;3. 检查包声明是否正确。
    464 3
    |
    Java 编译器
    成功解决:java file outside of source root
    解决Java文件不在源代码根目录内的问题,可以通过在IDEA中将包含.java文件的目录设置为Sources Root来修复。
    成功解决:java file outside of source root
    |
    Java 大数据 API
    Java 流(Stream)、文件(File)和IO的区别
    Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
    890 12
    |
    Oracle Java 关系型数据库
    Linux下JDK环境的配置及 bash: /usr/local/java/bin/java: cannot execute binary file: exec format error问题的解决
    如果遇到"exec format error"问题,文章建议先检查Linux操作系统是32位还是64位,并确保安装了与系统匹配的JDK版本。如果系统是64位的,但出现了错误,可能是因为下载了错误的JDK版本。文章提供了一个链接,指向Oracle官网上的JDK 17 Linux版本下载页面,并附有截图说明。
    Linux下JDK环境的配置及 bash: /usr/local/java/bin/java: cannot execute binary file: exec format error问题的解决
    |
    存储 缓存 Java
    15 Java IO流(File类+IO流+字节流+字符流+字节编码)
    15 Java IO流(File类+IO流+字节流+字符流+字节编码)
    229 3
    java中实现File文件的重命名(renameTo)、将文件移动到其他目录下、文件的复制(copy)、目录和文件的组合(更加灵活方便)
    这篇文章介绍了Java中使用`renameTo()`、`Files.copy()`等方法对文件进行重命名、移动和复制的操作,并提供了代码实例和测试效果。
    java中实现File文件的重命名(renameTo)、将文件移动到其他目录下、文件的复制(copy)、目录和文件的组合(更加灵活方便)