【导言,您正在阅读的是软件开发系列教程中的Java入门基础课程。这是一个系列教程,可以点击作者头像查看文章列表。动动手指关注一下,跟着熊猫学编程。】
Java 文件处理所用到的类都在Java. io 包下。
流
Java对文件的读写操作是用流的方式进行的。读取用输入流InputStream,写入用输出流OutputStream。InputStream和OutputStream是抽象类,定义了操作所需要的一系列抽象方法。具体实现有子类来完成,每种子类实现的方式又有不同。
Java的读写操作为了支持 Unicode 字符,又分为两种:字符流和字节流。

流的概论图
说到这里,肯定有人会问,那到底什么是流呢。
可以把Java中的流看成一个抽象的概念,可以把它想象成一个管道,当管道建立好了后,程序序只需要从管道里面读,取数据即可,具体实现方式由管道自己处理。
当Java程序需要读取数据时,就会从数据源开启一个输入流。 数据源可以是文件,内存或者网络等。 同样,当程序需要写出数据到数据源时也会开启一个输出流,输出流的数据源 也可以是文件、内存或者网络等。 也就是说不管是输入,输出,Java只管跟流打交道,只要是能开启流就能读取,输出数据。
字节流和字符流
字节流,就是用来处理字节数据的流,我们知道所有的数据其储存形式都是以字节来存放的。比如图像,视频,对象等这种数据都是二进制的数据,一般都是用字节流一个字节一个字节的处理。
字符流,但有些对象很特别,Unicode是用两个字节来存储数据的,因些处理含Unicode数据时,就要用到字符流。程序会自动进行转换处理存储细节。
字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串。字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以;
以上说法很罗索,大家只要记住一点,你要处理含中文的字符,文本,就用字符流就ok。其它一切用字节流。
文件处理
- 一般文件处理步骤
- File对象指定文件位置
- 利用字节或者字符流来打开文件资源
- 读取或者输出数据
- 关闭输出输入流
一定要注意,操作文件属于资源操作,用完了一定要关闭,否则会一直占用文件。
我们来看一个例子,我们新建一个类,Cat,然后把这个类对象写入到文件中。然后再读取出来。由于写入的是类对象,所以我们用字节流。
我们建一个Cat类,实现Serializable,注意要对象必须要实现这个接口才能进行序列化相关操作,不然会报编译错误。
class Cat implements Serializable {
String color;
public Cat(String color) {
this.color=color;
}
public void color() {
System.out.println(“这是只花猫”);
}
}
然后在写一个方法 将cat对象写入
/**
* 对象写入到文件
*
* @param cat
* @throws IOException
*/
public void writeObject() throws IOException {
File file = new File(“cat.dat”);
ObjectOutputStream out = null;
try {
out = new ObjectOutputStream(new FileOutputStream(file));
out.writeObject(this);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
out.close();
}
}
我们来分析这段代码
File file = new File(“cat.dat”);
表示在当前目录建立了一个文件对象的引用,它代表一个文件,File有多个构造函数,这里传入一个字符串,代表文件名。
建立一个对象输出流ObjectOutputStream,此对象需要一个OutputStream流对象引用作为参数。
我们这里因为是操作文件,所以用到了FileOutputSteam流对象。
FileOutputSteam对象的实例化需要一个File对象做为参数。
out = new ObjectOutputStream(new FileOutputStream(file));
ObjectOutputStream对象实例化有可能会抛出IO异常,所以这里要添加try-catch语句。
然后调用ObjectOutputStream对象的writeObject方法。
在这里我们用this关键字,它表示在当前类的范围内特指这个类的对象本身。在这里就是指的cat对象。
执行完毕后,别忘了在finally语句里面关闭Output流。
运行此方法后,会在同目录出现一个cat.dat文件。

运行结果
然后我们再写一个方法,从这个文件中读取这个类对象,并调用这个对象的方法。
/**
* @param cat
* @throws IOException
*/
public Cat readObject() throws IOException {
File file = new File(“cat.dat”);
ObjectInputStream in = null;
Cat cat = null;
try {
in = new ObjectInputStream(new FileInputStream(file));
cat = (Cat) in.readObject();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
in.close();
}
return cat;
}
public static void main(String[] args) {
Cat cat = new Cat(“白色”);
try {
cat.writeObject();
//读取对象
Cat cat2=cat.readObject();
cat2.color();
} catch (IOException e) {
e.printStackTrace();
}
}
运行此函数 会看到打印一行语句

运行结果2
字符流
下面我们来看看字符流的相关例子
package com.ui.file;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class FileDemo {
public static void main(String[] args) {
File file = new File(“str.dat”);
PrintWriter pw = null;
try {
pw = new PrintWriter(new FileWriter(file));
pw.write(“今天是个好天气”);
pw.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
pw.close();
}
}
}
在这里我们用到了PrintWriter对象,此对象可以向文本文件按行写入中文字符。
PrintWriter对象需要一个FileWriter对象做为参数,而FileWriter又需要一个文件File对象做为参数。我们这里把字符写入到当前文件str.dat中。
写入时调用PrintWriter的println方法,写一行字符。
运行程序时,会发现在当前目录新建了一个str.dat文件,用记事本打开如下。

运行结果3
Java对文件的处理主要集中在File类里面,可以查询Java API文档,来了解File类的基本用法。
课后总结:
理解Java中流的概念
熟悉Java中有关File的相关操作
理解字节流和字符流的不同处理方式。
课后作业
用程序生成一个str.txt文件,然后向文件中写入一行中文:“我在努力学习Java编程”
【原创教程】欢迎关注,每天2小时,只要你跟着学,就能轻松掌握编程技术,我是熊猫,明天见。
下期课程预告:
Java工具包