Java 字节流

介绍

  在Java的I/O类库中,总共有4种类型的操作。其中java.io.InputStream和java.io.OutputStream分别表示字节输入流和字节输出流,它们都是抽象类,不能实例化,数据流中的最小单位是字节,所以叫做字节流。在这里,只介绍字节流的概念和操作。其他I/O流的概念请参考Java IO 工作机制
字节流

InputStream中的读取数据的方法

序号 方法名 描述
1 int read() 从输入流中读取数据的下一个字节。
2 int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
3 int read(byte[] b, int off, int len) 将输入流中最多 len 个数据字节读入 byte 数组。
4 int available() 返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。
5 void mark(int readlimit) 在此输入流中标记当前的位置。
6 void close() 关闭此输入流并释放与该流关联的所有系统资源。

  方法的详细信息请参考API

InputStream代码演示

字节数组输入流ByteArrayInputStream

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String[] args) throws IOException {
String str = "abcdefg";

final byte[] bytes = str.getBytes();//字符串转换成字节数组

ByteArrayInputStream bs = new ByteArrayInputStream(bytes);
int data = bs.read(); //从字节数组输入流读取字节
while (data!=-1){
char upper = (char) Character.toUpperCase(data);
System.out.print(upper+" ");
data=bs.read();
}
bs.close();
}

输出结果为:A B C D E F G

文件输入流FileInputStream代码演示

  首先新建一个txt文件夹,里面写入abcdefg。然后利用如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static void main(String[] args) throws IOException {

File file = new File("test.txt");
FileInputStream fs = new FileInputStream(file);

byte[] bytes = new byte[8];
fs.read(bytes);//从文件输入流读入字节,并输出到字节数组
ByteArrayInputStream bs = new ByteArrayInputStream(bytes);
int data = bs.read(); //从字节数组输入流读取字节
while (data!=-1){
char upper = (char) Character.toUpperCase(data);
System.out.print(upper+" ");
data=bs.read();
}
bs.close();
fs.close();
}

结果为:A B C D E F G
  这里我们只简单介绍常用的两种输入流,其他输入流的概念较为复杂,这里就不多说。

OutputStream中的写入数据的方法

序号 方法名 描述
1 void close() 关闭此输出流并释放与此流有关的所有系统资源。
2 void flush() 刷新此输出流并强制写出所有缓冲的输出字节。
3 void write(byte[] b) 将 b.length 个字节从指定的 byte 数组写入此输出流。
4 void write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
5 abstract void write(int b) 将指定的字节写入此输出流。

  方法的详细信息请参考API

OutputStream代码演示

字节数组输出流ByteArrayOutputStreamd代码演示

1
2
3
4
5
6
7
8
public static void main(String[] args) throws IOException {

ByteArrayOutputStream bs = new ByteArrayOutputStream();
String s = "test OutputStream";
byte[] bytes = s.getBytes();
bs.write(bytes); //将指定的byte数组写到字节数组输出流中
System.out.println(bs.toString());//将字节数组输出流内容转换成字符串输出
}

输出结果为:test OutputStream

文件输出流FileInputStream代码演示

1
2
3
4
5
6
7
8
public static void main(String[] args) throws IOException {

String s = "test OutputStream";
byte[] bytes = s.getBytes();
FileOutputStream fos = new FileOutputStream("test.txt",true);//创建一个输出流,后面一个参数true表示追加,原有内容不会被清除,默认为false
fos.write(bytes);//把字节数组bytes的内容通过输出流写到指定文件
fos.close();
}

  查看文件,可以发现文件内容增加了test OutputStream内容。
  最后我们可以发现,大部分字节输入流输出流的操作原理基本一致,只要掌握好各种基本类型的操作,理解其父类InputStream和OutputStream的常用方法,问题就能得到解决。