IO面试题

  首先转载写本文前学习时借鉴的三个技术博客:

  标题:《深入理解Java中的IO》 作者:沉淀所有的痛 链接:https://www.cnblogs.com/ylspace/p/8128112.html

   标题:《吃透Java IO:字节流、字符流、缓冲流》 作者:云深i不知处 链接:https://blog.csdn.net/mu_wind/article/details/108674284

   标题:《Java NIO系列教程(十二) Java NIO与IO》 作者:郭蕾   链接:http://ifeve.com/java-nio-vs-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。多路复用(有待消化)

9.为什么要实现序列化?如何实现序列化?

  把Java对象转化成二进制形式,在网络间传输或者存储到磁盘上,称为序列化过程。反之转化成Java对象称为反序列化,实现serializable接口,标志性接口没有任何抽象方法。通过ObjectInputStream和ObjectOutputStream实现序列化和反序列化。

10.序列化数据后,再次修改类文件,读取数据会出问题,如何解决呢?

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

 

  

posted @   小皮睡不醒  阅读(470)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示