gpt4 book ai didi

java - 从输入流读取 Lines 和 byte[]

转载 作者:行者123 更新时间:2023-12-01 11:03:34 27 4
gpt4 key购买 nike

我有一个网络套接字,它接收以下类型的消息:(大约每秒 24 条)

  • 命令 EG:[Pos,1,2,3,4,1,2,3,4]\n

  • 图像:[IMG,36000]\nbyte[36000](byte[36000] 是一个 36000 字节的数组)

所以我需要一个能够读取行和字节[]的流的读取器。问题是,BufferedReader 会转换字符集,这对于图像来说非常非常糟糕,因此读取字符串并将其转换为字节似乎不是一个选择。

我尝试将 DataInputStreamReader 和 BufferedReader 连接到流,但在第一次更改阅读器后它似乎中断了,但我不太确定是什么导致了那里的问题。

显而易见的解决方案是:

char c;
String s = "";
do{
c= (char)read.read(); //maybe charset conversion here
s+=c;
}while(c!= "\n");
if(s.startsWith("[IMG")){
int len = Integer.parseInt(s.split(",")[1]);
byte[] img = new byte[len];
read.read(img);
...

但我正在寻找一种更好的方法,这样我就可以减少手动操作。

  • 处理此问题的建议方法是什么?
  • 有什么办法吗将两个或多个读取器连接到输入流?
  • 是否有可以读取 byte[] 和字符串的阅读器?
  • 将所有内容写入 byte[] 并从中读取可能更容易吗? (那我怎么知道什么时候停止阅读?)
  • 我可以防止 chartype 转换弄乱 byte[] 吗? (然后我可以使用缓冲阅读器)

在最简单的情况下,我可以编写该代码:(实际上并没有更多:D)

String s = read.readLine();
String[] parts = s.split(",");
if(parts[0].equals("[IMG")){
byte[] img = new byte[Integer.parseInt(parts[1])];
read.readByte(img);
...

最佳答案

改变观点会有所帮助:将其视为字节流,根据需要转换为字符串。

就我而言,我有一个 TCP 客户端/服务器对,必须处理包含多个 ASCII 控制字符的消息,包括 CR 和 LF(= Windows 上的 java“换行符”) - 并且所有内容都必须“按原样”传递。

字符串可用于构建带有嵌入式控制代码的消息,但嵌入任何“换行”字符(例如 VT)意味着字符串不能用于发送或接收消息 - 解决方法是将数据作为字节传递。

这是我所做的事情的本质(在服务器和客户端):

// ASCII control codes 

char SOH = (char) 0x01;
char STX = (char) 0x02;
char ETX = (char) 0x03;

String CRLF = "" + (char) 0x0D + (char) 0x0A;

int characterCount = 0;
String characterSet = "US-ASCII"; // "UTF-8", UTF-16", etc.
String incomingData = "";
String outgoingData = "";

ServerSocket servSock = new ServerSocket( servPort );
Socket clntSock = servSock.accept();

InputStream incomingData = clntSock.getInputStream();
OutputStream outgoingData = clntSock.getOutputStream();

while ( true )
{
characterCount = in.read( byteBuffer ); // blocks, waiting for remote machine

incomingData = new String( byteBuffer, characterSet ); // omit 2nd parameter to use default encoding

outgoingData = SOH + STX + "Whatever it is" + CRLF + CRLF + CRLF + "you need" + CRLF + "to do" + ETX;

byteBuffer = outgoingData.getBytes( CharacterSet );

out.write( byteBuffer );
}

远端准确获取发送的内容(38 个字符):SOH + STX +“无论它是什么”+ CRLF + CRLF + CRLF +“您需要”+ CRLF +“待办事项”+ ETX

最后一个想法:如果有一种方式/方法来指定 I/O 包使用的“换行符”,应该是可能的:

//   My first attempt was for a scanner that is functionally equivalent to System.out but 
// automatically adjusts itself to the SYSTEM-DEPENDENT newline:
//
//String LineSeparator = System.getProperty( "line.separator" );
//String MessageSeparator = Pattern.quote( LineSeparator );
//Pattern EndOfMessageRegEx = Pattern.compile( MessageSeparator );

String MessageEndsWith = "" + STX + ETX; // Change this to whatever you need
String MessageSeparator = Pattern.quote( MessageEndsWith );
Pattern EndOfMessageRegEx = Pattern.compile( MessageSeparator );

ServerSocket thisMachine = new ServerSocket( portNumber );
Socket otherMachine = thisMachine.accept();

PrintWriter messageToClient = new PrintWriter( otherMachine.getOutputStream(), true );

BufferedReader messageFromClient = new BufferedReader(
new DataInputStreamReader( otherMachine.getInputStream(),
CharacterEncoding ) );
Scanner ReceivedData = new Scanner( messageFromClient ).useDelimiter( EndOfMessageRegEx );

关于java - 从输入流读取 Lines 和 byte[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33149940/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com