Val*_*lva 1 java string byte type-conversion
我正在使用swing
Java 构建一个接口,我构建了一个middleware
不断读取串口并保存所需内容的接口String
,这就是我在做这个的方式:
public class RFID {
private static RFIDReader rReader;
private static boolean state;
public RFID(RFIDReader rReader) {
this.rReader = rReader;
this.state = true;
}
public void connect(String portName) throws Exception {
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
if (portIdentifier.isCurrentlyOwned()) {
System.out.println("Error: Port is currently in use");
} else {
CommPort commPort = portIdentifier.open(this.getClass().getName(), 2000);
if (commPort instanceof SerialPort) {
SerialPort serialPort = (SerialPort) commPort;
serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
InputStream in = serialPort.getInputStream();
OutputStream out = serialPort.getOutputStream();
(new Thread(new SerialReader(in))).start();
//(new Thread(new SerialWriter(out))).start();
} else {
System.out.println("Error: Only serial ports are handled by this example.");
}
}
}
public static class SerialReader implements Runnable {
InputStream in;
public SerialReader(InputStream in) {
this.in = in;
}
public void run() {
byte[] buffer = new byte[1024];
int len = -1;
String code;
try {
while (state == true && (len = this.in.read(buffer)) > -1) {
code = new String(buffer, 0, len);
if (code.length() > 1)
rReader.setCode(code);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void finish(){
state = false;
}
public static class SerialWriter implements Runnable {
OutputStream out;
public SerialWriter(OutputStream out) {
this.out = out;
}
public void run() {
try {
int c = 0;
while ((c = System.in.read()) > -1) {
this.out.write(c);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,当我尝试打印code
正在存储的内容时,它显示如下:
AC000F9
3
BB
Run Code Online (Sandbox Code Playgroud)
实际应该是这样的:
AC000F93BB
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?这从转换byte[]
到String
是不正确的?
编辑: 我需要读一个总共10个字符的字符串.
不要InputStream
用来读取 - 使用Reader
一些描述.如果你需要从a开始InputStream
,请将其包装成InputStreamReader
.我会改变你的构造函数来接受一个,Reader
但允许客户端传递他们想要的任何读者.这将使测试更容易(因为你可以使用a StringReader
).
编辑:注意 - 如果您确实需要从二进制文件创建一个阅读器InputStream
,请明确选择Charset
(编码).所以使用InputStreamReader
指定一个的构造函数重载.即使您想使用平台默认设置,我也会明确说明您正在做什么.
编辑:除了"字符串转换发生的地方"之外,还不清楚你期望读什么.您正在处理流式传输API - 决定在调用之前您真正想要读取setCode
多少内容?这是一条整线吗?是一些固定数量的字符?它是特定分隔符之前的字符吗?
编辑:现在我们知道了一点,我建议你写一个这样的辅助方法:
// Assuming you now have a field of type Reader, called reader
private String readEntry() throws IOException {
char[] buffer = new char[10];
int index = 0;
while (index < buffer.length) {
int charsRead = reader.read(buffer, index, buffer.length - index);
if (charsRead == -1) {
throw new IOException("Couldn't read entry - end of data");
}
index += charsRead;
}
return new String(buffer);
}
Run Code Online (Sandbox Code Playgroud)