基础知识点-IO/NIO

1、File类型中定义了什么方法来创建一级目录?

mkdir()只能创建一级目录,mkdirs()可以创建多级目录;

2、File类型中定义的常用方法?

3、流

4、为了提高读写性能,可以采用什么流?

字节流可以采用带缓冲区的BufferedInputStream和BufferedOutputStream

字符流可以采用带缓冲区的BufferedReader和BufferedWriter。

5、Java中有几种类型的流?

字节流,字符流。

6、JDK为每种类型的流提供了一些抽象类以供继承,分别是哪些类?

字节流继承于InputStream、OutputStream,

字符流继承于Reader、Writer。

7、对文本文件操作用什么I/O流?

FileReader、FileWriter

8、对各种基本数据类型和String类型的读写,采用什么流?

DataInputStream、DataOutputStream

9、能指定字符编码的I/O流类型是什么?

BufferedReader/BufferedWriter

BufferedInputStream/BufferedOutputStream

10、什么是比特(Bit),什么是字节(Byte),什么是字符(Char),它们长度是多少,各有什么区别?

1)Bit:最小的二进制单位,是计算机的操作部分,取值0或1

2)Byte:计算机操作数据的最小单位,由8位bit组成,取值范围(-128~127) 

3)Char:用户可读写的最小单位,java里由16位bit组成,取值范围(0-65535)

11、如何实现对象克隆?深拷贝和浅拷贝区别?

1)实现Cloneable接口

2)复写Object类中的clone()

深拷贝与浅拷贝,简单来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明是浅拷贝,如果B没变,就是深拷贝。

12、什么是序列化?如何实现Java序列化及注意事项?

将一个java对象以字节流的形式传出去或从一个字节流中恢复成一个java对象;

例如要将java对象存储到硬盘或传送给网络上的其他计算机,我们可以把一个java对象变成某个格式的字节流再传输,jre本身提供了这种支持,可以调用OutputStream的writeObject方法来做,如果让java做,被传输的对象必须实现serializable接口,这样javac编译时就会进行特殊处理,编译的类才可以被writeObject方法操作,这就是序列化。

需要被序列化的类必须实现Serializable接口,该接口是一个mini接口,其中没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的。

13、Serializable与Externalizable的区别?

1)Serializable序列化时不会调用默认的构造器,Externalizable序列化时会调用默认构造器的

2)Serializable:一个对象想要被序列化,那么它的类就要实现此接口,这个对象的所有属性都可以被序列化和反序列化来保存、传递。 

Externalizable:是Serializable接口的子类,有时我们不希望序列化那么多,可以使用这个接口,这个接口的writeExternal()和readExternal()方法可以指定序列化哪些属性。

对象序列化包括如下步骤:

1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;

2) 通过对象输出流的writeObject()方法写对象。

对象反序列化的步骤如下:

1) 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;

2) 通过对象输入流的readObject()方法读取对象。

14、socket选项TCP NO DELAY是指什么?

TCP_NODELAY选项用来控制是否开启Nagle算法,该算法是为了提高较慢的广域网传输效率,减少小分组的报文个数;该算法要求一个TCP连接上最多只能有一个未被确认的小分组,在该小分组的确认到来前,不能发送其他小分组。

小分组指的是报文长度小于MSS(Max Segment Size)长度的分组(MSS是在TCP握手时在报文选项里面进行通告的大小,主要是用来限制另一端发送数据的长度,防止IP数据包被分段,提高效率,一般是链路层的最大传输单元大小减去IP首部与TCP首部大小)。

如果小分组的确认ACK一直没有回来,那么就可能会触发TCP超时重传的定时器。

15、Socket工作在TCP/IP协议栈是哪一层?

socket的实现部分,就是系统协议栈部分,应该包含了网络层 (ip), 传输层(tcp/udp)等;

16、TCP、UDP区别及Java实现方式?

TCP面向连接,UDP面向非连接;

TCP建立连接时需要三次握手,服务端与客户端需要确认对方身份,建立好连接后,就开始传递消息,直到有一方断开连接位。 就好比两个人打电话,要先通了才能说话。

UDP只是数据报文发送,优点速度快,并非像TCP那样麻烦,它只负责将信息发出,并不确保信息的准确完整性等,就好比发短信,短信是出去了,中间是否有问题,对方手机能否收到就不管了。

在java中想要实现上述两种协议通信,可采用socket建立连接,socket可以理解为码头,其实是套接字,就好比两个城市运输货物,通过码头走货一样。

17、说几点 IO 的最佳实践

1)使用有缓冲区的IO类,不要单独读取字节或字符。

