4.7.1Java IO流的实现机制是什么
在Java语言中,输入和输出都被称为抽象的流,流可以被看作一组有序的字节集合,即数据在两设备间的传输。
流的本质是数据传输,根据处理数据类型的不同,流可以分为两大类:字节流和字符流。字节流以字节(8 bit)为单位,包含两个抽象类:InputStream(输入流)和OutputStream(输出流)。字符流以字符(16 bit,字符以unicode编码,每个字符的编码由四位16进制数字组成)为单位,根据码表映射字符,一次可以读多个字节,它包含两个抽象类:Reader(输入流)和Write(输出流)。字节流和字符流最主要的区别为:字节流在处理输入输出时不会用到缓存,而字符流用到了缓存。下图主要介绍Java中的IO设计理念,Java IO类在设计时采用了Decorator(装饰着)设计模式,以InputStream为例,介绍Decorator设计模式在IO类中的使用如下:
其中,ByteArrayInputStream、StringBufferInputStream、FileInputStream和PipedInputStream是Java提供的最基本的对流进行处理的类,FilterInputStream为一个封装类的基类,可以对基本的IO类进行封装,通过调用这些类提供的基本的流操作方法来实现更复杂的流操作。
使用这种设计模式的好处是可以在运行时动态的给对象添加一些额外的职责,与使用继承的设计方法相比,该方法具有很好的灵活性。
假如现在要设计一个输入流的类,该类的作用为在读文件时把文件中的大写字母转换成小写字母,把小写字母转换为大写字母。在设计时,可以通过继承抽象装饰类(FilterInputStream)来实现一个装饰类,通过调用InputStream类或其子类提供的一些方法再加上逻辑判断代码从而可以简单地实现这个功能,示例如下:
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
class MyOwnInputStream extends FilterInputStream{
protected MyOwnInputStream(InputStream in) {
super(in);
// TODO Auto-generated constructor stub
}
public int read() throws IOException{
int c=0;
if((c = super.read()) != -1){
//把小写转换为大写
if(Character.isLowerCase((char) c)){
return Character.toUpperCase((char) c);
}
//把大写转换为小写
else if(Character.isUpperCase((char) c)){
return Character.toLowerCase((char) c);
}else
return c;
}
else{
return -1;
}
}
}
public class TestIOStream{
public static void main(String[] args){
int c;
try{
InputStream is = new MyOwnInputStream(new BufferedInputStream(new FileInputStream("test.txt")));
while((c = is.read()) >= 0){
System.out.print((char) c);
}
is.close();
}catch(IOException e){
System.out.println(e.getMessage());
}
}
}
运行结果:
AAAbbbCCCddd123
4.7.2管理文件和目录的类是什么
对文件或目录进行管理与操作在编程中有着非常重要的作用,Java提供了一个非常重要的类(File)来管理文件和文件夹。通过类不仅能够查看文件或目录的属性,而且还可以实现对文件或目录的创建、删除与重命名等操作。关于File类常用的方法可以自行查阅Java开发文档。
问:如何列出某个目录下的所有目录和文件?
答:代码如下:
import java.io.File;
public class TestFile {
public static void main(String[] args){
File file = new File("C://week09");
//判断目录是否存在
if(! file.exists()){
System.out.println("dirctory is empty");
return;
}
File[] fileList = file.listFiles();
for(int i=0;i<fileList.length;i++){
//判断是否为目录
if(fileList[i].isDirectory()){
System.out.println("directory is: "+fileList[i].getName());
}else{
System.out.println("file is: "+fileList[i].getName());
}
}
}
}
运行结果:
directory is: CopyMovie
directory is: Movie
file is: test.txt
4.7.3Java Socket是什么
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket也成为套接字,可以用来实现不同虚拟机或不同计算机之间的通信。在Java语言中,Socket可以分为两种类型:面向连接的Socket通信协议(TCP)和面向无连接的Socket通信协议(UDP)。任何一个Socket都是由IP地址和端口号唯一确定的。
基于TCP的通信过程如下:首先,Server端Listen指定的某个端口(建议使用大于1024的端口)是否有连接的请求;其次,Client端向Server端发出Connect请求;最后Server端向Client端发挥Accept消息。一个连接就建立起来了,回话随即产生。Server端和Client端都可以通过Send,Write等方法与对方通信。
Socket的生命周期可以分为3个阶段:打开Socket、使用Socket收发数据和关闭Socket。