Java 中IO流详解(附实例代码/面试题)


前言

IO流大家可能不太熟悉,我简单整理了一下常用IO流基本用法,并且提供了一些练习题和面试题,大家可以抽空看看。

一、I/O流是什么?

I/O流中的 I 代表 input(输入) ,O代表 output(输出) 。

流的定义: IO流就是以流的方式进行输入输出。流(stream)的概念源于UNIX中管道(pipe)的概念。

如何理解?
形象的比喻——水流 ,文件======程序 ,文件和程序之间连接一个管道,水流就在之间形成了,自然也就出现了方向:可以流进,也可以流出.便于理解,这么定义流: 流就是一个管道里面有流水,这个管道连接了文件和程序。

  • 按流向分:

             输出流:OutputStream 和 Writer 为基类
             输入流:InputStream 和 Reader 为基类
    
  • 按处理数据单元划分:字节流字节输入流:InputStream基类

              1.  字节输出流:OutputStream基类
                               
              2. 字符流:字符输入流:Reader基类
                               
              3. 字节输出流:Writer基类
    

注意:(字节流是 8 位通用字节流,字符流是16位Unicode字符流)

二、IO流分类:

1. 流程图: io流对象

在这里插入图片描述

2. io流的优缺点:

  1. 简明与可读性
  2. 类型安全(type safe)
  3. 易于扩充

3. io 流Java中用途有哪些?

  1. io 流很有用的,遇到大型一点的程序都会涉及到。自动生成java代码时会用到 io 输出。

  2. 上传图片,文件,还有就是存取文件,socket通信,最初可以不用太专研 io,当用的时候去看看就行了,主要就是区分字节字符输入输出流的用法就行了。

  3. 如果做文档,报表或者文件的上传下载,读取、写入之类的项目,用的还是比较多的。

三、一些 io 实例

  1. BufferedInputStream:缓冲流,对处理流进行装饰、增强,内部会有一个缓冲区,用来存放字节,每次都是将缓冲区存满然后发送,而不是一个字节或两个字节这样发送,效率更高。
  2. DataInputStream:数据输入流,用来装饰其他输入流,它允许通过数据流来读写Java基本类型。
  3. FileInputStream:文件输入流,通常用于对文件进行读取操作。
  4. File:对指定目录的文件进行操作。

