从字节数组读取到控制台(或文件)Java



所以我有两个文件,一个是读取到字节数组中的二进制文件,另一个是已读取到字符串数组列表中的文本文件。现在让我们假设我的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();

相关内容

  • 没有找到相关文章

最新更新