Lison
, v1.0.0
, 2023.05.07
java.io.OutputStream
是字节输出流的超类(父类),我们来看一下它定义的一些共性方法:
1、 close()
:关闭此输出流并释放与此流相关联的系统资源。
2、 flush()
:刷新此输出流并强制缓冲区的字节被写入到目的地。
3、 write(byte[] b)
:将 b.length 个字节从指定的字节数组写入此输出流。
4、 write(byte[] b, int off, int len)
:从指定的字节数组写入 len 字节到此输出流,从偏移量 off开始。 也就是说从off个字节数开始一直到len个字节结束
OutputStream
有很多子类,我们从最简单的一个子类 FileOutputStream 开始。看名字就知道是文件输出流,用于将数据写入到文件
String fileName = "example.txt";
FileOutputStream fos = new FileOutputStream(fileName);
以上代码使用文件名 “example.txt” 创建一个 FileOutputStream 对象,将数据写入到该文件中。如果文件不存在,则创建一个新文件;如果文件已经存在,则覆盖原有文件
File file = new File("example.txt");
FileOutputStream fos = new FileOutputStream(file);
使用实例:
String fileName = "files/example.txt";
FileOutputStream fos = null;
try {
fos = new FileOutputStream(fileName);
fos.write("Lison".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
以上代码创建了一个 FileOutputStream 对象,将字符串 “Lison” 写入到 example.txt 文件中,并在最后关闭了输出流。
使用 FileOutputStream 写入字节数据主要通过 write
方法:
write(int b)
write(byte[] b)
write(byte[] b,int off,int len) //从`off`索引开始,`len`个字节
write(int b)
方法,每次可以写入一个字节,代码如下:// 使用文件名称创建流对象
FileOutputStream fos = new FileOutputStream("fos.txt");
// 写出数据
fos.write(97); // 第1个字节
fos.write(98); // 第2个字节
fos.write(99); // 第3个字节
// 关闭资源
fos.close();
字符 a 的 ASCII 值为 97,字符 b 的ASCII 值为 98,字符 b 的ASCII 值为 99。也就是说,以上代码可以写成:
// 使用文件名称创建流对象
FileOutputStream fos = new FileOutputStream("fos.txt");
// 写出数据
fos.write('a'); // 第1个字节
fos.write('b'); // 第2个字节
fos.write('c'); // 第3个字节
// 关闭资源
fos.close();
当使用 write(int b)
方法写出一个字节时,参数 b 表示要写出的字节的整数值。由于一个字节只有8位,因此参数 b 的取值范围应该在 0 到 255 之间,超出这个范围的值将会被截断。例如,如果参数 b 的值为 -1,那么它会被截断为 255,如果参数 b 的值为 256,那么它会被截断为 0。
在将参数 b 写入输出流中时,write(int b) 方法只会将参数 b 的低8位写入,而忽略高24位。这是因为在 Java 中,整型类型(包括 byte、short、int、long)在内存中以二进制补码形式表示。当将一个整型值传递给 write(int b) 方法时,方法会将该值转换为 byte 类型,只保留二进制补码的低8位,而忽略高24位。
例如,如果要写出的整数为 0x12345678,它的二进制补码表示为 0001 0010 0011 0100 0101 0110 0111 1000。当使用 write(int b) 方法写出该整数时,只会将二进制补码的低8位 0111 1000 写出,而忽略高24位 0001 0010 0011 0100 0101 0110。这就是参数 b 的高24位被忽略的原因。
0111 1000 是一个8位的二进制数,它对应的十进制数是 120,对应的 ASCII 码字符是小写字母 “x”。在 ASCII 码表中,小写字母 “x” 的十进制 ASCII 码值为 120。因此,如果使用 write(int b) 方法写出一个字节值为 0x78(十进制为 120),那么写出的结果就是小写字母 “x”。