java.io包下的类有哪些+面试题_第1页
java.io包下的类有哪些+面试题_第2页
java.io包下的类有哪些+面试题_第3页
java.io包下的类有哪些+面试题_第4页
java.io包下的类有哪些+面试题_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

文档来源网络侵权联系删除PAGEPAGE1仅供参考java.io包下的类有哪些+面试题IO介绍IO是Input/Output的缩写,它是基于流模型实现的,比如操作文件时使用输入流和输出流来写入和读取文件等。IO分类传统的IO,按照流类型我们可以分为:字符流字节流其中,字符流包括Reader、Writer;字节流包括InputStream、OutputStream。

传统IO的类关系图,如下图所示:avatarIO使用了解了IO之间的关系,下面我们正式进入实战环节,分别来看字符流(Reader、Writer)和字节流(InputStream、OutputStream)的使用。①Writer使用Writer可用来写入文件,请参考以下代码://给指定目录下的文件追加信息

Writerwriter=newFileWriter("d:\\io.txt",true);

writer.append("老王");

writer.close();这几行简单的代码就可以实现把信息老王追加到d:\\io.txt的文件下,参数二表示的是覆盖文字还是追加文字。②Reader使用Reader可用来读取文件,请参考以下代码:Readerreader=newFileReader("d:\\io.txt");

BufferedReaderbufferedReader=newBufferedReader(reader);

Stringstr=null;

//逐行读取信息

while(null!=(str=bufferedReader.readLine())){

System.out.println(str);

}

bufferedReader.close();

reader.close();③InputStream使用InputStream可用来读取文件,请参考以下代码:InputStreaminputStream=newFileInputStream(newFile("d:\\io.txt"));

byte[]bytes=newbyte[inputStream.available()];

//读取到byte数组

inputStream.read(bytes);

//内容转换为字符串

Stringcontent=newString(bytes,"UTF-8");

inputStream.close();④OutputStream使用OutputStream可用来写入文件,请参考以下代码:OutputStreamoutputStream=newFileOutputStream(newFile("d:\\io.txt"),true);

outputStream.write("老王".getBytes());

outputStream.close();NIO介绍上面讲的内容都是java.io包下的知识点,但随着Java的不断发展,在Java1.4时新的IO包出现了java.nio,NIO(Non-BlockingIO)的出现解决了传统IO,也就是我们经常说的BIO(BlockingIO)同步阻塞的问题,NIO提供了Channel、Selector和Buffer等概念,可以实现多路复用和同步非阻塞IO操作,从而大大提升了IO操作的性能。

前面提到同步和阻塞的问题,那下面来看看同步和阻塞结合都有哪些含义。组合方式性能分析同步阻塞最常用的一种用法,使用也是最简单的,但是I/O性能一般很差,CPU大部分在空闲状态同步非阻塞提升I/O性能的常用手段,就是将I/O的阻塞改成非阻塞方式,尤其在网络I/O是长连接,同时传输数据也不是很多的情况下,提升性能非常有效。这种方式通常能提升I/O性能,但是会增加CPU消耗,要考虑增加的I/O性能能不能补偿CPU的消耗,也就是系统的瓶颈是在I/O还是在CPU上

异步阻塞|这种方式在分布式数据库中经常用到。例如,在往一个分布式数据库中写一条记录,通常会有一份是同步阻塞的记录,而还有两至三份是备份记录会写到其他机器上,这些备份记录通常都是采用异步阻塞的方式写I/O;异步阻塞对网络I/O能够提升效率,尤其像上面这种同时写多份相同数据的情况

异步非阻塞|这种组合方式用起来比较复杂,只有在一些非常复杂的分布式情况下使用,像集群之间的消息同步机制一般用这种I/O组合方式。例如,Cassandra的Gossip通信机制就是采用异步非阻塞的方式。它适合同时要传多份相同的数据到集群中不同的机器,同时数据的传输量虽然不大,但是却非常频繁。这种网络I/O用这个方式性能能达到最高了解了同步和阻塞的含义,下面来看NIO的具体使用,请参考以下代码:intport=6666;

