输入和输出处理(一)
任务1使用I/O操作文件
关键步骤如下。
➢使用File类操作文件或目录属性。
➢使用FileInputStream 类读文本文件。
➢使用FileOutputStream类写文本文件。
➢使用BufferedReader类和FileReader类读文本文件。
➢使用BufferedWriter类和FileWriter类写文本文件。
➢使用DataInputStream类读二进制文件。
➢使用DataOutputStream类写二进制文件。
➢重定向标准I/O。
操作文件或目录属性
在计算机中,通常使用各种各样的文件来保存数据,如何在Java程序中操作这些文件呢? java.io 包提供了一些接口和类, 对文件进行基本的操作,包括对文件和目录属性的操作、对文件读写的操作等。首先学习如何使用File类操作文件或目录。
File对象既可表示文件,也可表示目录,在程序中一个File对象可以代表一个文件或目录。利用它可用来对文件或目录进行基本操作。它可以查出与文件相关的信息,如名称、最后修改日期、文件大小等。
File类的构造方法如表3-1所示。
表3-1 File类的构造方法
| 方法 | 说明 |
|---|---|
| File(String pathname) | 用指定的文件路径构造文件 |
| File(String dir, String subpath) | 在指定的目录下创建指定文件名的文件。dir参数指定目录路径,subpath参数指定文件名 |
| File(File parent, String subpath) | 根据一个文件对象和一个字文件构造文件对象parent 参数指定目录文件,subpath参数指定文件名 |
File类的常用方法如表3-2所示。
表3-2 File类的常 用方法
| 方法 | 说明 |
|---|---|
| boolean exists() | 测试文件是否存在 |
| String getAbsolutePath() | 返回此对象表示的文件的绝对路径名 |
| String getName() | 返回此对象表示的文件的名称 |
| String getParent() | 返回此File对象的路径名的上一级,如果路径名没有上一级,则返回null |
| boolean delete() | 删除此对象指定的文件 |
| boolean createNewFile() | 创建空文件,不创建文件夹 |
| boolean isDirectory() | 测试此File对象表示的是否是目录 |
| boolean mkdir() | 创建一个目录,它的路径名由当前File对象指定 |
| boolean mkdirs() | 创建包括父目录的目录 |
使用File类操作文件和目录属性的步骤一般如下。
(1)引入File类。
import java.io.File;
(2)构造一个文件对象。
File file=new File("text.txt");
(3)利用File类的方法访问文件或目录的属性,具体使用如下。
file.exists();//判断文件或目录是否存在
file.isFile();//判断是否是文件
file.isDirectory();//判断是否是目录
file.getName();//获取文件或目录的名称
file.getPath();//获取文件或目录的路径
file.getAbsolutePath();//获取文件或目录的绝对路径
file.lastModified();//获取文件或目录的最后修改日期
file.length();//获取文件或目录的大小,单位为字节
注意
File类有许多方法,对于这些方法不需要死记硬背,编程时若用到相关的方法,查看API 即可。
示例1
使用File类创建和删除文件。
实现步骤如下。
1)引入File类。
2)构造一个文件对象。
3)调用File 类的方法创建和删除文件。
关键代码:
import java.io.File;
import java.io.IOException;
class FileMethods {
public static void main(String[] args) throws IOException {
// 创建和删除文件
FileMethods fm = new FileMethods();
File f = new File("D:/data/d1.txt");
fm.create(f);
fm.delete(f);
}
//创建文件的方法
public void create(File file) throws IOException {
if (!file.exists()) {
file.createNewFile();
}
}
//删除文件的方法
public void delete(File file) throws IOException {
if (file.exists()) {
file.delete();
}
}
}
注意
①写文件名时要注意后缀,如test.doc、test.java 及test.txt 是3个不同的文件
②构造File类对象时,会区分文件或目录名称的大小写
认识Java的流
前面讲述了如何利用java.io包的File类对文件或目录的属性进行操作,但File 类不能访问文件的内容,即不能从文件中读取数据或往文件里写数据。下面介绍文件的读写操作。
读文件是指把文件中的数据读取到内存中。反之,写文件是把内存中的数据写到文件中。那通过什么读写文件呢?答案就是流。
流是指一串流动的字符, 是以先进先出的方式发送和接收数据的通道


