我使用以下代码读取大文件,并通过缓冲区通过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 ..............
添加新行的示例输出。(两个缓冲区都很大。我只提到了在每个缓冲区末尾引起问题的行)
包含缓冲区 1
一只快速的棕色狐狸跳过懒惰的狗
一只快速的棕色狐狸跳过 懒狗
一只快速的棕色狐狸跳过
缓冲区二包含
懒狗
如果没有不需要的 CRLF,那么我不会在输出中遇到单行拆分为两行的问题。我只想在文件所在的位置有新行。
请参阅文档。
TCP是一种流协议;这意味着必须为通过TCP传输的数据提供一些结构,以便接收方可以将数据划分为离散的消息。连接工厂配置为使用 (反)序列化程序在消息有效负载和通过 TCP 发送的位之间进行转换。这是通过分别为入站和出站消息提供反序列化程序和序列化程序来实现的。提供了许多标准(反)序列化程序。
ByteArrayCrlfSerializer
,将字节数组转换为字节流,后跟回车符和换行符 (rn
)。这是默认的(反)序列化程序,例如,可以作为客户端与 telnet 一起使用。。
您需要某种方法来知道消息何时完成 - 底层网络可能会对您的消息进行数据包化,以便分块接收消息。
ByteArrayRawSerializer
不会向消息添加任何字符;它可能会满足您的需求。在读取端使用时,它使用套接字 EOF 来指示消息已完成。