【发布时间】:2017-07-05 08:00:01
【问题描述】:
我正在使用以下代码读取大文件,并通过 TCP 连接缓冲区逐个缓冲区发送文件内容。在每次发送结束时,TCP 通道添加一个 CRLF 字符。除非我添加它,否则我不希望它出现在结果中。
final int BUFFER_SIZE = 65536;
long bytesToSkip = 0;
byte[] buffer = new byte[BUFFER_SIZE];
try (RandomAccessFile rand = new RandomAccessFile(new File(requestModel.getFilePath()), "r");
) {
rand.seek(bytesToSkip);
while ((read = rand.read(buffer)) != -1) {
MessageBuilder mb = MessageBuilder.withPayload(buffer).setHeaderIfAbsent(IpHeaders.CONNECTION_ID, connectionId);
outMsgChannel.send(mb.build())
buffer = new byte[BUFFER_SIZE];
}
}
catch(Exceptions ..............
添加新行的示例输出。 (两个缓冲区都很大。我只提到了每个缓冲区末尾导致问题的行)
包含缓冲区一
一只敏捷的棕色狐狸跳过懒狗
一只快速的棕色狐狸跳过 懒狗
一只快速的棕色狐狸跳过了
缓冲区二包含
懒狗
如果没有不需要的 CRLF,那么我将不会在输出中遇到单行拆分为两行的问题。我只想在文件所在的位置添加新行。
【问题讨论】:
-
你为什么要读两遍?你以这种方式丢失数据。为什么在构建消息时忽略阅读计数?并且确实在发送消息时显然忽略了 bugffer ?这段代码根本不能说有效,更别说你怎么描述的了。
-
我已经编辑了这个问题。更正了由于将代码从项目复制粘贴到示例代码而发生的错误。其次,忽略读取的字节是什么意思?请不要立即否决这个问题,我真正的问题的答案是 Spring TCP Channel 具有默认添加 CRLF 的行为,或者答案是 Spring 提供了一个配置,即不在每行末尾添加 CRLF。如果您愿意,请投反对票,但也请提供答案。
-
忽略读取计数的错误依然存在。
-
在构造消息时使用它来分隔消息,而不是使用整个缓冲区。这是非常基本的。不要问我如何使用自己的 API。
-
你知道我的问题的答案吗?我知道定界的东西,但是对于我不想要的每次读取,这都会降低性能,并且这些不需要的字节在我的接收器端是可以忽略的。
标签: spring tcp spring-integration tcpchannel