Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 随机存取文件读取_Java_File Io_Performance - Fatal编程技术网

Java 随机存取文件读取

Java 随机存取文件读取,java,file-io,performance,Java,File Io,Performance,如何从文件中读取数字 当我使用readInt方法时,我得到了一个大数字,它并不等于文件中的数字 如何修复它 扫描仪不是个好主意,因为这个文件包含超过10亿个数字。。。这将需要很长时间 是的,文本文件 文件包含数字和分隔的空格符号。例如(test.txt) 1 2 4-4004 15458 8876 public static void readByMemoryMappedFile(int buffer[], String filename) throws IOException {

如何从文件中读取数字

当我使用readInt方法时,我得到了一个大数字,它并不等于文件中的数字

如何修复它

扫描仪不是个好主意,因为这个文件包含超过10亿个数字。。。这将需要很长时间

是的,文本文件

文件包含数字和分隔的空格符号。例如(test.txt)

1 2 4-4004 15458 8876


   public static void readByMemoryMappedFile(int buffer[], String filename) throws IOException
   {
      int count = 0;

      RandomAccessFile raf = new RandomAccessFile(filename, "r");
      try {
            MappedByteBuffer mapFile = raf.getChannel().map(MapMode.READ_ONLY, 0, raf.length());

            StringBuilder b = new StringBuilder();
            try {
                  while (mapFile.hasRemaining()) {
                        byte read = mapFile.get();
                        if (read == ' ' && b.length() > 0) {
                              buffer[count++] = mapFile.getInt();//Integer.parseInt(b.toString());
                              b.delete(0, b.length());
                        } else {
                              b.append((char) read);
                        }
                  }
            } catch (BufferUnderflowException e) {
                  // Всё, файл закончился
            }
            if (b.length() > 0) {
                  buffer[count++] = Integer.parseInt(b.toString());
            }
      } finally {
            raf.close();
      }
   }
因此,我附上报告:


// operation: time
reading: 39719   // t0
reading: 28297   // t1
reading: 56719   // t2
reading: 125735  // t3
reading: 199000  // t4
t0
如何改变我的程序的行为:t0~t1~t2~t3~t4

如果您想随机访问数据,您需要能够确定从何处开始和从何处结束。对于文本格式,这可能很棘手,您可能需要阅读前面的所有行/文本才能找到所需的行/文本

使用二进制格式,您可能能够准确地计算要读取的位置,但您需要知道数字是如何编码的。e、 是大端语还是小端语

扫描器可能不是文本的最佳选择,对二进制数据也没用,但如果是的话,它可能会足够快


扫描一个大文件所需的大部分时间是从磁盘读取所需的时间(假设它不适合内存),如果文件压缩良好(例如,充满数字的文本),则可以显著加快扫描速度。如果压缩的话,读取它可能只需要2秒,而不是20秒。(它可能适合操作系统文件缓存)

如果您想随机访问数据,您需要能够确定从何处开始和从何处结束。对于文本格式,这可能很棘手,您可能需要阅读前面的所有行/文本才能找到所需的行/文本

使用二进制格式,您可能能够准确地计算要读取的位置,但您需要知道数字是如何编码的。e、 是大端语还是小端语

扫描器可能不是文本的最佳选择,对二进制数据也没用,但如果是的话,它可能会足够快


扫描一个大文件所需的大部分时间是从磁盘读取所需的时间(假设它不适合内存),如果文件压缩良好(例如,充满数字的文本),则可以显著加快扫描速度。如果压缩的话,读取它可能只需要2秒,而不是20秒。(并且它可能适合操作系统文件缓存)

产生这个大数字的一个可能原因可能是字节顺序。Java在从通道读取时默认使用Big-Endian。如果正在读取的文件是Little Endian,则小数字将变大,因为最低有效字节将变为最高有效字节


您可以使用order方法更改ByteBuffer的字节顺序。

字节顺序可能是导致该数字过大的原因。Java在从通道读取时默认使用Big-Endian。如果正在读取的文件是Little Endian,则小数字将变大,因为最低有效字节将变为最高有效字节


您可以使用order方法更改ByteBuffer的字节顺序。

这取决于数字的存储方式

我想简单的答案是:无论如何,你必须知道数字从哪里开始,在哪里结束,它是以文本还是二进制形式存储,如果是二进制,字节顺序是什么,即小端还是大端

如果它存储为文本,则从数字构建一个字符串,然后对该字符串调用Integer.parseInt。(或者,如果是浮点数,对于其他数据类型,可以使用Double.parseDouble等。)

如果存储为二进制整数,则将字节读入数组,或者逐个读取,然后乘以256的幂并相加

例如,假设您有一个小尾端顺序的四字节数。将其读入大小为4的字节数组。然后:

byte[] incoming=new byte[4];
file.read(incoming);
int n=0;
for (int p=0;p<4;++p)
  n=n*256+incoming[p];
return n;
byte[]传入=新字节[4];
文件读取(传入);
int n=0;

对于(int p=0;p这一切都取决于数字的存储方式

我想简单的答案是:无论如何,你必须知道数字从哪里开始,在哪里结束,它是以文本还是二进制形式存储,如果是二进制,字节顺序是什么,即小端还是大端

如果它存储为文本,则从数字构建一个字符串,然后对该字符串调用Integer.parseInt。(或者,如果它是浮点数,则对其他数据类型调用Double.parseDouble等。)

如果存储为二进制整数,则将字节读入数组,或者逐个读取,然后乘以256的幂并相加

例如,假设您有一个小尾数顺序的四字节数。您将其读入大小为4的字节数组。然后:

byte[] incoming=new byte[4];
file.read(incoming);
int n=0;
for (int p=0;p<4;++p)
  n=n*256+incoming[p];
return n;
byte[]传入=新字节[4];
文件读取(传入);
int n=0;

对于(int p=0;p如果您的数字存储为text readInt()将不起作用。您必须解析文件,这是唯一的方法。

如果您的数字存储为text readInt())不起作用。您必须解析文件,这是唯一的方法。

在内存映射数据时,您也可以使用ByteBuffer。在内存映射数据时,您也可以使用ByteBuffer。关键问题是,数据是二进制格式还是文本格式?这在您的问题中不清楚。关键问题是,数据是二进制格式还是文本格式?这在中不清楚你的问题。瓦乔夫斯基:你明白你如何读取取决于文件是如何写入的吗?如果文件是以文本形式写入的,你不能决定将其作为二进制文件读取,反之亦然。瓦乔夫斯基:你明白你如何读取取决于文件是如何写入的吗?如果文件是以文本或文本形式写入的,你不能决定将其作为二进制文件读取反之亦然。