注:资料有书为证,大伙可放心翻阅并熟记,由本人亲自总结!
1、Java IO流的实现机制是什么?
流可以被看做一组有序的字节集合,即数据在两设备之间的传输。
流的本质是数据传输,根据处理数据类型的不同,可以分为字节流(InputStream和OutputStream)和字符流(Reader和Writer)两种,其主要作用时为了改善程序性能并且使用方便。
字节流和字符流最主要的区别:字节流在处理输入输出时不会用到缓存,而字符流用到了缓存。
Java IO流在设计时采用了Decorator(装饰者)设计模式,采用这种模式的好处时可以在运行时动态地给对象添加一些额外的职责,与使用继承的设计方法相比,该方法具有更好的灵活性。
2、管理文件和目录的类是什么?
管理文件和目录的类叫File,通过这个类不禁能够查看文件或目录的属性,而且还可以实现对文件或目录的创建、删除与重命名等操作。
File常用的方法:
方法 | 作用 |
---|---|
File(String pathname) | 根据指定路径创建一个File对象 |
creatNewFile() | 若目录或文件存在,则返回false,或者创建文件或文件夹 |
delete() | 删除文件或文件夹 |
isFile() | 判断这个对象表示的是否是文件 |
isDiretory() | 判断这个对象表示的是否是文件夹 |
listFiles() | 若对象表示的是目录,则返回目录中所有文件的File对象 |
mkdir() | 根据当前对象指定的路径创建目录 |
exists() | 判断对象对应的文件是否存在 |
3、Java Socket是什么?
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端被称为一个Socket。
Socket主要有两种类型:一种面向连接的Socket通信协议,一种是面向无连接的Socket通信协议。任何一个Socket都是由IP地址和端口号唯一确定的。
Socket的生命周期可以分为3个阶段:打开Socket、使用Socket收发数据和关闭Socket。一般来说服务器端使用的是ServerSocket,客户端用的是Socket来作为网络通信的基础。
4、Java NIO是什么?
在传统的Socket通信当中,当要处理多个连接,就需要采用多线程的方式,但由于每个线程都有自己的栈空间,而且由于阻塞会导致大量线程进行上下文切换,使得程序的运行效率非常地下,所以为了解决这个问题,在J2SE1.4中引入了NIO来解决这个问题。
NIO通过Selector、Channel和Buffer来实现非阻塞的IO操作。
NIO非阻塞的实现主要采用了Reactor(反应器)设计模式,这个设计模式与Observer(观察者)设计模式类似。前者可以处理多个事件源,后者只能处理一个。
Channel可以被看做一个双向的非阻塞的通道,在通道两边可以进行数据读写操作。
Selector内部的实现原理:对所有注册的Channel进行轮询访问,一旦轮询到一个Channel1有注册的事件发生,他就通过传回SelectionKey的方式来通知开发人员对Channel1进行数据的读或写操作。
这种通过轮询的方式在处理多线程请求时不需要上下文的切换!
Buffer用来保存数据,可以存放从Channel读取的数据,也可以存放使用Channel进行发送的数据。
NIO在网络编程中有着非常重要的作用,与传统的Socket方式相比,由于NIO采用了非阻塞的方式,在处理大量并发请求时,使用NIO要比使用Socket效率高出很多。
5、什么是Java序列化?
序列化是将对象以一连串的字节描述的过程,用于解决在对对象流进行读写操作时所引发的问题。
如何序列化?所有实现序列化的类都必须实现一个Serializable接口,使用一个输出流来构造一个ObjectOut-putStream对象,紧接着,使用该对象的writerObject方法就可以将obj’对象写出,要恢复时可以使用其对应的输入流。
序列化的特点:
①、一个类能被序列化,那么它的子类也能够被序列化。
②、static代表类的成员,transient代表对象的临时数据,因此被声明为这个两种类型的数据成员时不能够被序列化的。
什么时候使用序列化最合适?
①、需要通过网络来发送对象,或对象的状态需要被持久化到数据库或文件中。
②、序列化能实现深复制,即可以复制引用的对象。
对于反序列化,自定义serialVersionUID主要有三个优点:
①、提高程序的运行效率。显式的声明了serialVersionUID的方式省去了序列化的时候计算的过程。
②、提高程序不同平台上的兼容性。不同的平台计算serialVersionUID的方式可能不同,显式的声明可以避免这种情况。
③、增强程序各个版本的可兼容性。当类被修改的时候,类的serialVersionUID也将会发生改变,显式的声明也会解决这个问题。
外部序列化
public interface Externalizable extends Serializable{
void readExternal(ObjectInput in);?
void writeExternal(ObjectOutput out);?
}
它和序列化的主要区别在于序列化时内置的API,只需要实现Serializable接口就可以了,不需要认为的去编写任何代码就可以实现对象的序列化,而使用外部序列化时,Externalizable接口中的读写方法必须由开发人员来实现。
拓展1:transient声明一个实例变量,当对象存储时,它的值是不需要维护的。
拓展2:如果指向序列化部分属性,一种方法时自己开发,即使用外部序列化。另一个就是使用关键字transient来控制序列化的属性。
6、System.out.println()方法使用需要注意哪些问题?
该方法默认接受一个字符串类型的变量作为参数,在使用时可以传递任意能够转换为String类型的变量作为参数。
System.out.println(1+2+" ");//1+2为int整型,3+" "则转换成了String
System.out.println(" "+1+2);//" "+1自动转换成了String,所以"1"+2自然就无法直接相加了,成了"12"
转载麻烦请附录地址,感谢大家配合!!!
https://blog.csdn.net/HOLLOWYANG/article/details/119986753