如何使这段代码非常快?
它使用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个元素在文件中创建一个新行谢谢
最佳答案
我认为您要问的原因是因为这段代码运行得非常慢。如果是这种情况,那么一个原因是每个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
已被缓冲。