IO面试题

  首先转载写本文前学习时借鉴的三个技术博客:https://www.cnblogs.com/ylspace/p/8128112.html https://blog.csdn.net/mu_wind/article/details/108674284 http://ifeve.com/java-nio-vs-io/

  下图这是IO流对象的大类

IO面试题

 

 字节流简单示例

public class IODemo {
    public static void main(String[] args) throws IOException {
        File file = new File("……");
        File file2 = new File("……");
        InputStream input = new FileInputStream(file);
        OutputStream output = new FileOutputStream(file2);
        int i;
        while ((i = input.read()) != -1) {
            output.write(i);
        }
     input.close();
     output.close();
} }

 

缓冲流,注意含中文时须使用InputStreamReader指定字符编码,不然会导致乱码

public class IODemo2 {
    public static void main(String[] args) throws IOException {
        File file = new File("……");
        File file2 = new File("……");
        FileInputStream fileInputStream = new FileInputStream(file);
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream,"GBK"));
        FileWriter fileWriter = new FileWriter(file2,true);
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
        String s ;
        StringBuilder sb = new StringBuilder();
        while ((s=bufferedReader.readLine())!=null){
            bufferedWriter.write(String.valueOf(s));
            bufferedWriter.newLine();
        }
        bufferedReader.close();
        bufferedWriter.close();

    }
}

 

下面是自己的理解:

  因为目前对IO的体系认知有限,本文先从面试题入手:

1.Java IO流有什么特点?

  与NIO相比,IO流的特点是:面向流,数据不能乱序处理,阻塞。抽象成本身特点:先进先出,顺序存取,只读只写(阻塞)。
2.Java IO流分为几种类型?

  根据数据流向,分为输入流,输出流。根据数据处理单位,分为字节流,字符流。根据功能,分为节点流,处理流(包括缓冲流)。
3.字节流和字符流的关系与区别?

  字节流按每个字节为单位处理,但是不同字符在不同编码下所占字节不同,如果都按字节读写,可能造成乱码。于是有了按照字符读写的字符流,字符流本质是在字节流的基础上增加了缓冲区,以达到处理每个字符的效果。
4.字符流是否使用了缓冲?

  是。字符流本质是在字节流的基础上增加了缓冲区,以达到处理每个字符(可能是多个字节)的效果。
5.缓冲流的效率一定高吗?为什么?

  不一定。缓冲流在在处理过长的字符串时,如果字符串长度超过缓冲区长度,则会冲刷后直接读写,不经过缓冲区,反而降低效率。
6.缓冲流体现了Java中的哪种设计模式思想?

  装饰者模式(还未消化)。

7.为什么要IO流使用完一定Close?

  因为IO不仅使用了Java的内存,还调用了系统资源,如果不手动Close,Java的GC可以回收这部分内存,但是系统资源会一直被占用。

8.了解NIO吗?

  New IO或者Non-blocking IO,即没有阻塞的新IO。NIO三大组件Channels、Buffers、Selectors,特点是面向缓冲、没阻塞和选择器,可以通过Selector可以做到一个线程监听多个Channel。多路复用(有待消化)
7.为什么要实现序列化?如何实现序列化?

  把Java对象转化成二进制形式,在网络间传输或者存储到磁盘上,称为序列化过程。反之转化成Java对象称为反序列化,实现serializable接口,标志性接口没有任何抽象方法。通过ObjectInputStream和ObjectOutputStream实现序列化和反序列化。
8.序列化数据后,再次修改类文件,读取数据会出问题,如何解决呢?

  报错时会提示serialVersionUID相关,自己定义一个常量private static final long serialVersionUID,保持版本一致就好了。

 

  

上一篇:519题-随机翻转矩阵


下一篇:一周一个中间件-zookeeper