文章目录
关于javaIO流部分参考链接: https://blog.csdn.net/qq_44715943/article/details/116501936
Bit,Byte,Char之间的区别?
Bit最小的二进制单位 ,是计算机的操作部分取值0或者1。
Byte是计算机中存储数据的单元,是一个8位的二进制数,(计算机内部,一个字节可表示一个英文字母,两个字节可表示一个汉字。) 取值(-128-127)
Char是用户的可读写的最小单位,他只是抽象意义上的一个符号。如‘5’,‘中’,‘¥’等等。在java里面由16位bit组成Char 取值(0-65535)
Bit 是最小单位 计算机他只能认识0或者1
Byte是8个字节 是给计算机看的
字符 是看到的东西 一个字符=二个字节
Java中有几种类型的流?
按照流的方向:输入流(inputStream)和输出流(outputStream)
按照实现功能分:节点流(可以从或向一个特定的地方(节点)读写数据。如FileReader)和处理流(是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader.。处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。)
按照处理数据的单位:字节流和字符流。字节流继承于InputStream和OutputStream,字符流继承于InputStreamReader和OutputStreamWriter.
字节流和字符流的区别★★★
字节流和字符流是 Java IO 中两种基本的输入输出流类型。
字节流(Byte Stream)用于处理二进制数据,如图像、音频、视频等。它以字节为单位读取和写入数据,可以处理任何类型的数据,包括文本、二进制文件等。Java 提供了 FileInputStream、ByteArrayInputStream、BufferedInputStream 等字节流类。
字符流(Character Stream)用于处理文本数据,如文本文件等。它以字符为单位读取和写入数据,只能处理 ASCII 码表中的字符。Java 提供了 FileReader、BufferedReader、ReaderWriter 等字符流类。
在实际应用中,我们通常需要同时使用字节流和字符流来处理不同类型的数据。例如,在使用网络协议进行通信时,我们需要使用字节流来传输数据;而在使用文本文件进行读写操作时,则需要使用字符流。
String, StringBuffer,StringBuilder的区别?★★★
String、StringBuffer 和 StringBuilder 都是 Java 中用于处理字符串的类,它们的区别如下:
- String 是一个不可变对象,一旦被创建就无法被改变。对 String 进行修改操作时,会创建一个新的 String 对象。因此在频繁修改字符串时,创建大量的 String 对象会导致内存浪费。
- StringBuffer 是可变对象,可以进行字符串修改操作而不是创建新的对象。对 StringBuffer 进行修改操作时,不会创建新的字符串对象,而是直接修改原有的对象。因此,使用 StringBuffer 可以提高程序的性能。
- StringBuilder 也是可变对象,它提供了与 StringBuffer 相同的功能,但是相对于 StringBuffer 来说,StringBuilder 在执行效率上更高,因为它不需要创建新的字符串对象。
在使用上,一般情况下应该优先考虑使用 StringBuilder,只有在需要返回一个可变字符串时才使用 StringBuffer。如果只需要对字符串进行简单的修改操作,则可以使用 String 类型。
对数据流的了解,JavaIO部分?
Java IO(Input/Output)是Java编程语言中用于读写数据的模块。它提供了一组类和接口,可以方便地进行文件读写、网络通信等操作。其中,数据流(Data Stream)是Java IO的一个重要概念。
Java IO中的数据流可以分为字节流和字符流两种类型。字节流适用于处理二进制数据,如图片、音频、视频等;字符流适用于处理文本数据,如文件内容、网络传输等。
在Java IO中,常用的数据流类有:
- FileInputStream:从文件中读取字节流
- FileOutputStream:向文件中写入字节流
- DataInputStream:从文件或网络连接中读取字节流
- DataOutputStream:从文件或网络连接中写入字节流
- BufferedInputStream:带有缓存的字节流输入流
- BufferedOutputStream:带有缓存的字节流输出流
除了基本的数据流类外,Java IO还提供了许多高级的数据流类和接口,如ObjectInputStream和ObjectOutputStream、Reader和Writer等,可以满足更多的读写需求。
Java中Filter流的作用?
Java Filter流是一种I/O流,它可以在读取输入数据或写入输出数据之前或之后对数据进行预处理或过滤。它的主要作用是在处理文件或流之前或之后对数据进行某种变换或过滤操作,例如,可以将输入的数据进行解密、压缩或转换为其它格式,也可以过滤掉一些无用的数据,以减少对存储空间或带宽的占用。
在Java程序中,Filter流通常作为其它输入/输出流的装饰器使用,将其它的I/O流包装起来,以增加它们的功能。
在java.io包中主要由4个可用的filter Stream。两个字节filter stream,两个字符filter stream.分别是FilterInputStream,FilterOutputStream,FilterReader and FilterWriter…这些类是抽象类,不能被实例化的。
I/O(阻塞、非阻塞,同步、异步)
同步:一个任务的完成之前不能做其他操作,必须等待(等于在打电话)
异步:一个任务的完成之前,可以进行其他操作(等于在聊QQ)
阻塞:是相对于CPU来说的, 挂起当前线程,不能做其他操作只能等待
非阻塞:无须挂起当前线程,可以去执行其他操作
阻塞IO与非阻塞IO的区别
阻塞IO,指的是需要内核IO操作彻底完成后,才返回到用户空间执行用户的操作。阻塞是指用户空间的执行状态。
非阻塞IO,指的是用户空间的程序不需要等待内核IO操作彻底完成,可以立即返回用户空间执行用户操作,即处于非阻塞IO状态,内核空间会立即返回给用户一个状态值。
阻塞IO:调用线程一直在等待,不能干别的事情。
非阻塞IO:调用线程拿到内核返回的状态值后,IO操作能干就干2,不能就干别的事情。
BIO和NI0和AIO的区别以及应用场景?
同步:java自己去处理io。
异步:java将io交给操作系统去处理,告诉缓存区大小,处理完成回调。
阻塞:使用阻塞IO时,Java调用会一直阻塞到读写完成才返回。
非阻塞:使用非阻塞IO时,如果不能立马读写,Jva调用会马上返回,当o事件分发器通知可读写时在进行读写,不断循环直到读写完成。
BIO:同步并阻塞,服务器的实现模式是一个连接一个线程,这样的模式很明显的一个缺陷是:由于客户端连接数与服务器线程数成正比关系,可能造成不必要的线程开销,严重的还将导致服务器内存流出。当然,这种情况可以通过线程池机制改善,但并不能从本质上消除这个弊端。
NIO:在JDK1.4以前,Java的IO模型一直是BIO,但从DK1.4开始,JDK引入的新的IO模型NIO,它是同步非阻塞的。而服务器的实现模式是多个请求一个线程,即请求会注册到多路复用器Selector上,多路复用器轮询到连接有IO请求时才启动一个线程处理。
AIO:JDK1.7发布了NIO2.0,这就是真正意义上的异步非阻塞,服务器的实现模式为多个有效请求一个线程,客户端的IO请求都是由OS先完成再通知服务器应用去启动线程处理(回调)。
应用场景:并发连接数不多时采用BIO,因为它编程和调试都非常简单,但如果涉及到高并发的情况,应选择NIO或AIO,更好的建议是采用成熟的网络通信框Netty。
什么是缓冲区?有什么作用
- 缓冲区就是一段特殊的内存区域,很多情况下当程序需要频繁地操作一个资源(如文件或数据库)则性能会很低,所以为了提升性能就可以将一部分数据暂时读写到缓存区,以后直接从此区域中读写数据即可,这样就显著提升了性。
- 对于 Java 字符流的操作都是在缓冲区操作的,所以如果我们想在字符流操作中主动将缓冲区刷新到文件则可以使用 flush() 方法操作。
什么是Java序列化,反序列化?
- 序列化就是一种用来处理对象流的机制,将对象的内容进行流化。可以对流化后的对象进行读写操作,可以将流化后的对象传输于网络之间。序列化是为了解决在对象流读写操作时所引发的问题
- 序列化的实现:将需要被序列化的类实现Serialize接口,没有需要实现的方法,此接口只是为了标注对象可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,再使用ObjectOutputStream对象的write(Object obj)方法就可以将参数obj的对象写出