在 Java 语言 中,所有的数据都是以流的方式进行传输或者保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候就需要使用输出流。
Java 语言对文件进行操作的时候是以流的方式进行操作的,主要有如下步骤:
字节流主要操作 byte 类型的数据,以 byte 的数组为准。主要操作类是 OutputStream 类来操作字节输出流,InputStream 类来操作字节输入流。
OutputStream是一个抽象类,想要使用该类的方法的话,可以使用它的子类,如果我们要操作一个子类,就可以使用 FileOutputStream。OutputStream 常用的方法有:
方法 | 描述 |
---|---|
public void close() throws IOException | 关闭输出流 |
public void flush() throws IOException | 刷新缓冲区,强制将缓冲区中的数据写入文件。OutputStream 这个里面没有具体方法,所以具体的操作还是要看子类的具体实现 |
public void write(byte b[]) throws IOException | 将一个byte数组写入数据流 |
public void write(byte b[], int off, int len) throws IOException | 将一个指定范围的 byte 数组写入数据流 |
public abstract void write(int b) throws IOException | 将一个字节的数据写入数据流 |
package com.haicoder.net.stream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class OutPutStreamTest {
public static void main(String[] args) throws Exception {
System.out.println("嗨客网(www.haicoder.net)");
File file = new File("/Users/haicoder/Documents/code/hai/filetest.txt"); //如果文件不存在,会自动创建
OutputStream outputStream = new FileOutputStream(file, true); //true 表示可以在文件末尾追加内容 false 表示不能追加
String appendInfo = "嗨客网,你好啊!\r\n"; //\r\n 在追加文件的时候,表示换行
byte b[] = appendInfo.getBytes();
outputStream.write(b); //调用 write(byte b[]) 方法
for (int i = 0; i < b.length; i++) {
outputStream.write(b[i]); //调用 write(int b) 方法
}
outputStream.close();
System.out.println("===结束==");
}
}
运行结果如下
生成的文件内容如下
在对文件操作的时候,会有一些异常要捕获,我们在这边偷懒,直接在方法那边进行了throws Exception 异常统一处理。
OutputStream 类作为字节流输出类,我们可以将对应的信息填充到文件里面。在对应的目录里面,我们没有 filetest.txt
这个文件,但是执行了程序之后,就生成了该文件,并且在文件里面追加了我们的字符串信息。
InputStream 也是一个抽象类,它的作用和 OutputSteam 相反,将文件中的内容以 byte 形式读取出来。InputStream 常用的方法有:
方法 | 描述 |
---|---|
public int available() throws IOException | 获取读取的文件的大小 |
public void close() throws IOException | 关闭文件 |
public abstract int read() throws IOException | 读取内容,依次读取 byte 数组中的数据,如果没有读取到文件末尾,返回对应的数值,如果读取到文件的末尾就返回 -1 ,表示该文件读取结束 |
public int read(byte b[]) throws IOException | 读取 b[] 长度的数据,并且将数据存储在 b 数组中。如果读取到文件末尾,没有数据可以读取,就返回 -1,其他的话读取多少,返回多少长度 |
package com.haicoder.net.stream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class InputStreamTest {
public static void main(String[] args) throws Exception {
System.out.println("嗨客网(www.haicoder.net)");
File file = new File("/Users/haicoder/Documents/code/hai/filetest.txt");
InputStream inputStream = new FileInputStream(file);
System.out.println("第一种读取方式");
byte b[] = new byte[1024]; //定义一个数组,用来存储读取的数据
int len = inputStream.read(b); //将所有的内容读取出来,最多存放文件中 1024 byte 的数据,如果超过来,也只能读取 1024 byte 长度的数据
inputStream.close();
System.out.println("读入的数据长度:" + len);
System.out.println("读入的数据内容:\n" + new String(b, 0, len));
System.out.println("另一种读取方式");
InputStream input = new FileInputStream(file);
int fileContentLen = 0;
byte b2[] = new byte[1024];
int tmp = 0;
while ((tmp = input.read()) != -1) { //读取的内容如果是 -1 表示读取到文件结尾,不需要继续读取
b2[fileContentLen] = (byte) tmp;
fileContentLen++;
}
input.close();
System.out.println("第二种方式读取的内容为:\n" + new String(b2, 0, fileContentLen));
System.out.println("===结束==");
}
}
运行结果如下
可以通过一次性读取文件的格式,将所有的内容填写到字节数组中,也可以 read() 方法,一个一个字节读取,如果读取到的数据为 -1 表示已经读取到文件末尾。
字节流里面,输出流是 OutputStream ,它可以将字节信息填写到文件里面,InputStream 是输入流,它可以将文件中的内容读取。
InputStream 和 OutputStream 是抽象类,如果要使用它们的方法或者定义它们的对象,需要使用它们的子类。