代码如下(示例1):

  1. 分别创建 aa.txt文本(当前项目根目录,d盘根目录创建aa.txt , d盘创建aa文件夹, d盘创建cc/dd目录
public class FileRead {
    public static void main(String[] args) {
    // 实例化对象
        File f1 = new File("aa.txt");
        File f2 = new File("D:/aa.txt");
        File f3 = new File("d:/aa");
        File f4 = new File("d:/cc/dd");

        try {
            boolean b1 = f1.createNewFile(); // 创建文件
            boolean b2 = f2.createNewFile(); // 创建文件
            boolean b3 = f3.mkdir(); //单个文件夹
            boolean b4 = f4.mkdirs(); // 多重文件夹

            if (b1 && b2 && b3 && b4){
                System.out.println("创建成功");
            }else {
                System.out.println("创建失败");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

  1. 读取D盘已有里的cs.jpg , 在D盘创建 cc/dd 目录文件夹, 并把 图片 cs.jpg 写入上述目录, 重命名为cs1.jpg

代码如下(示例2):

public class FileReadWrite {
    public static void main(String[] args) {
    	// 初始化输入输出流
        FileInputStream fis = null;
        FileOutputStream fos = null;

        try {
        	// 文件输入流
            fis = new FileInputStream("D:/cs.jpg");
            // 文件输出流
            fos = new FileOutputStream("D:/cc/dd/cs1.jpg");

            // 定义每次读取的字节数
            byte [] b = new byte[1024];
            int result = 0;
            try{
                while ((result = fis.read(b))!=-1){//循环条件,读完时终止循环
                    //读一次,写一次
                    fos.write(b,0,result);
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

3.利用缓存区 BufferedRead/BufferedWrite, 读取 aa 文件夹里的 abc.txt 文件, 把文件里的内容写入到 abc1.txt 文本中。

代码如下(示例3):

public class BufferedReadWrite {
    public static void main(String[] args) {
    	// 初始化
        BufferedReader br = null;
        BufferedWriter bw = null;

        try {
            br = new BufferedReader(new FileReader("D:/aa/abc.txt"));
            try {
                bw = new BufferedWriter(new FileWriter("D:/abc1.txt"));
                // 定义字符串接受读取内容, temp初始值为null
                String temp = null;
                while ((temp=br.readLine())!= null){// 如果读取为空时,说明已全部读取完毕
                    bw.write(temp);
                    bw.newLine();//换行
                }
                bw.flush();//刷新缓存区
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

4.创建文档bb.txt , 键盘输入内容,写入到文档中, 当输入quit,且独占一行时, 每次重新写入,都会覆盖之前的内容

代码如下(示例4):

public class BufferedWrite {
    public static void main(String[] args) {
		// 初始化
        BufferedReader br;
        BufferedWriter bw = null;

        br = new BufferedReader(new InputStreamReader(System.in));
        try {
            bw = new BufferedWriter(new FileWriter("D:/bb.txt"));
            String temp = null;
            while ((temp = br.readLine()) != null){
                if (temp.equals("quit")){
                    break;
                }
                bw.write(temp);
                bw.newLine();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            // 执行完顺便关闭流
            try {
                br.close();
                bw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

四、面试题:

  1. 什么是IO流?

它是一种数据的流从源头流到目的地。比如文件拷贝,输入流和输出流都包括了。输入流从文件中读取数据存储到进程(process)中,输出流从进程中读取数据然后写入到目标文件。

  1. 字节流和字符流的区别。

字节流在JDK1.0中就被引进了,用于操作包含ASCII字符的文件。JAVA也支持其他的字符如Unicode,为了读取包含Unicode字符的文件,JAVA语言设计者在JDK1.1中引入了字符流。ASCII作为Unicode的子集,对于英语字符的文件,可以使用字节流也可以使用字符流。

  1. Java中流类的超类主要有那些?
  • java.io.InputStream
  • java.io.OutputStream
  • java.io.Reader
  • java.io.Writer
  1. FileInputStream和FileOutputStream是什么?

这是在拷贝文件操作的时候,经常用到的两个类。在处理小文件的时候,它们性能表现还不错,在大文件的时候,最好使用BufferedInputStream (或 BufferedReader) 和 BufferedOutputStream (或 BufferedWriter)

  1. 字节流和字符流,你更喜欢使用哪一个?

个人来说,更喜欢使用字符流,因为他们更新一些。许多在字符流中存在的特性,字节流中不存在。比如使用BufferedReader而不是BufferedInputStreams或DataInputStream,使用newLine()方法来读取下一行,但是在字节流中我们需要做额外的操作。

  1. System.out.println()是什么?

println是PrintStream的一个方法。out是一个静态PrintStream类型的成员变量,System是一个java.lang包中的类,用于和底层的操作系统进行交互。

  1. 什么是Filter流?

Filter Stream是一种IO流主要作用是用来对存在的流增加一些额外的功能,像给目标文件增加源文件中不存在的行数,或者增加拷贝的性能。

  1. 有哪些可用的Filter流?

在 java.io 包中主要由4个可用的filter Stream。两个字节filter stream,两个字符filter stream. 分别是FilterInputStream, FilterOutputStream, FilterReader and FilterWriter.这些类是抽象类,不能被实例化的。

  1. SequenceInputStream的作用?

在拷贝多个文件到一个目标文件的时候是非常有用的。可以使用很少的代码实现

  1. 说说PrintStream和PrintWriter

他们两个的功能相同,但是属于不同的分类。字节流和字符流。他们都有println()方法。

  1. 在文件拷贝的时候,哪一种流可以提升更多的性能?

在字节流的时候,使用BufferedInputStream和BufferedOutputStream。
在字符流的时候,使用BufferedReader 和 BufferedWriter

  1. 说说管道流(Piped Stream)

有四种管道流, PipedInputStream, PipedOutputStream, PipedReader 和 PipedWriter.在多个线程或进程中传递数据的时候管道流非常有用。

  1. 说说File类

它不属于 IO流,也不是用于文件操作的,它主要用于知道一个文件的属性,读写权限,大小等信息。

  1. 说说RandomAccessFile?

它在 java.io 包中是一个特殊的类,既不是输入流也不是输出流,它两者都可以做到。他是 Object 的直接子类。通常来说,一个流只有一个功能,要么读,要么写。但是 RandomAccessFile 既可以读文件,也可以写文件。 DataInputStream 和 DataOutStream有的方法,在RandomAccessFile 中都存在。

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值