Java——5个关于Java中I/O流的面试题_大家搜集整理java大厂面试题之 文件i/o-程序员宅基地

技术标签: python  java  # 【Java面试】  # 【JavaSE核心内容】  开发语言  

文章目录:

1.Java 中有几种类型的流?

2.字节流如何转为字符流?

3.字节流和字符流的区别?

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

5.如何将一个 java 对象序列化到文件里?


1.Java 中有几种类型的流?

  • 按照流的方向:输入流(inputStream:硬盘 ---> 内存)和输出流(outputStream:内存 ---> 硬盘)。
  • 按照读取数据方式不同进行分类:字节流和字符流。字节流继承于 InputStream 和 OutputStream, 字符流继承于InputStreamReader 和 OutputStreamWriter 。
  • 凡是“类名”以 Stream 结尾的流都是字节流,以Reader/Writer结尾的都是字符流。
  • Java I/O流这块有四大家族:(全部都是抽象类)
  1. java.io.InputStream       字节输入流
  2. java.io.OutputStream    字节输出流
  3. java.io.Reader               字符输入流
  4. java.io.Writer                  字符输出流
  • 所有的流都实现了:
                java.io.Closeable接口,都是可关闭的,都有close()方法。
                流毕竟是一个管道,这个是内存和硬盘之间的通道,用完之后一定要关闭,
                不然会耗费(占用)很多资源。养成好习惯,用完流一定要关闭。

  • 所有的输出流都实现了:
                java.io.Flushable接口,都是可刷新的,都有flush()方法。
                养成一个好习惯,输出流在最终输出之后,一定要记得flush()
                刷新一下。这个刷新表示将通道/管道当中剩余未输出的数据
                强行输出完(清空管道!)刷新的作用就是清空管道。
                注意:如果没有flush()可能会导致丢失数据。

2.字节流如何转为字符流?

  • 字节输入流转字符输入流通过 InputStreamReader 实现,该类的构造函数可以传入 InputStream 对象。
  • 字节输出流转字符输出流通过 OutputStreamWriter 实现,该类的构造函数可以传入 OutputStream 对象。

3.字节流和字符流的区别?

  • 字节流读取的时候,读到一个字节就返回一个字节。
  • 字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在 UTF-8 码表中是 3 个字节)时。先去查指定的编码表,将查到的字符返回。
  • 字节流可以处理所有类型数据,如:图片,MP3,AVI视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。
  • 字节流主要是操作 byte 类型数据,以 byte 数组为准,主要操作类就是 OutputStream、InputStream字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。所以字符流是由 Java 虚拟机将字节转化为 2 个字节的 Unicode 字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点。在程序中一个字符等于两个字节,java 提供了 Reader、Writer 两个专门操作字符流的类。 

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

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。序 列 化 的 实 现 : 将 需 要 被 序 列 化 的 类 实 现 Serializable 接 口 , 该 接 口 没 有 需 要 实 现 的 方 法 , implements Serializable 只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个 ObjectOutputStream(对象流)对象,接着,使用 ObjectOutputStream 对象的 writeObject(Object obj)方法就可以将参数为 obj 的对象写出(即保存其状态),要恢复的话则用输入流。 

5.如何将一个 java 对象序列化到文件里?

在 java 中能够被序列化的类必须先实现 Serializable 接口,该接口没有任何抽象方法只是起到一个标记作用。 

public class Test {
    public static void main(String[] args) throws Exception {
        //对象输出流
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("D://obj")));
        objectOutputStream.writeObject(new User("zhangsan", 100));
        objectOutputStream.close();
        //对象输入流
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(new File("D://obj")));
        User user = (User) objectInputStream.readObject();
        System.out.println(user);
        objectInputStream.close();
    }
}
import java.io.Serial;
import java.io.Serializable;

/**
 *
 */
public class User implements Serializable {

    @Serial
    private static final long serialVersionUID = -4172519739434112159L;
    private String name;
    private Integer id;

    public User() {
    }

    public User(String name, Integer id) {
        this.name = name;
        this.id = id;
    }

