8 第八章IO流
8.1 File类
File 就是文件 ,在java中表示路径名。
- 实例
File
类是不可变的; 也就是说,一旦创建,由File
对象表示的抽象路径名永远不会改变。
路径有相对路径和绝对路径。
8.1.1 构造方法
- File(String path)
将一个字符串描述的路径,封装成一个 File对象。 - File(String parent,String Child)
将两个字符串(父级路径, 子级路径),拼接之后形成的路径封装成一个File对象。 - File(File parent, String child)
将File类型的父级路径和String类型的字节路径拼接成一个新路径,封装成File对象
**注意:**创建好File对象后,只是封装了一个路径, 和磁盘上是否有这个路径无关。
8.1.2 创建功能
- createNewFile() 创建文件
- mkdir() 创建文件夹,如果父级路径不存在,则文件夹创建失败。
- mkdirs() 创建文件夹,如果路径不存在,则会自动创建路径。
8.1.3 删除功能
- delete() 可以删除文件,也可以删除文件夹。
注意:不能删除非空文件夹(也就是说只要文件夹里还有文件,delete()方法就不能删除这个文件夹)
8.1.4 重命名功能
- renameTo(File dest) 重命名,参数是修改后的文件路径。
注意:如果修改了父级路径就是剪切+重命名,不修改父级路径就仅仅只是重命名。
8.1.5 判断功能
- exists(),判断调用者路径是否存在
- isFile(),判断调用者是否是一个文件
- isDirectory(),判断调用者是否是一个文件夹
8.1.6 获取功能
获取路径
- getName() 获取最短的那个文件或者文件夹名称
- getPath() 获取相对路径,构造方法中传入的那个字符串
- getAbsolutePath() 获取绝对路径
获取文件的属性
- length() 获取文件的字节个数,只能针对文件使用,不能针对文件夹使用
- lastModified() 获取文件的最后修改时间
获取文件夹中的内容
- String[] list() 返回文件夹中的所有内容的名称(不包含子文件夹中的内容)
- File[] listFiles() 返回文件夹中的所有内容的File对象(不包含子文件夹中的内容) 注意事项: 这两个方法只能针对文件夹使用,不能针对文件使用
8.2 IO流
8.2.1 字节流
InputStream
InputStream是一个定义了Java流式字节输入模式的抽象类。该类的所有方法在出错条件下引发一个IOException 异常。它的主要方法定义如下
方法 | 方法介绍 |
---|---|
available() | 返回可读的字节数量 |
read(byte[] b,int off,int len) | |
read() | |
skip(long n) | 跳过指定的字节数 |
close() | 关闭流,释放资源 |
reset() | 重新读取位置为上次mark标记的位置 |
markSupported() | 如果调用的流支持mark()或reset()就返回true |
OutputStream
OutputStream是定义了流式字节输出模式的抽象类。该类的所有方法返回一个void值并且在出错情况下引发一个IOException异常。它的主要方法定义如下:
方法 | 方法介绍 |
---|---|
write(int b) | 向输出流写入单个字节 |
write(byte[] buffer) | 向一个输出流写入一个完整的字节数组 |
write(byte[] buffer,int off,int numBytes) | 写入数组buffer 以 buffer[offset]为起点的numBytes个字节区域内的内容 |
flush() | 刷新缓冲流 |
close() | 关闭输出流 |
8.2.2 字符流
Reader
Reader是Java定义的流式字符输入模式的抽象类。类中的方法在出错时引发IOException异常。
方法 | 方法介绍 |
---|---|
read() | |
read(char[] buffer) | |
read(char[] buffer,int off,int numChars) | |
ready() | |
skip(long numChars) | |
markSupported() | |
reset() | |
mark(int numChars) | |
close() |
Writer
Reader是Java定义的流式字符输入模式的抽象类。类中的方法在出错时引发IOException异常。
方法 | 方法介绍 |
---|---|
write(char[] buffer) | |
write(char[] buffer,int off,int numChars) | |
close() | |
flush() | |
append(CharSequence csq) | 追加一个字符序列 |
append(CharSequence csq, int start,int end) | |
append(char c) | 追加写入一个16位的字符 |
8.3 打印流
在整个IO包中,打印流是输出信息最方便的类,主要包括字节打印流(PrintStream)和字符打印流(PrintWriter)。打印流提供了非常方便的打印功能,可以打印任何的数据类型。如:小数、整数、字符串等。
PrintStream和PrintWriter都属于输出流,分别针对输出字节和字符。
PrintStream和PrintWriter提供了重载的print()、println()方法用于多种数据类型的输出。
PrintStream和PrintWriter不会抛出异常,用户通过检测错误状态获取错误信息。
PrintStream和PrintWriter有自动flush 功能。
8.3.1 打印流构造方法
PrintStream 字节打印流
-
PrintStream(OutputStream out);获得指定输出流的字节打印流对象。
-
PrintStream(OutputStream out, boolean auotflush);获得指定输出流的字节打印流对象。autoflush 是否自动刷新。
-
PrintStream(OutputStream out, boolean auotflush, String encoding);获得指定输出流的字节打印流对象。autoflush 是否自动刷新。encoding 指定字符编码。
PrintWriter 字符打印流
-
PrintWriter(OutputStream out);获得指定输出流的字符打印流对象。
-
PrintWriter(OutputStream out, boolean autoflush);获得指定输出流的字符打印流对象。autoflush 是否自动刷新。
-
PrintWriter(Writer out);获得指定字符输出流的字符打印流对象。
-
PrintWriter(Writer out, boolean autoflush);获得指定字符输出流的字符打印流对象。autoflush 是否自动刷新。
8.3.2 打印流的常用操作:print(), println()****
**print();不带换行的打印输出 **
try {
File file = new File("test.txt");
FileOutputStream fos = new FileOutputStream(file);
PrintWriter ps = new PrintWriter(fos,true);
ps.print("aaaaa");
ps.print("bbbbb");
ps.close();
}
**println();每打印出一行数据后,执行换行。 **
try {
File file = new File("test.txt");
FileOutputStream fos = new FileOutputStream(file);
PrintWriter ps = new PrintWriter(fos,true);
ps.println("aaaaa");
ps.println("bbbbb");
ps.close();
}
printf()
import java.io.* ;
public class PrintDemo01{
public static void main(String arg[]) throws Exception{
PrintStream ps = null ; // 声明打印流对象
// 如果现在是使用FileOuputStream实例化,意味着所有的输出是向文件之中
ps = new PrintStream(new FileOutputStream(new File("d:" + File.separator + "test.txt"))) ;
String name = "李兴华" ; // 定义字符串
int age = 30 ; // 定义整数
float score = 990.356f ; // 定义小数
char sex = 'M' ; // 定义字符
ps.printf("姓名:%s;年龄:%d;成绩:%f;性别:%c",name,age,score,sex) ;
ps.close() ;
}
};
总结
PrintStream out = new PrintStream(new FileOutputStream("E:\\demo.html"));
/*out.println("666666666666");
out.print("abcd");
out.print("abcdefgh<br>");
out.println("777777777777");*/
out.println("3333333333333");
out.close();
8.4 对象的序列化Serialization
“序列化”是一种****把对象的状态转化成字节流的机制****,“反序列”是其相反的过程,把序列化成的字节流用来在内存中重新创建一个实际的Java对象。这个机制被用来“持久化”对象。通过对象序列化,可以方便的实现对象的持久化储存以及在网络上的传输。大致的过程如下图所示:
对象被转换成“字节流”后可以存入文件,内存,亦或者是数据库内进行持久化保存。然后通过“反序列化”可以把“字节流”转换成实际的Java对象。
8.4.1 实现序列化
如何实现序列化
为了使一个Java对象能够被“序列化”,我们必须让这个对象实现java.io.Serializable接口。
此接口中没有定义任何的方法,所以****此接口是一个标识接口。表示一个类具备了“可序列化”的能力****。
import java.io.Serializable;
public class Person implements Serializable {
private String name;
public Person(String name) {
this.name = name;
}
}
上面就是一个实现了Serializable接口的Person类对象,这个对象现在就已经具备了“可序列化”的能力。所以此类的对象是可以经过“二进制数据流”进行传输的。而如果想要完成对象的输入或者输出,还必须依靠对象输出流(ObjectOutputStream)和对象输入流(ObjectInputStream)。
使用:“对象输出流”输出序列化对象的步骤有时候也称作“序列化”,而使用“对象输入流”读入对象的过程也称作“反序列化”。
8.4.2 对象输入输出流
对象输入流
public class ObjectInputStreamDemo {
public ObjectInputStreamDemo() {
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream objin = new ObjectInputStream(new FileInputStream("E:\\temp.obj"));
Date d = (Date) objin.readObject();
String s = (String) objin.readObject();
User user = (User)objin.readObject();
/* 要按照序列化的顺序反序列化
String s = (String) objin.readObject();
Date d = (Date) objin.readObject();*/
System.out.println(user);
System.out.println("s = " + s);
System.out.println("d = " + d);
}
}
对象输出流
public class ObjectOutputStreamDemo {
public ObjectOutputStreamDemo() {
}
public static void main(String[] args) throws IOException {
ObjectOutputStream objout = new ObjectOutputStream(new FileOutputStream("E:\\temp.obj"));
objout.writeObject(new Date());
objout.writeObject("555555555");
objout.writeObject(new User("jim","1235689"));
objout.close();
}
}