Java开发岗位面试题归类汇总二:Java IO

时间:2021-08-13 16:48:40

1、讲讲IO里面的常见类,字节流,字符流、接口、实现类、方法阻塞

答:输入流就是从外部文件输入到内存,输出流主要是从内存输出到文件。我们用Eclipse开发小程序在控制台输入数据就属于输入流,即从控制台输入到内存。

IO里面常见的类,第一印象就只知道IO流中有很多类,IO流主要分为字符流和字节流。字符流中有抽象类InputStream和OutputStream,它们的子类FileInputStream,FileOutputStream,BufferedOutputStream等。字符流BufferedReader和Writer等。都实现了Closeable, Flushable, Appendable这些接口。程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。

java中的阻塞式方法是指在程序调用改方法时,必须等待输入数据可用或者检测到输入结束或者抛出异常,否则程序会一直停留在该语句上,不会执行下面的语句。比如read()和readLine()方法。

http://blog.csdn.net/sinat_26888717/article/details/47999637,写的很好,可以看看。

这个是很多的例子:http://www.cnblogs.com/ShawnWithSmallEyes/p/3390740.html

2、讲讲NIO

答:看了一些文章,传统的IO流是阻塞式的,会一直监听一个ServerSocket,在调用read等方法时,他会一直等到数据到来或者缓冲区已满时才返回。调用accept也是一直阻塞到有客户端连接才会返回。每个客户端连接过来后,服务端都会启动一个线程去处理该客户端的请求。并且多线程处理多个连接。每个线程拥有自己的栈空间并且占用一些 CPU 时间。每个线程遇到外部未准备好的时候,都会阻塞掉。阻塞的结果就是会带来大量的进程上下文切换。

对于NIO,它是非阻塞式,核心类:

1.Buffer为所有的原始类型提供 (Buffer)缓存支持。

2.Charset字符集编码解码解决方案

3.Channel一个新的原始 I/O抽象,用于读写Buffer类型,通道可以认为是一种连接,可以是到特定设备,程序或者是网络的连接。

这个大家时JDk1.7的新特性,可以看视频仔细研究

参考:http://www.open-open.com/lib/view/open1420790598093.html

3、String编码UTF-8和GBK的区别

答:UTF-8是国际通用的编码,通用性比较好,GBK是国家编码,支持中文,但是相比UTF-8的通用性差,不过UTF-8占用的数据库比较大,所以相对反应速度要慢。

4、什么时候使用字节流,什么时候    使用字符流

答:所有的输入都是转换成字节流之后,然后在内存中变成字符流。所以一般建议使用字符流。但是遇到中文汉字,出现乱码的情况下,可以使用字节流。

在所有的硬盘上保存文件或进行传输的时候都是以字节的方法进行的,包括图片也是按字节完成,而字符是只有在内存中才会形成的,所以使用字节的操作是最多的。我们建议尽量尝试使用字符流,一旦程序无法成功编译,就不得不使用面向字节的类库,即字节流。

5、递归读取文件夹的文件,代码怎么实现

答:利用File中的listFiles方法,将所有文件保存访问,然后递归调用。代码如下:

publicclass Test {

  publicvoidvisitFile(String path){

     if(path==null){

       return;//因为下面的new File如果path为空,回报异常

     }

     File[] files=new File(path).listFiles();

     if(files==null){

       return;

     }

     for(Filefile:files){

       if(file.isFile()){

         System.out.println(file.getName());

       }elseif(file.isDirectory()){

         System.out.println("Directory");

         visitFile(file.getPath());

       }else{

         System.out.println("Error");

       }

     }

    

  }

  publicstatic voidmain(String[]args) {

     Test dc = new Test();

     dc.visitFile("F:/华科文件");

  }

}