FAQ Java IO

### BIO、NIO、AIO有什么区别

### java.io中流分为几种
按传输方向分为输入流(InputStream),输出流(OutputStream)。
按内容分为字节流(*Stream),字符流(*Reader、*Writer)。
按功能分为节点流(OutputStream),处理流(OutputStreamWriter)。

### 三个socket,需要多少个线程来处理
使用 java.nio.Selector 可实现单线程处理多个socket。

### Java 中怎么创建 ByteBuffer
首先 ByteBuffer 是抽象类,所以它提供了4个静态方法来创建它的子类实例。
allocate(int capacity)
allocateDirect(int capacity)
wrap(byte [] array)
wrap(byte [] array, int offset, int length)

### Java 采用的是大端还是小端?ByteBuffer 中的字节序是什么?
默认大端。可通过 ByteBuffer类中的order(ByteOrder bo) 设置为小端。
https://blog.csdn.net/aloserbird/article/details/78089962
https://howtodoinjava.com/java/basics/little-endian-and-big-endian-in-java/

### Java 中,直接缓冲区与非直接缓冲器有什么联系与区别
非直接缓冲区:通过allocate()分配缓冲区,将缓冲区建立在JVM的内存中
直接缓冲区:通过allocateDirect()分配直接缓冲区,将缓冲区建立在物理内存中,可以提高效率

### Java 中的内存映射缓存区是什么?
1.内存映射文件 I/O 是一种读和写文件数据的方法,它可以比常规的基于流或者基于通道的 I/O 快得多。
2.内存映射文件 I/O 是通过使文件中的数据神奇般地出现为内存数组的内容来完成的。
3.内存映射并不真的神奇或者多么不寻常。现代操作系统一般根据需要将文件的部分映射为内存的部分,从而实现文件系统.
4.内存映射机制不过是在底层操作系统中可以采用这种机制时,提供了对该机制的访问。 尽管创建内存映射文件相当简单,但是向它写入可能是危险的。仅只是改变数组的单个元素这样的简单操作,就可能会直接修改磁盘上的文件。修改数据与将数据保存到磁盘是没有分开的。
5.将一个FileChannel映射到内存中,将使用 FileChannel.map() 方法。map() 方法返回一个 MappedByteBuffer,它是 ByteBuffer 的子类。可以像使用 ByteBuffer 一样使用映射的缓冲区,操作系统会在需要时负责执行映射。

## socket 选项 TCP_NODELAY 是指什么?
TCP_NODELAY选项是用来控制是否开启Nagle算法,该算法是为了提高较慢的广域网传输效率,减小小分组的报文个数。该算法要求一个TCP连接上最多只能有一个未被确认的小分组,在该小分组的确认到来之前,不能发送其他小分组。
这里的小分组指的是报文长度小于MSS(Max Segment Size)长度的分组(MSS是在TCP握手的时候在报文选项里面进行通告的大小,主要是用来限制另一端发送数据的长度,防止IP数据包被分段,提高效率,一般是链路层的传输最大传输单元大小减去IP首部与TCP首部大小)。

### 说说Filter流
Filter Stream可以给已有的Stream增加一些额外的功能,例如给目标文件增加行数。
主要有FilterInputStream,FilterOutputStream,FilterReader和FilterWriter。这些都是抽象类,不能实例化。但可以通过它们提供的静态方法调用子类:
LineNumberInputStream 给目标文件增加行号
DataInputStream 有些特殊的方法如readInt(),readDouble()和readLine()等可以读取一个int,double和一个string
BufferedInputStream 增加性能
PushbackInputStream 推送要求的字节到系统中

### SequenceInputStream的作用
这个类的作用是将多个输入流合并成一个输出流,通过SequenceInputStream类包装后形成新的一个总的输入流。在拷贝多个文件到一个目标文件的时候是非常有用的。可以使用很少的代码实现。

### PrintStream 和 PrintWriter
都是打印输出流,它们两个的功能相同,但是属于不同的分类。字节流和字符流,它们都有print()方法。

### 在拷贝的时候,哪一种流能提升性能?
使用 BufferedInputStream、BufferedOutputStream 或 BufferedReader、BufferedWriter。

### 有哪些管道流
有四种管道流,PipedInputStream,PipedOutputStream,PipedReader和PipedWriter。在多个线程或进程中传递数据的时候管道流非常有用。

### RandomAccessFile
随机流:在java.io包中有一个特殊的类,既不是输入流也不是输出流,但两者都可以做到。他是Object的直接子类。通常来说,一个流只有一个功能,要么读,要么写。但是RandomAccessFile既可以读文件,也可以写文件,DataInputStream和DataOutStream有的方法,在RandomAccessFile都存在。

### 怎么样把我们控制台的输出改成输出到一个文件里面,这个技术叫什么
SetOut(printWriter,printStream)重定向

### ByteBuffer
position:当前读取的位置
mark:为某一读过的位置做标记,便于有时候回退到该位置
capacity:初始化时候的容量
limit:读写的上限,limit <= capacity
read()
write() 读写的方法
flip() limit设为当前position,position设为0
clear() position设为0
mark() 标记
reset() 回到标记

### serialVersionUID 有什么用
实现Serializable接口时一般要生成一个是版本号,保持版本号的一致,来进行序列化。

猜你喜欢

转载自www.cnblogs.com/mougg/p/11108102.html
FAQ
今日推荐