Java IO流处理 面试题汇总

2023-11-01

说明:本节内容来源于网络汇总

这里写图片描述

这里写图片描述

输入输出流是相对于内存而言的!

##1、面试题汇总

(1)java中有几种类型的流?

2021-08-19更新:
从编码方式上,分为字符流和字节流。

如上图可知:

  • 字节流继承inputStream和OutputStream
  • 字符流继承自Reader和Writer。

(2)谈谈Java IO里面的常见类,字节流,字符流、接口、实现类、方法阻塞

答:输入流就是从外部文件输入到内存,输出流主要是从内存输出到文件。
IO里面常见的类,第一印象就只知道IO流中有很多类,IO流主要分为字符流和字节流。字符流中有抽象类InputStream和OutputStream,它们的子类FileInputStream,FileOutputStream,BufferedOutputStream等。字符流BufferedReader和Writer等。都实现了Closeable, Flushable, Appendable这些接口。程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。
java中的阻塞式方法是指在程序调用改方法时,必须等待输入数据可用或者检测到输入结束或者抛出异常,否则程序会一直停留在该语句上,不会执行下面的语句。比如read()和readLine()方法。

(3)字符流和字节流有什么区别?

要把一片二进制数据数据逐一输出到某个设备中,或者从某个设备中逐一读取一片二进制数据,不管输入输出设备是什么,我们要用统一的方式来完成这些操作,用一种抽象的方式进行描述,这个抽象描述方式起名为IO流,对应的抽象类为OutputStream和InputStream ,不同的实现类就代表不同的输入和输出设备,它们都是针对字节进行操作的。

在应用中,经常要完全是字符的一段文本输出去或读进来,用字节流可以吗?
计算机中的一切最终都是二进制的字节形式存在。对于“中国”这些字符,首先要得到其对应的字节,然后将字节写入到输出流。读取时,首先读到的是字节,可是我们要把它显示为字符,我们需要将字节转换成字符。由于这样的需求很广泛,人家专门提供了字符流的包装类。

底层设备永远只接受字节数据,有时候要写字符串到底层设备,需要将字符串转成字节再进行写入。字符流是字节流的包装,字符流则是直接接受字符串,它内部将串转成字节,再写入底层设备,这为我们向IO设别写入或读取字符串提供了一点点方便。

(4)讲讲NIO

答:看了一些文章,传统的IO流是阻塞式的,会一直监听一个ServerSocket,在调用read等方法时,他会一直等到数据到来或者缓冲区已满时才返回。调用accept也是一直阻塞到有客户端连接才会返回。每个客户端连接过来后,服务端都会启动一个线程去处理该客户端的请求。并且多线程处理多个连接。每个线程拥有自己的栈空间并且占用一些 CPU 时间。每个线程遇到外部未准备好的时候,都会阻塞掉。阻塞的结果就是会带来大量的进程上下文切换。
对于NIO,它是非阻塞式,核心类:
1.Buffer为所有的原始类型提供 (Buffer)缓存支持。
2.Charset字符集编码解码解决方案
3.Channel一个新的原始 I/O抽象,用于读写Buffer类型,通道可以认为是一种连接,可以是到特定设备,程序或者是网络的连接。

(5)递归读取文件夹的文件

package test;

import java.io.File;

/**
 * 
 * 递归读取文件夹的文件
 */
public class ListFileDemo {
	public static void listFile(String path) {
		if (path == null) {
			return;// 因为下面的new File如果path为空,回报异常
		}
		File[] files = new File(path).listFiles();
		if (files == null) {
			return;
		}
		for(File file : files) {
			if (file.isFile()) {
				System.out.println(file.getName());
			} else if (file.isDirectory()) {
				System.out.println("Directory:"+file.getName());
				listFile(file.getPath());
			} else {
				System.out.println("Error");
			}
		}
	}

	public static void main(String[] args) {
		ListFileDemo.listFile("D:\\data");

	}
}

这里写图片描述
运行结果

Hamlet.txt
Directory:ml-1m
movies.dat
ratings.dat
README
users.dat

2、Java IO总结

(1)明确源和目的。
数据source:就是需要读取,可以使用两个体系:InputStream、Reader;
数据destination:就是需要写入,可以使用两个体系:OutputStream、Writer;

(2)操作的数据是否是纯文本数据?

   如果是:
           数据source:Reader
           数据destination:Writer 
   如果不是:
           数据source:InputStream
           数据destination:OutputStream

(3)Java IO体系中有太多的对象,到底用哪个呢?
明确操作的数据设备。
数据source对应的设备:硬盘(File)内存(数组)键盘(System.in)
数据destination对应的设备:硬盘(File),内存(数组),控制台(System.out)

记住,只要一读取键盘录入,就用这句话。
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java IO流处理 面试题汇总 的相关文章

  • 车规级MCU知识介绍

    一辆传统燃油车需要大约500到600颗芯片 轻混汽车大约需要1000颗 插电混动和纯电动汽车则需要至少2000颗芯片 这就意味着在智能电动汽车快速发展的过程中 不仅对先进制程芯片需求不断增加 而且对传统芯片需求也会持续增加 MCU就是这样

