如何使这段代码非常快?
它使用RandomAccessFile(输入)读取原始图像,并使用DataOutputStream(输出)将其写入文件中。

final int WORD_SIZE = 4;
byte[] singleValue = new byte[WORD_SIZE];
long position;

    for (int i=1; i<=100000; i++)
    {
             out.writeBytes(i + " ");

             for(int j=1; j<=17; j++)
             {
                  in.seek(position);
                  in.read(singleValue);
                  String str = Integer.toString(ByteBuffer.wrap(singleValue).order(ByteOrder.LITTLE_ENDIAN).getInt());
                  out.writeBytes(str + " ");
                  position+=WORD_SIZE;
             }
             out.writeBytes("\n");
    }


内部的for每17个元素在文件中创建一个新行

谢谢

最佳答案

我认为您要问的原因是因为这段代码运行得非常慢。如果是这种情况,那么一个原因是每个seekread调用都在进行系统调用。 RandomAccessFile没有缓冲。 (我猜测singleValue是长度为1的byte[]。)

因此,使此过程更快的方法是退后一步,思考一下它的实际作用。如果我理解正确,它将读取文件中的每个第4个字节,将其转换为十进制数字,然后将其输出为文本(17到一行)。您可以像这样使用BufferedInputStream轻松地做到这一点:

    int b = bis.read();  // read a byte
    bis.skip(3);         // skip 3 bytes.


(带有一些错误检查...。)。如果使用这样的BufferedInputStream,则大多数readskip调用将对已经缓冲的数据进行操作,并且每N个字节,系统调用的数量将减少为1,其中N是缓冲区尺寸。

更新-我的猜测是错误的。您实际上正在阅读替代词,所以...

    bis.read(singleValue);
    bis.skip(4);





每偏移100000,我必须跳200000,然后再次执行直到文件结尾。


使用bis.skip(800000)来做到这一点。它应该通过移动文件位置而不实际读取任何数据来进行较大的跳过。最多一个系统调用。 (至少对于FileInputStream。)



您还可以通过将DataOutputStream包裹在BufferedOutputStream周围,从而将输出端的速度提高大约相等。

但是System.out已被缓冲。

07-24 09:49