如何使这段代码非常快? 它使用RandomAccessFile(in)读取原始图像,并使用DataOutputStream(out)将其写入文件
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个元素
由于
答案 0 :(得分:1)
我认为你问的原因是因为这段代码运行得非常慢。如果是这种情况,那么一个原因是每个seek
和read
调用正在进行系统调用。 RandomAccessFile
没有缓冲。 (我猜测singleValue
是长度为1的byte[]
。)
因此,提高速度的方法是退后一步,思考它实际上在做什么。如果我理解正确的话,那就是读取文件中的每个第4个字节,将它们转换为十进制数并将它们作为文本输出,17输出到一行。您可以使用BufferedInputStream
这样轻松地执行此操作:
int b = bis.read(); // read a byte
bis.skip(3); // skip 3 bytes.
(有一点错误检查......)。如果您使用这样的BufferedInputStream
,则大多数read
和skip
调用将对已经缓冲的数据进行操作,并且每N个字节的系统调用数将减少为1 ,其中N是缓冲区大小。
更新 - 我的猜测错了。你实际上正在阅读替代词,所以......
bis.read(singleValue);
bis.skip(4);
每100000个偏移我必须跳到200000,然后再重复一次,直到文件结束。
使用bis.skip(800000)
来做到这一点。它应该通过移动文件位置而不实际读取任何数据来进行大跳跃。一个系统调用最多。 (对于FileInputStream
,至少。)
通过将DataOutputStream
包裹在BufferedOutputStream
附近,您还可以将输出端加速大致相等的数量。
但是System.out
已经缓存了。