2)使用NIO和NIO2

3)在finally块中关闭流,或使用try-with-resource语句。

4)使用内存映射文件获取更快的IO。

18、直接缓冲区与非直接缓冲器有什么区别?

OutputStream非直接缓冲区:通过allocate()分配缓冲区,将缓冲区建立在JVM内存中。

BufferedOutputStream直接缓冲区:通过allocateDirect()分配直接缓冲区,将缓冲区建立在物理内存中,提高效率。通过减小写数据的时间而提高性能,可以调用flush()生成缓冲器中待写数据。

19、怎么读写 ByteBuffer?ByteBuffer中的字节序是什么?

ByteBuffer包含两个实现方式:HeapByteBuffer是基于Java堆的实现,DirectByteBuffer则使用了unsafe的API进行了堆外的实现。

核心方法是put(byte)和get(),分别是往ByteBuffer里写一个字节,和读一个字节。ByteBuffer的读写模式是分开的,正常的应用场景是:往ByteBuffer里写一些数据,然后flip(),然后再读出来。

一个ByteBuffer的使用过程是这样的:

1)byteBuffer = ByteBuffer.allocate(N);    //创建

2)readableByteChannel.read(byteBuffer);   //读取数据,写入byteBuffer

3)byteBuffer.flip();              //变读为写

4)writableByteChannel.write(byteBuffer);   //读取byteBuffer,写入数据

字节序:JVM中多字节类型数据的存放顺序,JAVA字节序也是BIG-ENDIAN。

字节序分为两种:

BIG-ENDIAN—大字节序,最低地址存放最高有效字节

LITTLE-ENDIAN—小字节序,最低地址存放最低有效字节

20、用System.in.read(buffer)从键盘输入一行n个字符后,存储在缓冲区buffer中的字节数是多少?

存储在缓冲区buffer中的字节数有n+2个,即除输入n个字符后,还存储了回车和换行字符。

21、如何使用扫描器类(Scanner Class)令牌化?

private static void tokenizeUsingScanner(String string,String regex) {

    Scanner scanner = new Scanner(string);

    scanner.useDelimiter(regex);

    List matches = new ArrayList();

    while(scanner.hasNext()){

        matches.add(scanner.next());

    }

    System.out.println(matches);

}

tokenizeUsingScanner("ac;bd;def;e",";");//[ac, bd, def, e]

22、内存映射缓存区是什么MappedByteBuffer?

MappedByteBuffer是java nio引入的文件内存映射方案,读写性能极高。NIO最主要的就是实现了对异步操作的支持。其中一种通过把一个套接字通道(SocketChannel)注册到一个选择器(Selector)中,不时调用后者的选择(select)方法就能返回满足的选择键(SelectionKey),键中包含了SOCKET事件信息,这就是select模型。

MappedByteBuffer将文件直接映射到虚拟内存,通常可以映射整个文件,如果文件比较大的话可以分段映射,只要指定文件的哪个部分就可以。

三种方式:FileChannel提供了map方法来把文件影射为内存映像文件:MappedByteBuffer map(int mode,long position,long size); 可以把文件从position开始的size大小的区域映射为内存映像文件,mode指出了 可访问该内存映像文件的方式:READ_ONLY,READ_WRITE,PRIVATE。

READ_ONLY(只读):试图修改得到的缓冲区将导致抛出ReadOnlyBufferException

READ_WRITE(读/写):对得到的缓冲区更改最终将传播到文件,该更改对映射到同一文件的其他程序不一定是可见的。

PRIVATE(专用): 对得到的缓冲区更改不会传播到文件,并且该更改对映射到同一文件的其他程序也不是可见的;相反会创建缓冲区已修改部分的专用副本。

三个方法:

force()缓冲区是READ_WRITE模式下,此方法对缓冲区内容修改强行写入文件

load()将缓冲区的内容载入内存,并返回该缓冲区的引用

isLoaded()如果缓冲区的内容在物理内存中,则返回真,否则返回假

三个特性:调用信道的map()方法后,即可将文件的某一部分或全部映射到内存中,映射内存缓冲区是个直接缓冲区,继承自ByteBuffer,但相对于ByteBuffer,它有更多的优点:读取快、写入快、随时随地写入。

23、IO 和 NIO的区别,NIO优点?

IO是面向流的,NIO是面向缓冲区的。

IO的各种流是阻塞的,NIO的非阻塞模式。

NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。

nio的优势为:

1)不需要使用read()或者write()操作就可以处理文件内容

2)修改文件后,修改自动flush到文件

3)nio方式处理效率很快

你可能感兴趣的:(基础知识点-IO/NIO)