OutputStream类执行write函数时出现NullPointException的处理

在调试一个SWT的SOCKET通信程序时提示了标题所示的错误.

查看了一下API:

 

public void write(byte[] b,
                  int off,
                  int len)
           throws IOException
将指定字节数组中从偏移量 off 开始的 len 个字节写入此输出流。write(b, off, len) 的常规协定是:将数组 b 中的某些字节按顺序写入输出流;元素 b[off] 是此操作写入的第一个字节,b[off+len-1] 是此操作写入的最后一个字节。

OutputStreamwrite 方法对每个要写出的字节调用一个参数的 write 方法。建议子类重写此方法并提供更有效的实现。

如果 bnull,则抛出 NullPointerException

 

但是发现输出的字节数组不是null.于是继续上网找,终于发现了问题:

我的部分代码:

OutputStream out = null;

//问题

String str = "输出文本";

byte buff[] = str.getBytes();

out.wirte(buff);

 

其中注释的地方应该填上

out = socket.getOutputStream();

否则会造成out = null引起的NullPointException。

 

 

 

### ### OutputStream.write 方法的使用和注意事项 `OutputStream.write` 是 Java 中用于向输出流写入字节数据的核心方法之一。该方法有多个重载形式,支持写入单个字节、字节数组、以及字节数组的一部分。使用需要注意写入的数据型、异常处理以及流的状态等问题。 #### 单个字节的写入 `write(int b)` 方法用于将一个字节写入输出流。虽然参数是 `int` 型,但实际写入的是其低 8 位(即一个字节)。例如: ```java try (OutputStream outputStream = new FileOutputStream("output.txt")) { outputStream.write('H'); // 写入字符 'H' 的 ASCII 值 outputStream.write('e'); // 写入字符 'e' outputStream.write('l'); // 写入字符 'l' outputStream.write('l'); // 写入字符 'l' outputStream.write('o'); // 写入字符 'o' } catch (IOException e) { e.printStackTrace(); } ``` 该方式适用于逐字节写入,但效率较低,尤其在写入大量数据。建议使用字节数组进行批量写入以提升性能[^2]。 #### 字节数组的写入 `write(byte[] b)` 方法用于将一个完整的字节数组写入输出流。这种方式适合写入字符串、图片数据等二进制内容。例如: ```java try (OutputStream outputStream = new FileOutputStream("output.txt")) { byte[] data = "Hello Java!".getBytes(); outputStream.write(data); // 写入整个字节数组 } catch (IOException e) { e.printStackTrace(); } ``` 该方法一次性写入多个字节,显著减少了 I/O 操作的次数,从而提高了性能。适用于处理文本、图片、音频等二进制数据[^3]。 #### 指定范围的字节数组写入 `write(byte[] b, int off, int len)` 方法允许写入字节数组中从 `off` 开始的 `len` 个字节。这种方式适用于处理大数组中的一部分数据: ```java try (OutputStream outputStream = new FileOutputStream("output.txt")) { byte[] data = "Hello Java!".getBytes(); outputStream.write(data, 0, 5); // 只写入前5个字节,即 "Hello" } catch (IOException e) { e.printStackTrace(); } ``` 该方法在需要处理数据片段非常有用,例如从网络接收的缓冲区中提取有效数据部分进行写入。 #### 注意事项 - **字节顺序**:所有写入操作均以字节为单位,字符串需先通过 `getBytes()` 转换为字节数组,否则可能导致乱码。 - **异常处理**:`IOException` 是常见的异常型,必须进行捕获或抛出,否则程序可能因 I/O 错误而终止。 - **流的关闭**:写入完成后必须调用 `close()` 方法,以释放系统资源并确保数据最终写入目标。可以使用 try-with-resources 语句自动关闭流[^2]。 - **缓冲机制**:若使用 `BufferedOutputStream` 包装 `OutputStream`,则数据会先写入缓冲区,只有缓冲区满或调用 `flush()` 才会真正写入底层流。因此,在某些场景下需要显式调用 `flush()` 以确保数据及写入[^5]。 #### 示例:结合 FileOutputStream 和 BufferedOutputStream 的写入 ```java try (FileOutputStream fos = new FileOutputStream("output.txt"); BufferedOutputStream bos = new BufferedOutputStream(fos)) { byte[] data = "Hello, BufferedOutputStream!".getBytes(); bos.write(data); bos.flush(); // 强制刷新缓冲区 } catch (IOException e) { e.printStackTrace(); } ``` 该方式结合了 `FileOutputStream` 的文件写入能力和 `BufferedOutputStream` 的缓冲机制,适用于需要高效写入大量数据的场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值