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

标签 java binary buffer arrays printstream

所以我有两个文件,一个是我已读入字节数组的二进制文件,另一个是我已读入字符串 ArrayList 的文本文件。现在假设我的 ArrayList 具有值“char”、“int”、“double”并用作读取二进制文件的模式。

这意味着对于字节数组中的前两个字节,我想将其解释为 char,接下来的 4 个字节解释为 int,接下来的 8 个字节解释为 double,这将重复进行,直到文件结束。

我已经实现了读取所有数据,但我找不到根据模式文件正确解释二进制数据的好方法。有没有好的方法可以做到这一点?

IE(伪代码)使用 PrintStream out = new PrintStream (new OutputStream(byteArray)) out.writeChar() out.writeInt() out.writeDouble()

Stream 在哪里通过 byteArray 为我工作? (而不是我说 out.writeChar(byteArray[2])?

我已经弄清楚将模式映射到正确操作的所有逻辑,但我在正确转换数据时遇到了麻烦。有什么想法吗?

我想将此信息写入控制台(或文件)。

最佳答案

思考面向对象!您必须为每种所需的数据类型创建一个类,该类能够解析输入流中的数据。

步骤是(不关心异常):

1)为这些类创建一个接口(interface):

interface DataParser {
    void parse(DataInputStream in, PrintStream out);
}

2) 为实现该接口(interface)的每种数据类型创建一个类。示例:

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 返回下一个类型字符串。

关于java - 从字节数组读取到控制台(或文件)Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18605918/

相关文章:

java - 在 Java 中编写单例的不同方法

matlab - 在 Matlab 中对 float 进行位修改

c# - 有没有办法知道FileSystemwatcher还剩下多少缓冲区?

c++ - 如何在 C++ 中清除 cin 缓冲区

c++ - StringCbPrintf 示例不工作

java - 如何使用部署在远程服务器上的示例 Web 应用程序进行测试?

java - 如何在 Vaadin 中将 Keylistener 添加到 ListSelect?

java - io.grpc.netty.NettyServerTransport 通知终止

javascript - 在javascript中跨域发布二进制数据

c# - 如何将 4 位二进制数转换为 8 位二进制数?