    //getter and setter
    //toString
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43823808/article/details/117469909

智能推荐

解决《CPU设计实战》第四章实践交叉编译时报错mipsel-linux-ld: section .MIPS.abiflags LMA overlaps section .data LMA_section .arm.__at_0x00070000 lma [00001bdc,00001be-程序员宅基地

文章浏览阅读1.6k次。解决《CPU设计实战》4.3.1节快速上手CPU设计的开发环境的第4步,编译测试程序时,报错mipsel-linux-ld: section .MIPS.abiflags LMA overlaps section .data LMA的问题,或是其他相似的问题也可参考。_section .arm.__at_0x00070000 lma [00001bdc,00001beb] overlaps section .code

QR二维码编码原理_二维码qr编码算法是什么-程序员宅基地

文章浏览阅读8.4k次,点赞4次,收藏17次。QR码生成原理(一)一、什么是QR码QR码属于矩阵式二维码中的一个种类,由DENSO(日本电装)公司开发,由JIS和ISO将其标准化。QR码的样子其实在很多场合已经能够被看到了,我这还是贴个图展示一下:这个图如果被正确解码,应该看到我的名字和邮箱。二、QR码的特点说到QR码的特点,一是高速读取(QR就是取自“Quick Response”的首字母),对读取速度的体验源自于我..._二维码qr编码算法是什么

初步解析小程序前端框架vant-ui源码_微信小程序vantpopup源码-程序员宅基地

文章浏览阅读4.9k次,点赞2次,收藏2次。初步解析小程序前端框架vant-ui源码本学期的系统分析课程要求我们做一个小项目,我们以微信小程序为框架进行了项目的前端搭建,在UI上以开源组件库vant-ui为基础进行了设计,其中用到了许多该开源库的设计,对于项目前端起到了很大的帮助。组件库的使用教程在 https://youzan.github.io/vant-weapp/#/intro ,介绍说明比较详细且简单,因此这里不再赘述,这里..._微信小程序vantpopup源码

树状数组上二分-程序员宅基地

文章浏览阅读3.2k次。树状数组+二分考虑一个简单的问题,维护一个数组,支持每次修改一个数的值,保证每时每刻每个数都为非负数。每次查询求前缀和kkk lower_bound 的值。对于修改,可以用树状数组、线段树等数据结构维护。二分查找可以在[l,r][l,r][l,r]的范围上二分答案,mid=⌊l+r2⌋mid = \lfloor \frac{l+r}{2} \rfloormid=⌊2l+r​⌋,验证midmidmid的前缀和是否大于kkk,并调整midmidmid。时间复杂度O(log22n)O(log^2_2n)O_树状数组上二分

数据结构——顺序串(定义初始化、赋值、遍历、两串比较)_串的初始化-程序员宅基地

文章浏览阅读3.4k次,点赞8次,收藏47次。S;串的组成1length用length记录串的长度是为了减少后期的遍历串获取串长度的时间复杂度。如果不设置length的话,每一次获取字符串长度都需要一次循环,时间复杂度为O(n),如果设置了length的话,给串新增字符的过程中就记录当前串的长度,未来需要串的长度的时候直接获取length就可以了,时间复杂度降低为O(1)。2chch是串里的字符串。......_串的初始化

Maven的dependency中无版本号的可能情况_android studio dependencies里没有版本信息-程序员宅基地

文章浏览阅读2.3k次。pom文件的依赖无版本号的可能原因_android studio dependencies里没有版本信息

随便推点

虚拟内存_matlab2010 虚拟内存-程序员宅基地

文章浏览阅读138次。程序代码和数据。对所有的进程来说,代码是从同一固定地址开始,紧接着的是和C 全局变量相对应的数据位置。堆。代码和数据区在进程一开始运行时就被指定了大小,与此不同,当调用像 malloc 和 free 这样的 C 标准库函数时,堆可以在运行时动态地扩展和收缩。共享库。大约在地址空间的中间部分是一块用来存放像 C 标准库和数学库这样的共享库的代码和数据的区域。栈。位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数调用。和堆一样,用户栈在程序执行期间可以动态地扩展和收缩。特别地,每次我们调用..._matlab2010 虚拟内存

npm运行报错Error: EEXIST: file already exists解决办法_npm run dev error: eexist: file already exists, mk-程序员宅基地

文章浏览阅读6.5k次。如果你百度了很多方法都没有解决的话,请用管理员权限打开cmd,然后再输入npm安装命令试一试。反正我解决了_npm run dev error: eexist: file already exists, mkdir 'c:\windows\system32\c

物联网能为企业带来哪些创新?看看这些成功案例!-程序员宅基地

文章浏览阅读108次。物联网(Internet of Things,IoT)是指通过互联网连接各种设备和物品,使它们能够相互通信和交换数据的网络。在这个数字化时代,物联网已经成为了企业数字化转型的重要驱动力。通过物联网技术,企业可以实现对企业数据的实时监控、数据分析和智能化决策,从而提高企业的效率和效益,实现更高的商业价值。下面,我们将介绍一些成功的物联网应用案例,以帮助您更好地了解物联网的潜力。

阶次跟踪的角域重采样matlab,一种基于包络提取的高精度无键相信号阶次跟踪方法及系统与流程...-程序员宅基地

文章浏览阅读1.7k次。本发明涉及一种基于包络提取的高精度无键相信号阶次跟踪方法及系统,属于故障诊断技术与信号处理分析技术领域。背景技术:传统的阶次齿轮箱故障信号特征提取针对的是恒定转速运转下的测试信号,但对于工程机械等现代大型复杂机械装备中,恶劣的工作环境导致其运行工况复杂,转速和负荷等工况参数的变化将导致其振动信号具有明显的非平稳性,因此其采集的振动信号不直接满足傅里叶变换的平稳性要求。针对此问题出现了阶次跟踪方法,..._matlab阶次跟踪

python高阶知识之——字典/集合推导式_字典推导式 key自增怎么写-程序员宅基地

文章浏览阅读205次。什么是推导式:推导式是用来快速的生成数据1、推导式类型2、字典推导式推导式结合条件语句语法:dict = { key:value for i in xxx if 条件}推导式结合三元运算符语法:dict = { key:value if 条件 else key2:value2 for i in xxx}3、字典推导式原则4、注意事项5、集合推导式......_字典推导式 key自增怎么写

C语言经典编程之字符串_char ch : input-程序员宅基地

文章浏览阅读1.5k次,点赞6次,收藏18次。C语言经典编程之字符串:按特定顺序输出压缩,IP地址判断是否合法,字符串压缩、解压、排序,查找相同的字串,单词升序排列,统计单词个数,Objective-C和C++命名之争,字符串删除、插入、替换、抽取、交换、拼接、分割,统计字母在字符串中出现的次数等。_char ch : input