随机推荐

  • PXE装机报错汇总

    报错1 PXE E53 No boot filename received CLIENT MAC ADDR 88 0C 29 0D 88 3C GUID 564D6429 2E4A 0B83 6161 AE0A050D803C PXE MB
  • 【持续集成CI/持续部署CD】二、Docker安装Maven私服Nexus

    本文是关于通过 Docker 进行安装部署 Nexus3 私服的快速入门和简单使用案例 一 安装 1 通过 docker 获取最新版本的 nexus3 镜像 docker pull sonatype nexus3创建 docker 镜像到宿
  • Pytorch中交叉熵损失函数 nn.CrossEntropyLoss()计算过程

    pytorch的交叉熵损失函数是如何计算outputs和 labels之间的损失的 对于一个分类问题的CNN模型 最后一层的代码一般如下 nn Linear 2048 num classes 然后计算一次迭代损失的代码一般如下 loss f
  • 国教 2019级 算法设计与分析 作业集锦(期末作业)

    7 1 寻找第k小的数 20 分 给定若干整数 请设计一个高效的算法 确定第k小的数 输入格式 测试数据有多组 处理到文件尾 每组测试数据的第1行输入2个整数n k 1 k n 1000000 第2行输入n个整数 每个数据的取值范围在0到1
  • Linux内核的配置和编译

    文章目录 前言 1 内核介绍 2 linux内核源码目录结构 3 内核配置和编译实验 4 内核的配置原理 5 menuconfig 6 Kconfig文件详解 7 menuconfig的实验 前言 以下内容基于2 6 35 7版本内核 文件
  • MyBatis和Hibernate相比,优势在哪里

    看到现在好多Web项目用了MyBatis 没感觉MyBatis好到哪里了 从开发效率上讲 不管是Hibernate的反向工程 还是自动建表 关联映射都比MyBatis方便得多 难道仅仅是因为运行速度 Hibernate也有缓存啊 或者 二者
  • 生成带有目录的Markdown格式文档

    什么是Markdown Markdown 是一种轻量级的 标记语言 它的优点很多 目前也被越来越多的写作爱好者 撰稿者广泛使用 使用 Markdown 的优点 专注你的文字内容而不是排版样式 轻松的导出 HTML PDF 和本身的 md 文
  • 性能测试出现:java.net.NoRouteToHostException: Can‘t assign requested address (Address not available)解决方案

    前言 在性能测试中会常常遇到java net NoRouteToHostException Can t assign requested address Address not available 这个问题 什么原因导致的呢 这个原因不一定
  • 全网最全Log配置教程及框架性能比较,看这篇就够了!

    每天早上七点三十 准时推送干货 一 摘要 不管是使用何种编程语言 何种框架 日志输出几乎无处不再 也是任何商业软件中必不可少的一部分 总结起来 日志的用途大致可以归纳成以下三种 问题追踪 通过日志不仅仅包括我们程序的一些bug 也可以在安装
  • VS堆栈溢出异常

    总是会遇到报堆栈溢出异常未处理错误 解决过几次 但是下次还是忘记怎么处理 所以写在博客上做个笔记 错误如图 解决方法 项目解决方案里右键项目 选择属性 在堆栈保留处输入40000000 4G64位电脑经验值 8G内存就要输入80000000
  • TiDB数据库权限管理

    TiDB数据库权限管理 TiDB 的权限管理系统按照 MySQL 的权限管理进行实现 TiDB 支持大部分的 MySQL 的语法和权限类型 本文主要介绍 TiDB 权限相关操作 各项操作需要的权限以及权限系统的实现 权限相关操作 授予权限
  • 将vue默认下载项yarn切换成npm

    今天在使用vue下载时发现 之前默认的npm变成了yarn 不习惯 下面将介绍如何将vue下载默认项yarn切换成npm 第一步 需要找到文档下的 vuerc 第二步 用编辑器 或者可以打开文本的软件 将其打开 打开后是这样的 第三步 其实
  • IDEA的查询引用、调用关系图的功能

    Eclipse的 Call Hierarchy 可以查看一个Java方法或类成员变量的调用树 caller和callee两个方向 非常方便 在IDEA中类似功能被划分到了三个命令 IntelliJ IDEA中可以在主菜单中选择Navigat
  • Git报错 Incorrect username or password (access token) 的解决方式

    错误原因 在使用git的时候 出现 Incorrect username or password access token 这个报错主要就是代表本地保存的gitee或者GitHub的账号还有密码错误 而他们这些账号密码都保存到了window
  • 移动端网络优化

    http b codekk com detail Trinea E7 A7 BB E5 8A A8 E7 AB AF E7 BD 91 E7 BB 9C E4 BC 98 E5 8C 96 一个网络请求可以简单分为连接服务器 gt 获取数据
  • centos python 升级3.7 及pip

    centos 7 6 1810 python3 6升级3 7 查看系统版本 开始升级 1 下载Python 3 7 0 tgz软件包 2 解压编译 3 更改默认python版本 pip2消失的话 查看系统版本 cat etc redhat
  • OSI七层协议大白话解读

    互联网的本质就是一系列的网络协议 这个协议就叫OSI协议 一系列协议 按照功能不同 分工不同 人为的分层七层 实际上这个七层是不存在的 没有这七层的概念 只是人为的划分而已 区分出来的目的只是让你明白哪一层是干什么用的 每一层都运行不同的协
  • Python的学习记录

    Python The Zen of Python by Tim Peters Beautiful is better than ugly Explicit is better than implicit Simple is better t
  • Docker安装与配置阿里云镜像加速

    一 Docker简介 1 Docker是什么 产生背景 开发和运维之间因为环境不同而导致的矛盾 不同的操作系统 软件环境 应用配置等 DevOps 集群环境下每台服务器都配置相同的环境 太麻烦 解决 在我的机器上可以正常工作 的问题 Doc
  • Java IO流处理 面试题汇总

    说明 本节内容来源于网络汇总 输入输出流是相对于内存而言的 1 面试题汇总 1 java中有几种类型的流 2021 08 19更新 从编码方式上 分为字符流和字节流 如上图可知 字节流继承inputStream和OutputStream 字