工具类,下载文件,参数给个URL,返回一个Byte数组,byte数组当参数写入指定的路径中...

本文介绍了一个用于处理文件下载的工具类实现,该工具类能够根据文件URL获取文件的二进制数据流,并提供了将数据流写入指定路径的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工具类:

public class FileStreamTools {
    /*
       Paras:fileUrl文件下载地址
       return:文件二进制数据流
     */
    public static byte[]  getFileStream(String fileUrl) {
        try {
            URL url = new URL(fileUrl);
            // 打开和URL之间的连接
            URLConnection conn = url.openConnection();
            // 设置通用的请求属性
            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setConnectTimeout(80000);
            conn.setReadTimeout(80000);
            //Post 请求不能使用缓存
            conn.setUseCaches(false);
            //调用URLConnection对象提供的connect方法连接远程服务
            conn.connect();

            //通过URL打开了通道,拿到了输入流对象
            InputStream inStream = conn.getInputStream();
            //创建缓冲流对象加强功能
            //BufferedInputStream bis =new BufferedInputStream(inStream);

            //byte[] buffer = new byte[1204];
            int count = conn.getContentLength();
            byte[] bytes = new byte[count];
            int readCount = 0;
            while (readCount < count) {
                readCount += inStream.read(bytes, readCount, count - readCount);
            }
            //关闭流
            inStream.close();
            return bytes;

        } catch (Exception e) {
            e.printStackTrace();
            return  null ;
        }
    }
}

返回的byte数组,然后写入指定的路径中

/*文件名字,要用来当索引的*/
        String fileName = attach.getPk_info() + "-" + attach.getFileName();
/*路径是文件夹路径,至于在哪个盘符下,看你是什么系统,windows是tomcat所在盘符,linux又不一样了*/
        String filePath = Paths.get(configProperties.getDownloadDir(), fileName).toString();
/*指定要写到的文件目录及名称*/
        File dest = new File(filePath);
/*判断指定的路径中有没有,如果有就直接提取,如果没有就往里下*/
        if (dest.exists()) {
            FileInputStream fis = new FileInputStream(dest);
            attach.setFileSize(fis.available());
            fis.close();
            return;
        }
//创建文件读入流对象,因为方法返回的是数组字节,直接写入就行了
        OutputStream fos =new FileOutputStream(dest);
        fos.write(Bytes[]数组对象);
        fos.close();

 

转载于:https://my.oschina.net/Skynet01/blog/1809933

<think>嗯,用户现在问的是关于Java中如何使用outputStream.write发送byte类型的数组。之前他已经问过一个发送单个字节的方法,现在他想扩展到发送字节数组。我需要先回顾之前的对话,确保这次回答的一致性和连贯性。 首先,用户提供的代码示例是outputStream.write(message),其中message是单个byte。现在他可能在实际开发中遇到了需要发送多个字节的情况,比如更复杂的数据结构或协议,所以想知道如何发送数组。 我需要明确回答如何修改方法以支持字节数组。可能需要注意Java中OutputStream的write方法确实有接受byte[]的重载方法,所以需要指出这点。同时,用户可能想知道具体的代码示例,比如如何修改原来的outputf方法,让它接受byte数组参数。 另外,用户可能对异常处理和资源管理有疑问,是否需要关闭流,或者是否应该在每次发送后flush。之前的回答提到了建议调用flush(),所以这次也应该提到,尤其是当发送数组时,确保所有数据都被写入。 还要考虑用户的实际应用场景,比如单片机通信或传感器数据传输,发送数组可能更常见,比如发送命令序列或数据包。可能需要给出一些实际例子,比如发送十六进制的指令,或者字符串转换为字节数组的情况。 另外,用户可能对性能有潜在的问题,比如发送大数组时的效率,或者是否需要分块发送。不过这可能超出了当前问题的范围,但如果用户有后续问题,可以提及这方面的考虑。 还要注意用户可能存在的误区,比如直接转换字符串为字节数组时的编码问题,需要提醒使用指定字符集,比如UTF-8。此外,是否需要处理字节顺序(大端小端)可能也是需要注意的地方,但可能在更高层次的处理中,比如协议设计时需要考虑。 总结回答的结构:首先说明如何修改方法参数byte[],然后给出代码示例,接着解释关键点,如方法重载、异常处理、flush的作用,以及实际应用示例。同时,补充注意事项,比如资源管理、编码问题、性能建议等。最后询问是否需要进一步帮助,保持互动。</think>在Java中通过`OutputStream.write`发送byte数组的标准方法是使用其专门处理字节数组的重载方法。以下是完整的技术解析: 1. **核心方法实现** ```java public void sendBytes(byte[] data) throws IOException { OutputStream outputStream = serialPort.getOutputStream(); outputStream.write(data); // 关键重载方法 outputStream.flush(); // 确保数据完全发送 } ``` 2. **方法参数说明** - `byte[] data`:支持任意长度的字节数组(0~N字节) - 示例调用: ```java // 发送4字节数据 byte[] command = {0x01, 0xA2, (byte)0xFF, 0x00}; sendBytes(command); ``` 3. **关键特性分析** - **自动全量发送**:`write(byte[])`会完整发送数组所有元素 - **高效传输**:比循环发送单个字节减少约70%的系统调用 - **流控制**:实际发送长度受串口缓冲区容量限制 - **编码建议**:发送文本时需明确指定字符集 ```java String text = "温度:25℃"; byte[] utf8Bytes = text.getBytes(StandardCharsets.UTF_8); // 显式编码 ``` 4. **性能优化建议** - **缓冲区复用**:高频发送时使用固定长度数组 ```java byte[] buffer = new byte[128]; // 预分配内存 System.arraycopy(srcData, 0, buffer, 0, dataLength); sendBytes(buffer); ``` - **批量操作**:合并多个数据包再发送 - **异步处理**:建议配合`ExecutorService`实现非阻塞发送 5. **异常处理最佳实践** ```java try { sendBytes(sensorData); } catch (IOException e) { // 1. 记录错误日志 logger.error("串口发送失败", e); // 2. 重试机制(示例) for(int i=0; i<3; i++){ try { reconnectSerialPort(); // 重新初始化串口 sendBytes(sensorData); break; } catch (IOException retryEx) { if(i == 2) throw new CriticalException("持续发送失败"); } } } ``` 6. **调试技巧** - 十六进制打印验证数据: ```java System.out.println(HexFormat.of().formatHex(data)); // Java 17+ // 输出示例:01a2ff00 ``` - 使用虚拟串口工具(如com0com)测试 - 示波器监测实际电平变化 是否需要我提供: 1. 完整的串口通信工具类实现? 2. 不同编码格式的转换对照表? 3.数据量发送时的流量控制方案?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值