Java IO面试题

在 Java 程序中,我有三个 socket,我需要多少个线程来处理?
Java 中怎么创建 ByteBuffer?

   ByteBuffer定义了4个static方法来做创建工作: 
  			ByteBuffer allocate(int capacity) //创建一个指定capacity的ByteBuffer。 
  			ByteBuffer allocateDirect(int capacity) //创建一个direct的ByteBuffer,这样的ByteBuffer在参与IO操作时性能会更好
  			ByteBuffer wrap(byte [] array) 
  			ByteBuffer wrap(byte [] array, int offset, int length) //把一个byte数组或byte数组的一部分包装成ByteBuffer。  

Java 采用的是大端还是小端?ByteBuffer 中的字节序是什么?
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是一种IO流主要作用是用来对存在的流增加一些额外的功能,像给目标文件增加源文件中不存在的行数,或者增加拷贝的功能。

有哪些可用的Filter流?

在java.io包中主要有4个可用的filterStream。两个字节filterStream,两个字符filterStream。分别是FilterInputStream,FilterOutputStream,FilterReader 和FilterWriter。这些类是抽象类,不能被实例化。
Filter流的子类:
    LineNumberInputStream 给目标文件增加行号
    DataInputStream 有些特殊的方法如readInt(),readDouble()和readLine()等可以读取一个int,double和一个string
    BufferedInputStream 增加性能
    PushbackInputStream 推送要求的字节到系统中

SequenceInputStream的作用

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

PrintStream和PrintWriter

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

在拷贝的时候,哪一种流能提升更多的性能?

在字节流的时候,使用BufferedInputStream和BufferedOutputStream。
在字符流的时候,使用BufferedReader和BufferedWriter

管道流

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

File类

它不属于流,也不是用于文件的操作,它主要用于指导一个文件的属性,读写权限,大小等信息。
注意:Java7中文件IO发生了很大的变化,专门引入了很多新的类来取代原来的基于java.io.File的文件IO操作方式。

RandomAccessFile

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

怎么样把我们控制台的输出改成输出到一个文件里面,这个技术叫什么

 SetOut(printWriter,printStream)重定向 

ByteBuffer

    ByteBuffer主要由是由装数据的内存缓冲区和操作数据的4个指针变量(mark标记,position位置, limit界限,capacity容量)组成
    read()、write() 读写的方法
    flip()方法写完数据需要开始读的时候,将position复位到0,并将limit设为当前position
    clear()方法是将position置为0,并不清除buffer内容	
    mark()方法是标记,reset()方法是回到标记
    ByteBuffer内部字段:
    	position:当前读取的位置
    	mark:为某一读过的位置做标记,便于有时候回退到该位置
    	capacity:初始化时候的容量
    	limit:读写的上限,limit <= capacity
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值