流分为输入流和输出流,如上图所示。输入/输出流是相对于计算机内存来说的,如果数据输入到内存,则称为输入流,如果从内存中输出则称为输出流。Java 的输出流主要由OutputStream和Write作为基类,而输入流则主要由InputStream和Reader作为基类。
在java.io包中,封装了许多输入/输出流的API。在程序中,这些输入/输出流类的对象称为流对象。可以通过这些流对象将内存中的数据以流的方式写入文件,也可以通过流对象将文件中的数据以流的方式读取到内存。
构造流对象时往往会和数据源(如文件)联系起来。数据源分为源数据源和目标数据源。输入流关联的是源数据源;输出流关联的则是目标数据源。


输入/输出流又分为字节流和字符流两种形式,如上图所示。
字节流是8位通用字节流,其基本单位是字节。字节流的基类是InputStream类和OutputStream类,它们是抽象类。
字符流是16位Unicode字符流,基本单位是 Unicode字符。字符流最适合用来处理字符串和文本,因为它们支持国际上大多数的字符集和语言。字符流的基类是Reader类和Writer类,它们也是抽象类。
一个被访问的流的基本特征都是通过实现这4个抽象类的方法来建立的。这些类的常用方法分别如表3-3至表3-6所示。
表3-3 InputStream类 的常用方法
| 方法 | 说明 |
|---|---|
| int read() | 从输入流中读取下一个字节数据 |
| int read(byte[] b) | 从输入流中读取数据,并将数据存储在缓冲区数组b中,返回实际读取的字节数 |
| int read(byte[] b,int off,int len) | 从输入流中读取最多len长度的字节,保存到字节数组b中,保存的位置从off开始 |
| void close() | 关闭输入流 |
InputStream类的常用子类有FileInputStream,用于从文件中读取数据。
表3-4 OutputStream类的常 用方法
| 方法 | 说明 |
|---|---|
| void write(int c) | 将指定的字节数据写入此输出流中 |
| void write(byte[] buf) | 将数组buf中的所有字节写入此输出流中 |
| void write(byte[] b,int off,int len) | 将字节数组中从偏移量of开始的长度为Ien的字节数据输出到输出流中 |
| void close() | 关闭输出流 |
OutputStream 类的常用子类为FileOutputStream用于向文件写数据。
表3-5 Reader类的常用方法
| 方法 | 说明 |
|---|---|
| int read() | 从输入流中读取单个字符,返回所读取的字符数据 |
| int read(byte[] c) | 从输入流中最多读取c.length个字符,保存到字符数组c中,返回实际读取的字符数 |
| int read(char[] c,int off,int len) | 从输入流中读取最多len个字符,保存到字符数组c中,保存的位置从off位置开始,返回实际读取的字符数 |
| void close() | 关闭流 |
Reader类的常用子类为BufferedReader,接受Reader对象作为参数,并对其添加字符缓冲器。
表3-6 Writer类 的常用方法
| 方法 | 说明 |
|---|---|
| void write(String str) | 将str字符串里包含的字符输出到指定的输出流中 |
| void write(String str,int off,int len) | 将str字符串里从off位置开始,长度为len的多个字符输出到输出流中 |
| void close() | 关闭输出流 |
| void flush() | 刷新输出流 |
Writer类的常用子类为BufferedWriter,用于将数据缓冲到字符输出流。
注意
①在操作上字节流与字符流有一个区别,字符流在操作时使用了缓冲区(内部存储器),而字节流在操作时直接操作文件,不会使用缓冲区。
②所有的这些方法在出现错误时都会抛出IOException异常。
由于最常见的文件读写是对文本文件和二进制文件的读写,下面将从这两个方面进行讲述。
读写文本文件
通常可以使用java.io包里的流读写文本文件。
1.使用字节流读写文本文件
(1) 使用字节流类FileInputStream读文本文件
FilelmputStream称为文件输入流,它是字节输入流InputStream抽象类的一个子类,它的作用是将文件中的数据输入到内部在储器(简称内存)中,可以利用它来读取文本文件中的数据,其具体实现步骤如下。
1)导入相关的类。
import. java.io.IOException;
import java.io.InputStream;
import java.io.FileInputStream;
2)构造一个文件输入流对象。
InputStream fileObject=new FlieInputStream("text.txt");
此时的文件输入流对象fileObject就和源数据源( text.txt文件)关联起来。
3)利用文件输入流类的方法读取文本文件的数据。
//可读取的字节数
fileObject.available();
//读取文件的数据
fileObject.read();
4)关闭文件输入流对象。
fileObject.close();
下们通过示例2学习如何利用FileInputStream类读取文本文件的数据。
示例2
使用FileInputStream类读取文本文件的数据。
实现步骤如下。
①引入相关类。
②在C盘下创建目录myDoc,并在此目录下创建文件helo.txt,文件中保存的内容为“abc"。
③创建流对象。
④调用read()方法读取数据。
⑤关闭流对象。
关键代码:
public class FileInputStreamTest {
public static void main(String[] args) throws IOException {
//创建流对象
FileInputStream fis = new FileInputStream("C:/myDoc/hello.txt");
int data;
System.out.println("可读取的字节数:" + fis.available());
System.out.print("文件内容为:");
//循环读数据
while ((data = fis.read()) != -1) {
System.out.print(data + " ");
}
//关闭流对象
fis.close();
}
}
示侧2演元了使用FileInputStream类读取文本文件中的数据的步骤,但是读出的内容与文件中保存的内容并不致,文件中保存了"abc”, 而输出的结果是97 98 99,这是什么原因呢?如何正确地输出文件中的内容呢?读者可以先思考下。
注意
使用FileInputStream类读文件数据时应注意以下几个方面。
①read()方法返回整數,如果读取的是字符串, 需进行强制类型转换。
②流对象使用完毕后需要关闭。
(2)使用字节流类FileOutputStream写文本文件
FileOuputStream称为文件输出流,它是字节输出流OutputStream抽象类的子类,它的作用是把内存中的数据输出到文件中,可以利用它把内存中的数据写入到文本文件中,具体实现步骤如下。
1)引入相关的类。
import java.io.IOException;
import java.io.OutputStream;
import java.io.FileOutputStream;
2)构造一个文件输出流对象。
OutputStream fos=new FileOutputStream("text.txt");
此时的文件输出流对象fos就和目标源数据源(text.txt文件)关联起来了。
3)利用文件输出流的方法把数据写入到文本文件中。
String str="好好学习Java";
byte[] words=str.getBytes();
//利用write方法将数据写入到文件中去
fos.write(words, 0, words.length);
4)关闭文件输出流。
fos.close();
下面通过示例3学习FileOutputStream类的用法。
示例3
使用FileOutputStream类向文本文件中写入数据。
实现步骤如下。
①引入相关类。
②创建流对象。
③调用write()方法写入数据到文件中。
④关闭流对象。
关键代码:
try
{
String str = "好好学习Java";
byte[] words = str.getBytes();//字节数组
// 创建流对象,以追加方式写入文件
FileOutputStream fos = new FileOutputStream("C:/myDoc/hello.txt", true);
//写入文件
fos.write(words, 0, words.length);
System.out.println("文件已更新!");
fos.close(); //1 关闭流
}catch(
IOException obj)
{
System.out.println("创建文件时出错");
}
}
示例3执行完毕后,“好好学习Java"这个字符串会写入hello.txt文件中,并且新写入的内容会追加在原有内容的后面。默认情况下,向文件写数据时将覆盖文件中原有的内容。
代码FileOutputStream fos=new FileOutputStream(“C:\myDoc\hello.txt” ,true);中第二个参数为true,表示在文件末尾添加数据,并且如果hello.txt这个文件不存在,程序运行后,将首先创建此文件然后写入数据。
注意
使用FileOutputStream 类读文件数据时应注意以下几个方面:
①在创建FileOutputStream 实例时,如果相应的文件并不存在,就会自动创建一个空的文件。
②如果参数file或name表示的文件路径存在,但是代表一个文件目录,则此时会抛出FileNotFoundException 类型的异常。
③默认情况下,向文件写数据时将覆盖文件中原有的内容。
2.使用字符流读写文本文件
(1)使用字符流类BufferedReader和FileReader读文本文件
BufferedReader和FileReader两个类都是Reader抽象类的子类,它们可以通过字符流的方式读取文件,并使用缓冲区,提高了读文本文件的效率。读取文本文件的具体步骤如下。
1)引入相关的类。
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
2)构造一个BufferedReader对象。
FileReader fr= new Fileader("mytest.txt");
BufferedReader br=new BuferedReader(fr);
3)利用BufferedReader类的方法读取文本文件的数据。
br.readLine();//读取一行数据,返回字符串
4)关闭相关的流对象,
br.close();
fr.close();
下面通过示例4学习BufferedReader类和FileReader类的用法。
示例4
使用BufferedReader类和FileRear类读取文本文件数据。
实现步骤如下。
①引入相关类。
②创建流对象。
③调用readLine(方法读取数据。
④关闭流对象。
关键代码:
try
{
//创建一个 FileReader对象
FileReader fr = new FileReader("C:\\myDoc\\hello.txt");
//创建一个 BufferedReader 对象
BufferedReader br = new BufferedReader(fr);
//读取一行数据
String line = br.readLine();
while (line != null) {
System.out.println(line);
line = br.readLine();
//关闭流
br.close();
fr.close();
}catch(IOException e){
System.out.println("文件不存在!");
}
}
(2)使用字符流类BufferedWriter和FileWriter写文本文件
BufferedWriter和FileWriter都是字符输出流Writer 抽象类的子类,它们可以通过字符流的方式并通过缓冲区把数据写入文本文件,提高了写文本文件的效率。把数据写入文本文件的具体操作步骤如下。
1)引入相关的类。
import java.io.FileWriter ;
import java.io.BufferedWriter ;
import java.io.IOException;
2)构造一个BufferedWriter对象。
FileWriter fw= new FileWriter( "mytest.txt");
BufferedWriter bw=new BufferedWriter(fw);
3)利用BufferedWriter类的方法写文本文件。
bw.wite("hello");
4)相关流对象的清空和关闭。
bw.flush(),
bw.close();
fw.close();
下面通过示例5学习BufferedWriter类及FileWriter 类的用法。
示例5
使用BufferedWriter及FileWriter对象向文本文件中写数据,并将写入文件的数据读取出来显示在屏幕上。
实现步骤如下。
①引入相关类。
②创建流对象。
③调用write() 方法写数据。
④调用flush()方法刷新缓冲区。
⑤读取写入的数据。
⑥关闭流对象。
关键代码:
try
{
//创建一个FileWriter 对象
FileWriter fw = new FileWriter("C:\\myDoc\\hello.txt");
//创建一个 BufferedWriter 对象
BufferedWriter bw = new BufferedWriter(fw);
//写入信息
bw.write("大家好! ");
bw.write("我正在学习BufferedWriter。 ")
bw.newLine();
bw.write("请多多指教! ");
bw.newLine();
bw.flush();
//刷新缓冲区
bw.close();
fw.close();
//关闭流
}catch(
IOException e)
//读取文件内容同示例4代码,此处省略
{
System.out.println("文件不存在!");
}
10万+

被折叠的 条评论
为什么被折叠?



