Java基础:IO流之字节流

字节流

Java 中的 IO 流按操作数据可以分为字节流与字符流,字节流主要用于对图片,视频等数据进行操作。而字符流是可以直接读写字符的 IO 流,对文本文件可以进行较为方便的操作。

字节输出流

OutputStream 常用方法

1
2
3
4
void close()    //关闭此输出流并释放与此流有关的所有系统资源。 
void flush() //刷新此输出流并强制写出所有缓冲的输出字节, OutputStream 的 flush 方法不执行任何操作。
void write(byte[] b) //将 b.length 个字节从指定的 byte 数组写入此输出流。
void write(byte[] b, int off, int len) //将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。

使用字节流来写入数据到文本文件中

字节流中的输出流的基类是 OutputStream,但是该方法是抽象的,只能使用创建其子类对象。

由于最常用的操作是文件,所以这里我们选择 FileOutputStream 来演示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.io.FileOutputStream;
import java.io.IOException;


public class FileOutputStreamDemo {
public static void main(String[] args) {
FileOutputStream fos = null;

try {

fos = new FileOutputStream("F:\\demo.txt");
fos.write("ABCDEF".getBytes());

} catch (IOException e) {
throw new RuntimeException("写入数据失败");
} finally {

try {
if (fos != null)
fos.close();
} catch (Exception e) {
throw new RuntimeException("关闭流失败");
}
}
}
}
  • 这里与字符流操作文本数据的方式差不多,只不过这里是字节数组。
  • 字节流没有用到缓冲区时不需要 flush 操作,因为它会直接写入到文件中。

字节输入流

InputStream 常用方法

1
2
3
4
5
6
int available()     //返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。 
void close() //关闭此文件输入流并释放与此流有关的所有系统资源。
protected void finalize() //确保在不再引用文件输入流时调用其 close 方法。
int read() //从此输入流中读取一个数据字节。
int read(byte[] b) //从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。
int read(byte[] b, int off, int len) // 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。

使用字节流来读取文本内容

字节流中的输出流的基类是 InputStream,但是该方法是抽象的,只能使用创建其子类对象。

由于最常用的操作是文件,所以这里我们选择 FileInputStream 来演示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamDemo {
public static void main(String[] args) {
FileInputStream fis = null;

try {
fis = new FileInputStream("F:\\demo.txt");
byte[] b = new byte[fis.available()];
fis.read(b);
System.out.println(new String(b));
} catch (IOException e) {
throw new RuntimeException("文件读取失败");
} finally {

try {
if (fis != null)
fis.close();
} catch (Exception e2) {
throw new RuntimeException("文件读取失败");
}
}
}
}
  • 上述代码中使用了 available ,这个方法其实就是返回要操作的文件中剩余的可被操作的字节数,这里虽然定义了一个 byte 类型的数组,使用了这个方法,创建了一个与文件字节大小一致的数组,但是当文件过大时,数组也会很大,会造成内存溢出,所以还是谨慎使用这种方法,推荐使用固定大小的数组,循环进行读取。

综合练习

拷贝图片

字节流不仅限于操作文本文件,也是可以操作媒体文件的,用字节流读取文件字节后,写入到一个新的文件中即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class CopyPictureFile {
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos = null;

try {
fis = new FileInputStream("F:\\demo.jpg");
fos = new FileOutputStream("F:\\demoCopy.jpg");

byte[] b = new byte[1024];
int len = 0;
while ((len = fis.read(b)) != -1) {
fos.write(b, 0, len);
}
} catch (Exception e) {
throw new RuntimeException("文件拷贝出错");
} finally {

try {
if (fis != null) {
fis.close();
}
if (fos != null) {
fos.close();
}
} catch (Exception e2) {
throw new RuntimeException("文件拷贝出错");
}

}
}
}