IO流面试专题

92 阅读4分钟

关于io流我们主要从一下几个常问的面试问题入手。

  1. 什么是io流?
  2. java中有几种类型的io流?
  3. 谈谈java io中常见类,字符流,字节流。
  4. 字符流和字节流怎么相互转化?
  5. 简述File类的基本功能
  6. 什么是 java 序列化,如何实现 java 序列化?
  7. FileInputStream和FileOutputStream是什么?

先大致浏览一下整体结构~

什么是IO流?

流是一种抽象概念,它代表着数据的无结构化传递。数据被当成无结构的字节序或字符序列,按照流的方式进行输入输出。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出

java中有几种类型的io流?

按照数据流数据单位不同分为:

  • 字节流:继承InputStream或OutputStream
  • 字符流:继承Reader或Writer

按照数据流方向不同:

  • 输入流:从磁盘中文件的数据输入到内存中
  • 输出流:从内村中的数据输出到磁盘中

按照功能划分:

  • 节点流
  • 处理流

谈谈java io中常见类,字符流,字节流,接口,实现类,方法阻塞

java io中的常见类就非常多了,io流主要分为字符流和字节流。字节流的抽象类InputStream,Outputstream。其实现类FileInputStream,FileOutputStream,ObjectInputStream,ObjectOutputStream,BufferedInputStream,BufferedOutputStream等。字符流的抽象类Reader,Writer。其实现类FileReader,FileWriter,BufferedReader,BufferedWirter等

java中的阻塞式方法是指在程序调用改方法时,必须等待输入数据可用或者检测到输入结束或者抛出异常,否则程序会一直停留在该语句上,不会执行下面的语句。比如read()和readLine()方法。

字符流和字节流怎么相互转化?

字节流转字符流就很简单,通过字符流提供的InputStreamReader,OutputStreamWriter实现。通过构造函数传入相应的字节流。

字符流转为字节流就比较复杂,通过字符流拿到字符数组(char【】),字符数组再转为String,再通过String的APi函数getBytes() 得到对应的字节数组(byte【】),然后就可以通过ByteArrayInputStream、ByteArrayOutputStream来实现到字节流的转换。

简述File类的基本功能

可以操作磁盘上文件或者文件夹的类型。

构造方法:

  • File(String pathname) :将参数描述的字符串路径封装为一个file对象
  • File(String parent, String child) :将两个字符串拼接之后的路径封装为一个file对象
  • File(File parent, String child) :将第一个参数描述的file对象路径,和第二个参数字符串 拼接之后的路径再封装到一个新的对象中
import java.io.File;

       //使用绝对路径封装a.txt文件
        File f = new File("D:\\develope\\idea\\work\\Projects\\a.txt");
        //使用相对路径封装a.txt文件
        File f2 = new File("a.txt");
        
        //将a.txt的父级路径和子级路径分来定义
        File f5 = new File("abc","b.txt");
        //先封装父级路径,再封装子级路径
        File f6 = new File("abc");
        File f7 = new File(f6,"b.txt");
   

File类的创建方法:

  • createNewFile() :创建一个文件
  • mkdir() :创建一个文件夹,如果父级路径不存在,就不能创建成功
  • mkdirs() :创建一个文件夹,父级路径不存在一起创建
//想在工程下创建一个文件:a.txt
        File f = new File("a.txt");
        boolean boo = f.createNewFile();
        System.out.println(boo);

        //在当前工程下创建一个文件夹:abc
        File f2 = new File("abc");
        boolean boo2 = f2.mkdir();
        System.out.println(boo2);

        //在abc文件夹中创建一个aaa文件夹
        File f3 = new File("abc/aaa");
        boolean boo3 = f3.mkdir();
        System.out.println(boo3);

        //在c文件夹中创建一个文件夹d
        File f4 = new File("c/d");
        boolean boo4 = f4.mkdirs();
        System.out.println(boo4);

        //在d文件夹中,创建一个f文件
        File f5 = new File("d");
        boolean boo5 = f5.mkdir();
        File f6 = new File(f5,"f");
        boolean boo6 = f6.createNewFile();
        System.out.println(boo6);

什么是 java 序列化,如何实现 java 序列化?

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。

序 列 化 的 实 现 : 将 需 要 被 序 列 化 的 类 实 现 Serializable 接 口 , 该 接 口 没 有 需 要 实 现 的 方 法 , implements Serializable 只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个 ObjectOutputStream(对象流)对象,接着,使用 ObjectOutputStream 对象的 writeObject(Object obj)方法就可以将参数为 obj 的对象写出(即保存其状态),要恢复的话则用输入流。

FileInputStream和FileOutputStream是什么?

FileInputStream可用从文件系统中的某个文件中获取字节流。FileOutputStream文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 14 天,点击查看活动详情