newThread(newRunnable(){

@Override

publicvoidrun(){

try(Selectorselector=Selector.open();

ServerSocketChannelserverSocketChannel=ServerSocketChannel.open();){

serverSocketChannel.bind(newInetSocketAddress(InetAddress.getLocalHost(),port));

serverSocketChannel.configureBlocking(false);

serverSocketChannel.register(selector,SelectionKey.OP_ACCEPT);

while(true){

selector.select();//阻塞等待就绪的Channel

Set<SelectionKey>selectionKeys=selector.selectedKeys();

Iterator<SelectionKey>iterator=selectionKeys.iterator();

while(iterator.hasNext()){

SelectionKeykey=iterator.next();

try(SocketChannelchannel=((ServerSocketChannel)key.channel()).accept()){

channel.write(Charset.defaultCharset().encode("老王,你好~"));

}

iterator.remove();

}

}

}catch(IOExceptione){

e.printStackTrace();

}

}

}).start();

newThread(newRunnable(){

@Override

publicvoidrun(){

//Socket客户端1(接收信息并打印)

try(SocketcSocket=newSocket(InetAddress.getLocalHost(),port)){

BufferedReaderbufferedReader=newBufferedReader(newInputStreamReader(cSocket.getInputStream()));

bufferedReader.lines().forEach(s->System.out.println("客户端1打印:"+s));

}catch(IOExceptione){

e.printStackTrace();

}

}

}).start();

newThread(newRunnable(){

@Override

publicvoidrun(){

//Socket客户端2(接收信息并打印)

try(SocketcSocket=newSocket(InetAddress.getLocalHost(),port)){

BufferedReaderbufferedReader=newBufferedReader(newInputStreamReader(cSocket.getInputStream()));

bufferedReader.lines().forEach(s->System.out.println("客户端2打印:"+s));

}catch(IOExceptione){

e.printStackTrace();

}

}

}).start();以上代码创建了两个Socket客户端,用于收取和打印服务器端的消息。

其中,服务器端通过SelectionKey(选择键)获取到SocketChannel(通道),而通道都注册到Selector(选择器)上,所有的客户端都可以获得对应的通道,而不是所有客户端都排队堵塞等待一个服务器连接,这样就实现多路复用的效果了。多路指的是多个通道(SocketChannel),而复用指的是一个服务器端连接重复被不同的客户端使用。AIO介绍AIO(AsynchronousIO)是NIO的升级,也叫NIO2,实现了异步非堵塞IO,异步IO的操作基于事件和回调机制。

AIO实现简单的Socket服务器,代码如下:intport=8888;

newThread(newRunnable(){

@Override

publicvoidrun(){

AsynchronousChannelGroupgroup=null;

try{

group=AsynchronousChannelGroup.withThreadPool(Executors.newFixedThreadPool(4));

AsynchronousServerSocketChannelserver=AsynchronousServerSocketChannel.open(group).bind(newInetSocketAddress(InetAddress.getLocalHost(),port));

server.accept(null,newCompletionHandler<AsynchronousSocketChannel,AsynchronousServerSocketChannel>(){

@Override

publicvoidcompleted(AsynchronousSocketChannelresult,AsynchronousServerSocketChannelattachment){

server.accept(null,this);//接收下一个请求

try{

Future<Integer>f=result.write(Charset.defaultCharset().encode("Hi,老王"));

f.get();

System.out.println("服务端发送时间:"+DateFormat.getDateTimeInstance().format(newDate()));

result.close();

}catch(InterruptedException|ExecutionException|IOExceptione){

e.printStackTrace();

}

}

@Override

publicvoidfailed(Throwableexc,AsynchronousServerSocketChannelattachment){

}

});

group.awaitTermination(Long.MAX_VALUE,TimeUnit.SECONDS);

}catch(IOException|InterruptedExceptione){

e.printStackTrace();

}

}

}).start();

//Socket客户端

AsynchronousSocketChannelclient=AsynchronousSocketChannel.open();

Future<Void>future=client.connect(newInetSocketAddress(InetAddress.getLocalHost(),port));

future.get();

ByteBufferbuffer=ByteBuffer.allocate(100);

