在java.io包中操作文件内容的主要有两大类:字节流、字符流,两类都分为输入和输出操作。在字节流中输出数据主要是使用OutputStream完成,输入使的是InputStream,在字符流中输出主要是使用Writer类完成,输入主要是使用Reader类完成。
在JAVA中IO操作也是有相应步骤的,以文件操作为例,主要的操作流程如下:
A、使用File类打开一个文件
B、通过字节流或字符流的子类,指定输出的位置
C、进行读/写操作
D、关闭输入/输出
字节流主要是操作byte类型数据,以byte数组为准,主要操作类就是OutputStream、InputStream。
字节输出流:OutputStream
字节输入流:InputStream
一、OutputStream
OutputStream类的常用方法
No. | 方法或常量 | 类型 | 描述 |
1 | public void close() throws IOException | 普通 | 关闭输出流 |
2 | public void flush() throws IOException | 普通 | 刷新缓冲区 |
3 | public void write(byte[] b) throws IOException | 普通 | 将一个byte数组写入数据流 |
4 | public void write(byte[] b,int off,int len) throws IOException | 普通 | 将一个指定范围的byte数组写入数据流 |
5 | public abstract void write(int b) throws IOException | 普通 | 将一个字节数据写入数据流 |
要想使用以上方法,必须使用子类实例化,此时使用FileOutputStream子类,此类的构造方法如下:
public FileOutputStream(File file) throws FileNotFoundException
例如:向文件中写入字符串。
向文件中写入字节流的视频:
1、在web目录中创建一个页面outputstream.jsp,如下图所示。
完整代码如下。
<%@ page cnotallow="text/html;charset=UTF-8" language="java" %>
<%@page import="java.io.*" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
try {
// 第1步、使用File类找到一个文件
File f = new File("d:" + File.separator + "test.txt"); // 声明File对象
// 第2步:通过子类实例化父类对象
// 准备好一个输出的对象
// 通过对象多态性,进行实例化
// 第3步:进行写操作
// 准备一个字符串
byte b[] = str.getBytes(); // 只能输出byte数组,所以将字符串变为byte数组
// 将内容输出,保存文件
// 第4步:关闭输出流
output.close();
out.print("向文件写入数据结束");
}catch (Exception e){
e.printStackTrace();
}
%>
</body>
</html>
运行结果如下。
上面操作中,如果重新执行程序,则肯定会覆盖文件中的已有内容,那么此时可以通过FielOutputStream向文件中追加内容,FileOutputStream的另外一个构造方法:
public FileOutputStream(File file,boolean append) throws FileNotFoundException
在构造方法中,如果将append的值设置为true,则表示在文件的末尾追加内容。
把上面代码修改如下。
<%@ page cnotallow="text/html;charset=UTF-8" language="java" %>
<%@page import="java.io.*" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
try {
// 第1步、使用File类找到一个文件
File f = new File("d:" + File.separator + "test.txt"); // 声明File对象
// 第2步:通过子类实例化父类对象
// 准备好一个输出的对象
output = new FileOutputStream(f,true); // 通过对象多态性,进行实例化
// 第3步:进行写操作
// 准备一个字符串
byte b[] = str.getBytes(); // 只能输出byte数组,所以将字符串变为byte数组
// 将内容输出,保存文件
// 第4步:关闭输出流
output.close();
out.print("向文件写入数据结束");
}catch (Exception e){
e.printStackTrace();
}
%>
</body>
</html>
运行结果如下。
二、字节输入流:InputStream
字节输入流:InputStream的视频:
既然程序可以向文件中写入内容,则就可以通过InputStream从文件中把内容读取进来,首先来看InputStream类的定义:
public abstract class InputStream extends Object implements Closeable
与OutputStream类一样,InputStream本身也是一个抽象类,必须依靠其子类,如果现在是从文件中读取,子类肯定是FileInputStream。
观察FileInputStream类的构造方法:
public FileInputStream(File file) throws FileNotFoundException
InputStream类的常用方法
No. | 方法或常量 | 类型 | 描述 |
1 | public int available() throws IOException | 普通 | 可以取得输入文件的大小 |
2 | public void close() throws IOException | 普通 | 关闭输入流 |
3 | public abstract int read() throws IOException | 普通 | 读取内容,以数字的方式读取 |
4 | public int read(byte[] b) throws IOException | 普通 | 将内容读到byte数组之中,同时返回读入的个数 |
例如:从文件中读取内容
1、在web目录中创建一个页面inputstream.jsp,如下图所示。
完整代码如下。
<%@ page cnotallow="text/html;charset=UTF-8" language="java" %>
<%@page import="java.io.*" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
try {
// 第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[(int)f.length()]; // 所有的内容读到此数组之中,数组大小由文件决定
input.read(b); // 将内容读出
// 第4步:关闭输入流
input.close(); // 关闭输入流
out.println("内容为:" + new String(b)); // 把byte数组变为字符串输出
}catch (Exception e){
e.printStackTrace();
}
%>
</body>
</html>
运行结果如下。