Java字节流

Java字节流教程

Java 语言 中,所有的数据都是以流的方式进行传输或者保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候就需要使用输出流。

Java 语言对文件进行操作的时候是以流的方式进行操作的,主要有如下步骤:

  1. 使用 File 类打开一个文件
  2. 通过字节流或者 字符流 的子类指定输出的位置
  3. 进行读/写操作
  4. 关闭输入/输出

Java字节流

字节流主要操作 byte 类型的数据,以 byte 的数组为准。主要操作类是 OutputStream 类来操作字节输出流,InputStream 类来操作字节输入流。

Java OutputStream类详解

说明

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("===结束=="); } }

运行结果如下

03 java 字符流.png

生成的文件内容如下

02 Java outputstream.png

在对文件操作的时候,会有一些异常要捕获,我们在这边偷懒,直接在方法那边进行了throws Exception 异常统一处理。

OutputStream 类作为字节流输出类,我们可以将对应的信息填充到文件里面。在对应的目录里面,我们没有 filetest.txt 这个文件,但是执行了程序之后,就生成了该文件,并且在文件里面追加了我们的字符串信息。

Java InputStream类

说明

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("===结束=="); } }

运行结果如下

04 inputStream.png

可以通过一次性读取文件的格式,将所有的内容填写到字节数组中,也可以 read() 方法,一个一个字节读取,如果读取到的数据为 -1 表示已经读取到文件末尾。

Java字节流总结

字节流里面,输出流是 OutputStream ,它可以将字节信息填写到文件里面,InputStream 是输入流,它可以将文件中的内容读取。

InputStream 和 OutputStream 是抽象类,如果要使用它们的方法或者定义它们的对象,需要使用它们的子类。