client.read(buffer,null,newCompletionHandler<Integer,Void>(){

@Override

publicvoidcompleted(Integerresult,Voidattachment){

System.out.println("客户端打印:"+newString(buffer.array()));

}

@Override

publicvoidfailed(Throwableexc,Voidattachment){

exc.printStackTrace();

try{

client.close();

}catch(IOExceptione){

e.printStackTrace();

}

}

});

Thread.sleep(10*1000);相关面试题1.使用以下哪个方法来判断一个文件是否存在?A:createFile

B:exists

C:read

D:exist答:B2.以下说法错误的是?A:同步操作不一定会阻塞

B:异步操作不一定会阻塞

C:阻塞一定是同步操作

D:同步或异步都可能会阻塞答:C题目解析:异步操作也可能会阻塞,比如分布式集群消息同步,采用的就是异步阻塞的方式。3.BIO、NIO、AIO的区别是什么?答:它们三者的区别如下。BIO就是传统的java.io包,它是基于流模型实现的,交互的方式是同步、阻塞方式,也就是说在读入输入流或者输出流时,在读写动作完成之前,线程会一直阻塞在那里,它们之间的调用是可靠的线性顺序。它的优点就是代码比较简单、直观;缺点就是IO的效率和扩展性很低,容易成为应用性能瓶颈。NIO是Java1.4引入的java.nio包,提供了Channel、Selector、Buffer等新的抽象,可以构建多路复用的、同步非阻塞IO程序,同时提供了更接近操作系统底层高性能的数据操作方式。AIO是Java1.7之后引入的包,是NIO的升级版本,提供了异步非堵塞的IO操作方式,因此人们叫它AIO(AsynchronousIO),异步IO是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。简单来说BIO就是传统IO包,产生的最早;NIO是对BIO的改进提供了多路复用的同步非阻塞IO,而AIO是NIO的升级,提供了异步非阻塞IO。4.读取和写入文件最简洁的方式是什么?答:使用Java7提供的Files读取和写入文件是最简洁,请参考以下代码://读取文件

byte[]bytes=Files.readAllBytes(Paths.get("d:\\io.txt"));

//写入文件

Files.write(Paths.get("d:\\io.txt"),"追加内容".getBytes(),StandardOpenOption.APPEND);读取和写入都是一行代码搞定,可以说很简洁了。5.Files常用方法都有哪些?答:Files是Java1.7提供的,使得文件和文件夹的操作更加方便,它的常用方法有以下几个:Files.exists():检测文件路径是否存在Files.createFile():创建文件Files.createDirectory():创建文件夹Files.delete():删除一个文件或目录Files.copy():复制文件Files.move():移动文件Files.size():查看文件个数Files.read():读取文件Files.write():写入文件6.FileInputStream可以实现什么功能?答:FileInputStream可以实现文件的读取。题目解析:因为FileInputStream和FileOutputStream很容易被记反,FileOutputStream才是用来写入文件的,所以也经常被面试官问到。7.不定项选择:为了提高读写性能,可以采用什么流?A:InputStream

B:DataInputStream

C:BufferedReader

D:BufferedInputStream

E:OutputStream

F:BufferedOutputStream答:D、F题目解析:BufferedInputStream是一种带缓存区的输入流,在读取字节数据时可以从底层流中一次性读取多个字节到缓存区,而不必每次都调用系统底层;同理,BufferedOutputStream也是一种带缓冲区的输出流,通过缓冲区输出流,应用程序先把字节写入缓冲区,缓存区满后再调用操作系统底层,从而提高系统性能,而不必每次都去调用系统底层方法。8.FileInputStream和BufferedInputStream的区别是什么?答:FileInputStream在小文件读写时性能较好,而在大文件操作时使用BufferedInputStream更有优势。9.以下这段代码运行在Windwos平台,执行的结果是?Files.createFile(Paths.get("c:\\pf.txt"),PosixFilePermissions.asFileAttribute(

EnumSet.of(PosixFilePermission.OWNER_READ)));A:在指定的盘符产生了对应的文件,文件只读

B:在指定的盘符产生了对应的文件,文件只写

C:在指定的盘符产生了对应的文件,文件可读写

