Java学习笔记(五)
十九、文件
File类(java.io.File):
构造器:
public File(String pathname):实例化File类的时候,必须设置好路径
//例子:
import java.io.File;
public class FileDemo11 {
public static void main(String args[]) {
File my = new File("d:" + File.separator); // 操作路径
print(my) ;
}
public static void print(File file) { // 递归调用此方法
if (file != null) { // 增加一个检查机制
if (file.isDirectory()) { // 判断是否是目录
File f[] = file.listFiles() ;// 如果是目录,则列出全部内容
if (f != null) { // 有可能无法列出目录中的文件
for (int i = 0; i < f.length; i++) {
print(f[i]);// 继续列出内容
}
}
}else{
System.out.println(file); / 如果不是目录,则直接打印路径信息
}
}
}
}
字节流与字符流
在java.io包中操作文件内容的主要有两大类:字节流、字符流,两类都分为输入和输出操作。在字节流中输出数据主要是使用OutputStream完成,输入使的是InputStream,在字符流中输出主要是使用Writer类完成,输入主要是使用Reader类完成。
操作流程:(以文件操作为例)
1. 使用File类打开一个文件
2. 通过字节流或者字符流的子类,指定输出的位置
3. 进行读/写操作
4. 关闭输入/输出
字节流:
主要操作byte类型数据,字节输出流是OutputStream,字节输入流是InputStream
//例子:
//向文件中写入字符串
public static void main(String[] args) throws Exception { // 异常抛出,不处理
// 第1步、使用File类找到一个文件
File f = new File("d:" + File.separator + "test.txt"); // 声明File对象
// 第2步:通过子类实例化父类对象
OutputStream out = null; // 准备好一个输出的对象
out = new FileOutputStream(f); // 通过对象多态性,进行实例化
// 第3步:进行写操作
String str = "Hello World!!!"; // 准备一个字符串
byte b[] = str.getBytes(); // 只能输出byte数组,所以将字符串变为byte数组
out.write(b); // 将内容输出,保存文件
// 第4步:关闭输出流
out.close(); // 关闭输出流
}
//向文件中追加内容
public static void main(String[] args) throws Exception { // 异常抛出,不处理
// 第1步、使用File类找到一个文件
File f = new File("d:" + File.separator + "test.txt"); // 声明File对象
// 第2步:通过子类实例化父类对象
OutputStream out = null; // 准备好一个输出的对象
out = new FileOutputStream(f,true); // 此处表示在文件末尾追加内容
// 第3步:进行写操作
String str = "Hello World!!!"; // 准备一个字符串
byte b[] = str.getBytes(); // 只能输出byte数组,所以将字符串变为byte数组
for (int i = 0; i < b.length; i++) {
out.write(b[i]); // 将内容输出
}
// 第4步:关闭输出流
out.close(); // 关闭输出流
}
//从文件中读取内容
public static void main(String[] args) throws Exception { // 异常抛出,不处理
// 第1步、使用File类找到一个文件
File f = new File("d:" + File.separator + "test.txt"); // 声明File对象
// 第2步:通过子类实例化父类对象
InputStream input = null; // 准备好一个输入的对象
input = new FileInputStream(f); // 通过对象多态性,进行实例化
// 第3步:进行读操作
byte b[] = new byte[1024]; // 所有的内容读到此数组之中
input.read(b); // 把内容取出,内容读到byte数组之中
// 第4步:关闭输入流
input.close(); // 关闭输入流
System.out.println("内容为:" + new String(b)); // 把byte数组变为字符串输出
}
字符流:
在程序中一个字符相当于2个字节,字符输出流是Writer,字符输入流是Reader
//例子:
//向文件中写入数据
public static void main(String[] args) throws Exception { // 异常抛出,不处理
// 第1步、使用File类找到一个文件
File f = new File("d:" + File.separator + "test.txt"); // 声明File对象
// 第2步:通过子类实例化父类对象
Writer out = null; // 准备好一个输出的对象
out = new FileWriter(f); // 通过对象多态性,进行实例化
// 第3步:进行写操作
String str = "Hello World!!!"; // 准备一个字符串
out.write(str); // 将内容输出
// 第4步:关闭输出流
out.close(); // 关闭输出流
}
//向文件中追加内容
public static void main(String[] args) throws Exception { // 异常抛出,不处理
// 第1步、使用File类找到一个文件
File f = new File("d:" + File.separator + "test.txt"); // 声明File对象
// 第2步:通过子类实例化父类对象
Writer out = null; // 准备好一个输出的对象
out = new FileWriter(f,true); // 通过对象多态性,进行实例化
// 第3步:进行写操作
String str = "\r\nLIXINGHUA\r\nHello World!!!" ; // 准备一个字符串
out.write(str); // 将内容输出
// 第4步:关闭输出流
out.close(); // 关闭输出流
}
//从文件中读取内容:
public static void main(String[] args) throws Exception { // 异常抛出,不处理
// 第1步、使用File类找到一个文件
File f = new File("d:" + File.separator + "test.txt"); // 声明File对象
// 第2步:通过子类实例化父类对象
Reader reader = null; // 准备好一个输入的对象
reader = new FileReader(f); // 通过对象多态性,进行实例化
// 第3步:进行读操作
char c[] = new char[1024]; // 所有的内容读到此数组之中
int len = reader.read(c); // 将内容输出
// 第4步:关闭输入流
reader.close(); // 关闭输入流
System.out.println(“内容为:” + new String(c, 0, len)); // 把字符数组变为字符串输出
}
System类对IO的支持:
System.out:系统标准输出,一般是显示器
System.err:错误信息输出
System.in:标准输入,一般是键盘
例子:
//使用OutPutStream向屏幕上输出
public static void main(String[] args) {
OutputStream out = System.out ; // 此时的输出流是向屏幕上输出
try {
out.write("hello world!!!".getBytes()) ; // 向屏幕上输出
} catch (IOException e) {
e.printStackTrace();
}
try {
out.close() ; // 关闭输出流
} catch (IOException e) {
e.printStackTrace();
}
}
//从键盘上读取数据
public static void main(String[] args) throws Exception { // 所有异常抛出
InputStream input = System.in; // 从键盘接收数据
byte b[] = new byte[5]; // 开辟空间,接收数据
System.out.print("请输入内容:"); // 信息提示
int len = input.read(b); // 接收数据
System.out.println("输入的内容为:" + new String(b, 0, len));
input.close(); // 关闭输入流
}
数据操作流:
在io包中,提供了数据输出流(DataOutputStream)和数据输入流(DataInputStream)
例子:
//将数据写入文件中
public static void main(String[] args) throws Exception {
DataOutputStream dos = null ; // 声明数据输出流对象
File f = new File("D:" + File.separator + "order.txt");// 指定文件的保存路径
dos = new DataOutputStream(new FileOutputStream(f)) ;// 实例化数据输出流对象
String names[] = { "衬衣", "手套", "围巾" }; // 商品名称
float prices[] = { 98.3f, 30.3f, 50.5f }; // 商品价格
int nums[] = { 3, 2, 1 }; // 商品数量
for (int i = 0; i < names.length; i++) { // 循环写入
dos.writeChars(names[i]) ; // 写入字符串
dos.writeChar('\t') ; // 加入分隔符
dos.writeFloat(prices[i]) ; // 写入小数
dos.writeChar('\t') ; // 加入分隔符
dos.writeInt(nums[i]) ; // 写入整数
dos.writeChar('\n') ; // 换行
}
dos.close() ; // 关闭输出流
}
//从文件中读取数据
while(true){
temp = new char[200] ;
len = 0 ;
while((c=dis.readChar())!='\t'){ // 读取字符
temp[len] = c;
len++ ;
}
name = new String(temp,0,len) ;
price = dis.readFloat() ; // 读取float
dis.readChar() ; // 读出\t
num = dis.readInt() ; // 读取int
dis.readChar() ; // 读出\n
System.out.printf("名称:%s;价格:%5.2f;数量:%d\n",name,price,num) ;
}
对象序列化
定义:就是把一个对象变成二进制的数据流的一种方法
好处:方便的实现对象的传输或存储
如果一个对象想被序列化,则对象所在的类必须实现java.io.Serializable接口
要想完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象输入流(ObjectInputStream),使用对象输出流输出序列化对象的步骤,有时也称为序列化,而使用对象输入流读入对象的过程,有时也称为反序列化
//例子:
//将Person类的对象保到文件中
public static void main(String[] args) throws Exception {
File f = new File("D:" + File.separator + "test.txt");
ObjectOutputStream oos = null;
OutputStream out = new FileOutputStream(f); // 文件输出流
oos = new ObjectOutputStream(out); // 为对象输出流实例化
oos.writeObject(new Person("张三", 30)); // 保存对象到文件
oos.close(); // 关闭输出
}
//从文件中将Person对象反序列化
public static void main(String[] args) throws Exception {
File f = new File("D:" + File.separator + "test.txt");
ObjectInputStream ois = null;
InputStream input = new FileInputStream(f); // 文件输入流
ois = new ObjectInputStream(input); // 为对象输出流实例化
Object obj = ois.readObject(); // 读取对象
ois.close(); // 关闭输出
System.out.println(obj);
}
下一篇: 怎么向零基础的同学讲解栈?