在 java 中,`fileoutputstream` 的 `write` 方法主要用于将字节数据写入文件。它支持三种用法:写入单个字节、写入字节数组以及写入字节数组的一部分。调用这些方法时,数据会直接追加或覆盖到指定路径的文件中,若文件不存在则会自动创建。

write(int b) 如何写入单个字节
该方法接受一个 int 类型的参数,但实际只写入该参数的低 8 位。这意味着如果你传入大于 255 的整数,高位的字节会被丢弃,只保留最后 8 位的数据。这在处理原始二进制数据或 ASCII 字符编码时非常有用。

import java.io.FileOutputStream;
import java.io.IOException;
public class SingleByteWrite {
public static void main(String[] args) {
try (FileOutputStream fos = new FileOutputStream("test.txt")) {
// 写入字符 'A' 的 ASCII 码 65
fos.write(65);
// 写入超过 255 的值,观察高位丢失
fos.write(300); // 300 的二进制是 1 00101100,低8位是 00101100 (44)
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行上述代码后,test.txt 中将包含两个字节:第一个是 65(对应字符 'A'),第二个是 44(对应字符 ',')。这是因为 300 对 256 取模的结果是 44。
立即学习“Java免费学习笔记(深入)”;
write(byte[] b) 与 write(byte[] b, int off, int len) 的区别
当需要写入大量数据时,使用字节数组比逐个写入字节效率更高。write(byte[] b) 会将整个数组的内容写入文件。而 write(byte[] b, int off, int len) 允许你从数组的指定偏移量 off 开始,写入长度为 len 的子数组。这种重载方法在处理缓冲区或部分数据块时非常灵活。

import java.io.FileOutputStream;
import java.io.IOException;
public class ArrayWrite {
public static void main(String[] args) {
byte[] data = {72, 101, 108, 108, 111}; // "Hello"
try (FileOutputStream fos = new FileOutputStream("hello.txt")) {
// 写入整个数组
fos.write(data);
// 写入从索引 1 开始的 3 个字节,即 "ell"
fos.write(data, 1, 3);
} catch (IOException e) {
e.printStackTrace();
}
}
}
执行这段代码后,hello.txt 的内容将是 Helloell。首先完整数组被写入,随后从索引 1(字符 'e')开始的三个字节被追加。注意,如果指定的偏移量或长度超出数组边界,将会抛出 IndexOutOfBoundsException。
写入操作中的缓冲与刷新机制
虽然 FileOutputStream 默认是直接写入底层操作系统的,但在某些实现或特定配置下,数据可能会先经过内部缓冲。为了确保数据真正写入磁盘,避免程序异常退出导致数据丢失,通常建议在使用完毕后关闭流,或者手动调用 flush() 方法。在 try-with-resources 语句中,流的自动关闭会隐式地执行刷新和释放资源的操作,这是推荐的最佳实践。


