D:程序报错答:D题目解析:本题目考察的是Files.createFile参数传递的问题,PosixFilePermissions不支持Windows,因此在Windows执行会报错java.lang.UnsupportedOperationException:‘posix:permissions’notsupportedasinitialattribute。总结在Java1.4之前只有BIO(BlockingIO)可供使用,也就是java.io包下的那些类,它的缺点是同步阻塞式运行的。随后在Java1.4时,提供了NIO(Non-BlockingIO)属于BIO的升级,提供了同步非阻塞的IO操作方式,它的重要组件是Selector(选择器)、Channel(通道)、Buffer(高效数据容器)实现了多路复用的高效IO操作。而AIO(AsynchronousIO)也叫NIO2.0,属于NIO的补充和升级,提供了异步非阻塞的IO操作。还有另一个重要的知识点,是Java7.0时新增的Files类,极大地提升了文件操作的便利性,比如读、写文件Files.write()、Files.readAllBytes()等,都是非常简便和实用的方法。 如何轻松获得Offer你好,我是王磊,某上市公司技术研发经理,前奇虎360员工,有着10余年的编程工作经验,目前主要负责新员工技术面试和构建企业技术架构的相关事宜。随着面试过的人数增加,我发现面试者们暴露出了技术方面的很多问题,为了让更多面试者少走一些弯路,也为了让企业能招到合适的技术人才,于是就诞生了这个专栏。为了写好这个专栏内容,我先后拜访了一二十家互联网公司,与不同的面试官和面试者进行面对面探讨,深入了解了企业对于面试者的要求和常见的Java面试题型。之后我花了大半年的时间,结合自己4年多作为面试官的经历,把这些内容整理成文,用大约10万字的内容对Java的核心知识点和常见的500多道面试题,做了详细的介绍,也就是本专栏中你所看到的全部内容,希望对你能有所帮助。为什么要学这个专栏内容?「因为它能为你赢得面试的主动权,让你获得更多的Offer。」从业十多年,我从面试者变成面试官,在Java面试上积累了比较丰富的经验。其实,很多面试者在搜集面试资料的时候都踩过一些“坑”,你是不是也遇到过:免费搜索的面试题,内容不全面,这就算了,有时候答案都不准确;很多培训机构提供的面试宝典内容虽然不少,但深度不够,且面试题过于老旧脱离了企业实际需要;还有很多付费的面试题存在滥竽充数,提供了很多没有价值的面试题,钱花了,干货没学到;市面上大部分面试题只讲了基础概念,没有提供题目解析和示例代码,不利于读者真正的掌握背后的原理,只能死记硬背,且容易忘记。为了规避这些“坑”,我跑了很多家互联网公司,来确认Java面试中实际考察的高频知识点和常见题型。可是有了第一手素材后,我要如何让大家真正从我的讲解中学到干货、用到实处呢?经过反复验证,我才设计了如下的内容讲述模式。第一,500+面试题详解。如果你是还没走入职场的新人,我会为你提供完整的Java技术栈讲解,以及最新、最全、最实用的500多道Java面试题详解。第二,10万字Java核心知识点梳理。本专栏的每一篇内容,都采用的是「核心知识点+N道相关面试题」的模式,让你不单能应付面试,还能学到更多的Java核心知识。第三,技术、面试搭配平衡,不但让你学到心里,还助你展示出来。面对目前技术市场的相对冷淡和一个职位多个应聘者竞争的现状,面试者们只有掌握更多Java核心技能和面试理论知识,才能在众多面试者中脱颖而出。本专栏每篇文章大致分为两个部分:Java核心点介绍+相关面试题详解,这两部分内容相辅相成,前面的核心知识点介绍让后面的面试题更容易理解,后面的面试题加深了读者对于Java核心点的掌握。如此一来,让你所学及所用,不仅能够应付面试,更能学习到更多有价值的Java技术点,让你在面试中和工作中都能展示的更加出色。专栏大纲本专栏分为七大部分,共计37讲,约10万字。第一部分:Java基础强化这部分包含7篇文章,我会从Java最基础的内容讲起。有最常见的String面试题从表象到原理的深入讲解;还有Java8中新特性的介绍,比如时间和日期模块,让你使用更简洁和优化的方式写出更完美的代码;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论