输入输出流
在java中,输入和输出都被称之为抽象的流,流可以看作是一组有序的字节集合,即数据在两设备之间的传输。主要的作用是为了改善程序性能并且使用方便。
流可以分为两大类:字节流和字符流。字节流以字节为单位(8bit),字符流以字符为单位(16bit)。两者之间的最主要的区别在于字节流在处理输入输出时不会用到缓存,而字符流用到了缓存。
IO流 | 字符流 | Reader | BufferReader | |
InputStreamReader | FileReader | |||
StringReader | ||||
PipedReader | ||||
ByteArrayReader | ||||
FilterReader | PushbackReader | |||
Writer | BufferWriter | |||
OuterStreamWriter | FileWriter | |||
StringWriter | ||||
PipedWriter | ||||
ByteArrayWriter | ||||
FilterWriter | ||||
字节流 | InputStream | FileInputStream | ||
FilterInputStream | BufferedInputStream | |||
DataInputStream | ||||
PushbackInputStream | ||||
ObjectInputStream | ||||
PipedInputStream | ||||
SequenceInputStream | ||||
StringBufferInputStream | ||||
ByteArrayInputStream | ||||
OutputStream | FileOutputStream | |||
FilterOutputStream | BufferedOutputStream | |||
DataOutputStream | ||||
PrintOutputStream | ||||
ObjectOutputStream | ||||
PipedOutputStream | ||||
ByteArrayOutputStream |
管理文件和目录
java通过File类来管理文件和文件夹。常用的File类中的方法如下:
方法 | 作用 |
File(String pathname) | 根据指定的路径创建一个File对象 |
createNewFile() | 若文件或目录存在,则返回false,否则创建 文件或文件夹 |
delete() | 删除文件或文件夹 |
isFile() | 判断这个对象表示的是否是文件 |
isDirectory() | 判断这个对象表示的是否是文件夹 |
listFiles() | 若对象代表目录,则返回 目录中所以文件的File对象 |
makdir() | 根据当前对象指定的路径创建目录 |
exists() | 判断对象对应的文件是否存在 |
如果假设目录:“C:\\testDir1”下有两个文件夹(dir1和dir2)和一个文件file1.txt,实现代码如下:
import java.io.File;
public class Test{
public static void main(String[] args){
File file = new File("C:\\testDir");
//判断目录是否存在
if(!file.exits()){
System.out.println("directory is empty");
return;
}
File[] fileList = file.listFile();
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());
}
}
}
}
Java Socket
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket也称之为套接字,可以实现不同虚拟机或不同计算机之间的通信。
Socket可以分为两种类型:面向连接的Socket(TCP,传输控制协议)和面向无连接的Socket(UDP,用户数据报协议)。任何一个Socket都是有IP地址和端口号唯一确定的。
Socket的生命周期可以分为3个阶段:打开Socket、使用Socket收发数据和关闭Socket。
Java序列化
序列化可以将对象的状态写在流里进行网络传输,或者保证到文件、数据库等系统里,并在需要时把该流读取出来重新构造一个相同的对象。
如何实现序列化:
要实现序列化都必须实现Serializable接口,该接口位于java.lang包中,它里面没有包含任何方法。使用一个输出流来构造一个ObjectOutputStream(对象流)对象。紧接着,使用该对象的writerObject方法就可以将obj对象写出,要恢复时使用其对应的输入流。
特点:
1.如果一个类能被序列化,那么它的子类也能够实现序列化
2.由于Static代表类的成员,transient(Java关键字,用其声明一个实例变量,当对象存储时,它的值不需要维持)代表对象的临时数据,因此被声明为被这两种类型的数据成员是不能够被序列化的。
使用场景:
1.需要通过网络来发送对象,或对象的状态需要被持久化到数据库或文件中
2.序列化能够实现深复制,即可以复制引用的对象。