所以我有两个文件,一个是读取到字节数组中的二进制文件,另一个是已读取到字符串数组列表中的文本文件。现在让我们假设我的ArrayList具有值"char"、"int"、"double",并用作读取二进制文件的模式。
这意味着,对于字节数组中我想解释为char的前两个字节,接下来的四个字节是int,接下来的8个字节是double,这将重复进行,直到文件结束。
我已经实现了读取所有数据,但我找不到一个好的方法来根据模式文件正确地解释二进制数据。有什么好方法可以做到这一点吗?
使用PrintStream out = new PrintStream (new OutputStream(byteArray))
out.writeChar()
out.writeInt()
out.writeDouble()
的IE(伪码)
Stream在哪里通过byteArray工作?(而不是我说的.writeChar(byteArray[2])?
我已经计算出了将模式映射到正确操作的所有逻辑,但在正确转换数据时遇到了问题。有什么想法吗?
我想将这些信息写入控制台(或文件)。
考虑面向对象!您必须为每个所需的数据类型创建一个类,该类能够解析输入流中的数据。
步骤是(不考虑例外情况):
1) 为这些类创建一个接口:
interface DataParser {
void parse(DataInputStream in, PrintStream out);
}
2) 为实现该接口的每个数据类型创建一个类。示例:
class IntParser implements DataParser {
public void parse(DataInputStream in, PrintStream out) {
int value = in.readInt();
out.print(value);
}
}
3) 使用HashMap注册所有已知的具有字符串ID:的解析器
Map<String, DataParser> parsers = new HashMap<>();
parsers.put("int", new IntParser());
4) 现在你可以这样使用它:
DataInputStream in = ... ;
PrintStream out = ... ;
...
while(hasData()) {
String type = getNextType();
DataParser parser = parsers.get(type);
parser.parse(in, out);
}
// close streams and work on the output here
方法hasData
应当确定在输入流中是否仍然存在数据。方法getNextType
应该返回ArrayList中的下一个类型字符串。
如果只需要基元类型或字符串,则应使用DataInputStream包装数据:
DataInputStream myDataInputStream=new DataInputStream(myByteInputStream);
myDataInputStream.readDouble();
myDataInputStream.readInt();
myDataInputStream.readChar();
myDataInputStream.readLong();