当前位置: 首页 > 知识库问答 >
问题:

将-ing放入字节缓冲区,然后将其写入文件比写入单个字段更有效

曹育
2023-03-14

不使用ByteBuffer:第一种方法

public class DemoSecond {

    byte characterData;
    byte shortData;
    byte[] integerData;
    byte[] stringData;

    public DemoSecond(byte characterData, byte shortData, byte[] integerData,
        byte[] stringData) {
        super();
        this.characterData = characterData;
        this.shortData = shortData;
        this.integerData = integerData;
        this.stringData = stringData;
    }

    public static void main(String[] args) {
        DemoSecond dClass= new DemoSecond((byte)'c', (byte)0x7, new byte[]{3,4},
            new byte[]{(byte)'p',(byte)'e',(byte)'n'});

        File checking= new File("c:/objectByteArray.dat");
        try {
            if (!checking.exists()) {
                checking.createNewFile();
            }
            // POINT A
            FileOutputStream bo = new FileOutputStream(checking);
            bo.write(dClass.characterData);
            bo.write(dClass.shortData);
            bo.write(dClass.integerData);
            bo.write(dClass.stringData);
            // POINT B
            bo.close();
        } catch (FileNotFoundException e) {
                System.out.println("FNF");
                e.printStackTrace();
        } catch (IOException e) {
                System.out.println("IOE");
                e.printStackTrace();
        }
    }
}

使用byte Buffer:还有一点是数据成员的大小将始终保持固定,即CharacterData=1byte、ShortData=1byte、IntegerData=2byte和StringData=3byte。所以这个类的总大小总是7byte

第二种方法

            // POINT A
            FileOutputStream bo = new FileOutputStream(checking);
            ByteBuffer buff= ByteBuffer.allocate(7);
            buff.put(dClass.characterData);
            buff.put(dClass.shortData);
            buff.put(dClass.integerData);
            buff.put(dClass.stringData);
            bo.write(buff.array());
            // POINT B

PS

如果我使用序列化,它还会写入单词“characterdata”、“shortdata”、“integerdata”、“stringdata”以及我不想在文件中写入的其他信息。我在这里所说的只是关于他们的价值观。在这个例子中,它是:'C',7,3,4'P','E','N'。我只想把这7字节写进文件,而不是其他对我没用的信息。

共有1个答案

桑睿识
2023-03-14

在执行文件I/O时,您应该记住,I/O操作可能比CPU在输出代码中完成的任何工作都要慢得多。第一个近似值是,I/O的开销与写入的数据量成正比,加上为执行I/O而进行的每个操作系统调用的固定开销。

因此,在您的情况下,您希望最小化操作系统调用的数量来进行写入。这是通过缓冲应用程序中的数据来完成的,因此应用程序很少执行put较大的操作系统调用。

使用字节缓冲区是这样做的一种方法,因此ByteBuffer代码将比FileOutputStream代码更有效。

但还有其他考虑。您的示例执行的写入次数不多。所以无论如何都很可能很快。任何优化都可能是过早的优化。优化往往会使代码更加复杂,更难理解。要理解ByteBuffer代码,读者除了需要理解FileOutputStream代码之外,还需要理解ByteBuffer是如何工作的。如果更改文件格式,则更有可能在bytebuffer代码中引入bug(例如,缓冲区太小)。

通常会对输出进行缓冲。因此,Java已经提供了帮助您的代码,您不应该感到惊讶。这些代码将由专家编写、测试和调试。除非您有特殊要求,否则您应该始终使用这样的代码,而不是编写自己的代码。我引用的代码是BufferedOutputStream类。

要使用它,只需修改不使用bytebuffer的代码,方法是将打开文件的代码行更改为

 OutputStream bo = new BufferedOutputStream(new FileOutputStream(checking));
 类似资料:
  • 问题内容: 我有一个返回字符串的函数。该字符串包含回车符和换行符(0x0D,0x0A)。但是,当我写入文件时,它仅包含换行符。有没有一种方法可以使输出包括回车和换行符。 问题答案: 如果要写入字节,则应以二进制模式打开文件。

  • 我无法重写从二进制缓冲区获取的文件,我已与原始文件进行了检查,所有字节都相同。 这是从NodeJS创建的文件: 这是最初的一个: 你可以比较这两个文件,每个字节都是一样的,我猜NodeJS的编码不是正确的。 这是一段代码 你可以试着在你的节点上运行它,看看结果是错误的。 我能做些什么来修复它?

  • 问题 你想在文本模式打开的文件中写入原始的字节数据。 解决方案 将字节数据直接写入文件的缓冲区即可,例如: >>> import sys >>> sys.stdout.write(b'Hello\n') Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: must be str,

  • 我在做一个CSC 110项目。尽管我们还没有学过字典,我还是试着用字典来完成我们的作业。 我有一份国家和他们赢得多少奖牌的档案,用新的行字符隔开。例如: 虽然这是有效的,但它是肮脏和过于复杂。我正想出一个新方法来做这件事。

  • 我已经将一个图像文件读入了ByteArray中,但是我如何将它写回。我的意思是将ByteArray保存到文件系统中的图像文件中。首选PNG格式。 我从PNG文件到ByteArray的代码:

  • 我正在建立一个自定义的文件创建与Android应用程序。我试图将Bytebuffer的内容(它是我创建的自定义类中的字符串成员)写入字节类型的文件。但是,每当我这样做时,我得到的是字符串格式的文件内容。我尝试了几种替代方法,例如使用get方法、BufferedOutputStream类、ByteArrayOutputStream类、DataOutputStream类、Filechannel类等。以