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