Java IO面试

时间:2023-03-09 03:20:52
Java IO面试

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

字节流和字符流的区别:

1)字节流处理单元为1个字节,操作字节和字节数组,而字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串

2)所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘

3)在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列

4)那么既然磁盘存储都是按字节,内存中处理为何还需要字符流呢?字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点!

2. 讲讲NIO。

并发编程 http://ifeve.com/java-nio-all/

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

http://my.oschina.net/chape/blog/201725

UTF

考虑到unicode编码不兼容iso8859-1编码,而且容易占用更多的空间:因为对于英文字母,unicode也需要两个字节来表示。所以unicode不便于传输和存储。因此而

产生了utf编码

utf编码兼容iso8859-1编码,同时也可以用来表示所有语言的字符

utf编码是不定长编码,每一个字符的长度从1-6个字节不等

utf编码自带简单的校验功能。一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。 

 注意:

       虽然说utf是为了使用更少的空间而使用的,但那只是相对于unicode编码来说,

       如果已经知道是汉字,则使用GB2312/GBK无疑是最节省的。

      值得说明的是,虽然utf编码对汉字使用3个字节,但即使对于汉字网页,utf编码也会比unicode编码节省,因为网页中包含了很多的英文字符。 

GB2312/GBK

就是汉字的国标码,专门用来表示汉字,是双字节编码,而英文字母和iso8859-1一致(兼容iso8859-1编码)。

其中gbk编码能够用来同时表示繁体字和简体字,而gb2312只能表示简体字,gbk是兼容gb2312编码的。

规律:

utf-8编码可以用gbk和iso8859-1解码后编回去

gbk编码后只能用iso8859-1解码后编回去

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

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

通过JDK的java.io.File类的listFiles( )方法

 static Collection<File> listFiles(File root){
     List<File> files = new ArrayList<File>();
     listFiles(files, root);
     return files;
 }

 static void listFiles(List<File> files, File dir){
     File[] listFiles = dir.listFiles();
     for(File f: listFiles){
         if(f.isFile()){
             files.add(f);
         }else if(f.isDirectory()){
             listFiles(files, f);
         }
     }
 }

通过JDK NIO.2方法遍历(速度最快)

 final List<File> files = new ArrayList<File>();
 SimpleFileVisitor<Path> finder = new SimpleFileVisitor<Path>(){
     @Override
     public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
         files.add(file.toFile());
         return super.visitFile(file, attrs);
     }
 };

 java.nio.file.Files.walkFileTree(path, finder);

java各种遍历文件性能对比https://opoo.org/2014/walking-the-file-tree/