Java IO(File、字节输入输出流、字符输入输出流、打印流)附带相关面试题
Alphamilk
编辑于 2023年08月07日 17:09
收录于文集
共13篇

1.File类

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

以下是File类的常用方法:

方法描述

  • exists()判断文件或目录是否存在

  • canRead()判断文件是否可读

  • canWrite()判断文件是否可写

  • isFile()判断路径是否表示一个文件

  • isDirectory()判断路径是否表示一个目录

  • getName()获取文件或目录的名称

  • getParent()获取文件或目录的父级路径

  • createNewFile()创建新文件

  • delete()删除文件或目录

  • renameTo()重命名文件或目录

  • list()返回目录下的文件和目录列表

  • listFiles()返回目录下的文件和目录数组

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

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

代码块
clike
自动换行
复制代码
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()));
        }
    }
}
复制成功

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

代码块
clike
自动换行
复制代码
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++);
                }
            }
        }
    }
}
复制成功

 *面试题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

代码块
clike
自动换行
复制代码
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));
    }
}
复制成功

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

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

代码块
clike
自动换行
复制代码
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();
    }
}
复制成功


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

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

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

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()关闭输出流,并释放相关资源

案例代码1:

代码块
clike
自动换行
复制代码
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();
        }
    }
}
复制成功

 案例代码2:

代码块
clike
自动换行
复制代码
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();
        }
    }
}
复制成功

面试题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 flush()刷新输出流,即将缓冲区的内容写入目标设备。

  • void close()关闭输出流,释放相关资源。

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

姓名:黄小龙 年龄15

案例代码:

代码块
clike
自动换行
复制代码
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();
            }
        }
    }
}
复制成功

 构造方法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&#​34;); PrintWriter writer = new PrintWriter(file); writer.println("Hello, world!&#​34;); writer.close(); ``` 相比之下,`PrintWriter(FileOutputStream out)` 构造函数接受一个 `FileOutputStream` 对象作为参数,表示要与该对象关联的输出流。如果您已经有一个 `FileOutputStream` 对象,并且希望将其用作 `PrintWriter` 对象的输出流,可以使用这个构造函数。 例如,以下代码创建一个新的 `FileOutputStream` 对象,并将其用作 `PrintWriter` 对象的输出流: ```java FileOutputStream outputStream = new FileOutputStream("example.txt&#​34;); PrintWriter writer = new PrintWriter(outputStream); writer.println("Hello, world!&#​34;); writer.close(); ``` 总之,这两种构造函数都可以用于创建一个 `PrintWriter` 对象,但是它们的参数类型不同,并且在用法上略有不同。