使用hutool 关闭流 IoUtil.close(in);
时间: 2024-09-19 09:10:26 浏览: 101
Hutool是一个开源的Java工具包,它提供了一系列简化开发者日常开发任务的便捷功能。`IoUtil.close()` 是 Hutool 中的一个静态方法,用于关闭输入流(InputStream),如FileInputStream、Socket InputStream等。当你不再需要这些资源并且希望释放它们占用的系统资源(比如内存或磁盘I/O),可以使用这个方法。例如:
```java
try (InputStream in = new FileInputStream("file.txt")) {
// 这里是对文件的操作
// ...
} catch (IOException e) {
log.error("Error reading file", e);
}
// 使用 Hutool 的 IoUtil 关闭流
IoUtil.close(in); // 如果in没有在 try-with-resources 块中自动关闭,这里手动关闭
```
通过`close()`方法,你可以确保资源得到适当的清理,防止发生资源泄露。如果`close()`抛出异常,通常会被`try-catch`块捕获并处理。
相关问题
麻烦解释一下这段代码每一句的作用public String execCmdErrContent(String command) throws Exception { // if (session == null || channel == null || channelExec == null) { // throw new Exception(DONOT_INIT_ERROR_MSG); // } // 打开执行shell指令的通道 Channel channel = session.openChannel("exec"); ChannelExec channelExec = (ChannelExec) channel; channelExec.setCommand(command); channel.setInputStream(null); ByteArrayOutputStream err = new ByteArrayOutputStream(); channelExec.setErrStream(err); channel.connect(); StringBuilder sb = new StringBuilder(16); try (InputStream in = channelExec.getErrStream(); InputStreamReader isr = new InputStreamReader(in, StandardCharsets.UTF_8); BufferedReader reader = new BufferedReader(isr)) { String buffer; while ((buffer = reader.readLine()) != null) { sb.append("\n").append(buffer); } //2023-02-21 关闭流 IoUtil.close(reader); IoUtil.close(isr); IoUtil.close(in); IoUtil.close(err); if(StrUtil.contains(sb.toString(), "没有那个文件或目录")){ return ""; }else{ return sb.toString(); } }finally { if (channelExec != null && channelExec.isConnected()) { channelExec.disconnect(); } if ( channel != null && channel.isConnected()) { channel.disconnect(); } } }
这段代码是一个方法,用于执行 Shell 命令并返回错误信息。下面是每句代码的作用:
1. `public String execCmdErrContent(String command) throws Exception {`:定义名为 `execCmdErrContent` 的公共方法,接受一个字符串类型的参数 `command`,并抛出异常。
2. `Channel channel = session.openChannel("exec");`:打开一个用于执行 Shell 命令的通道。
3. `ChannelExec channelExec = (ChannelExec) channel;`:将通道转换为 `ChannelExec` 类型,以便执行命令。
4. `channelExec.setCommand(command);`:设置要执行的命令。
5. `channel.setInputStream(null);`:设置通道的输入流为空,因为我们不需要从通道读取任何内容。
6. `ByteArrayOutputStream err = new ByteArrayOutputStream();`:创建一个字节数组输出流,用于保存错误信息。
7. `channelExec.setErrStream(err);`:将错误信息输出到字节数组输出流中。
8. `channel.connect();`:连接通道。
9. `StringBuilder sb = new StringBuilder(16);`:创建一个字符串构建器,用于保存错误信息。
10. `try (InputStream in = channelExec.getErrStream(); InputStreamReader isr = new InputStreamReader(in, StandardCharsets.UTF_8); BufferedReader reader = new BufferedReader(isr)) {`:使用 try-with-resources 语句创建输入流、转换流和缓冲读取器。
11. `String buffer; while ((buffer = reader.readLine()) != null) { sb.append("\n").append(buffer); }`:读取输入流中的每一行数据,并将其添加到字符串构建器中。
12. `if(StrUtil.contains(sb.toString(), "没有那个文件或目录")){ return ""; }else{ return sb.toString(); }`:如果错误信息中包含指定的字符串,则返回空字符串,否则返回错误信息。
13. `} finally { if (channelExec != null && channelExec.isConnected()) { channelExec.disconnect(); } if ( channel != null && channel.isConnected()) { channel.disconnect(); } }`:无论是否出现异常,都会执行的 finally 块。在这里,关闭通道和流,以释放资源。
麻烦解释一下这段代码每一句的作用public static String execCmd(Session session,String command) throws Exception { // if (session == null || channel == null || channelExec == null) { // throw new Exception(DONOT_INIT_ERROR_MSG); // } // 打开执行shell指令的通道 Channel channel = session.openChannel("exec"); ChannelExec channelExec = (ChannelExec) channel; channelExec.setCommand("source /etc/profile && source ~/.bash_profile && source ~/.bashrc && adb devices && locale charmap"); channelExec.setCommand(command); channel.setInputStream(null); channelExec.setErrStream(System.err); // channel.setXForwarding(); channel.connect(); StringBuilder sb = new StringBuilder(16); try (InputStream in = channelExec.getInputStream(); InputStreamReader isr = new InputStreamReader(in, StandardCharsets.UTF_8); BufferedReader reader = new BufferedReader(isr)) { String buffer; while ((buffer = reader.readLine()) != null) { sb.append("\n").append(buffer); } //2023-02-21 关闭流 IoUtil.close(reader); IoUtil.close(isr); IoUtil.close(in); return sb.toString(); }finally { if (channelExec.isConnected()) { channelExec.disconnect(); } if (channel.isConnected()) { channel.disconnect(); } } }
这段代码的作用是通过SSH连接到远程服务器,并在服务器上执行一个shell命令,然后将命令的输出结果返回到本地。
具体每一句代码的作用如下:
1. `public static String execCmd(Session session,String command) throws Exception {` :定义一个公共静态方法,用于执行指定的命令。
2. `Channel channel = session.openChannel("exec");` :用会话对象打开一个执行shell指令的通道。
3. `ChannelExec channelExec = (ChannelExec) channel;` :将通道对象转换为执行通道对象。
4. `channelExec.setCommand("source /etc/profile && source ~/.bash_profile && source ~/.bashrc && adb devices && locale charmap");` :设置执行通道对象的命令,此处是一些初始化命令,用于设置环境变量、查看adb连接设备等。
5. `channelExec.setCommand(command);` :设置执行通道对象的命令,此处是要执行的具体命令。
6. `channel.setInputStream(null);` :设置通道的输入流为null,表示不需要从本地向远程服务器发送数据。
7. `channelExec.setErrStream(System.err);` :将执行通道对象的错误流输出到标准错误流中。
8. `channel.connect();` :连接到远程服务器。
9. `StringBuilder sb = new StringBuilder(16);` :创建一个StringBuilder对象,用于存储执行命令的输出结果。
10. `try (InputStream in = channelExec.getInputStream();` :通过执行通道对象的输入流获取远程服务器上命令的输出流。
11. `InputStreamReader isr = new InputStreamReader(in, StandardCharsets.UTF_8);` :将输入流转换为字符流,并设置字符编码为UTF-8。
12. `BufferedReader reader = new BufferedReader(isr)) {` :创建一个缓冲字符输入流,并将字符输入流包装进去。
13. `String buffer;` :定义一个字符串变量,用于存储每次读取的字符流数据。
14. `while ((buffer = reader.readLine()) != null) {` :循环读取每一行输出结果。
15. `sb.append("\n").append(buffer);` :将输出结果追加到StringBuilder对象中。
16. `IoUtil.close(reader);` :关闭缓冲字符输入流。
17. `IoUtil.close(isr);` :关闭字符输入流。
18. `IoUtil.close(in);` :关闭输入流。
19. `return sb.toString();` :返回StringBuilder对象中存储的所有输出结果。
20. `finally {` :最后必须执行的代码块,无论是否发生异常都会执行其中的代码。
21. `if (channelExec.isConnected()) {` :如果执行通道对象已连接,则断开连接。
22. `channelExec.disconnect();` :断开执行通道对象的连接。
23. `if (channel.isConnected()) {` :如果通道对象已连接,则断开连接。
24. `channel.disconnect();` :断开通道对象的连接。
25. `}` :结束if语句。
阅读全文