package io; import java.io.File; import java.io.RandomAccessFile; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * RandomAccessFile 类读写测试及其性能优化(二) * * 读取 RandomAccessFile 类读写测试及其性能优化(一) * (链接 http://jackyin5918.iteye.com/blog/2022888 )中 * GenerateIntArray 生成的并保存到文件的数据. * * 多线程读取文件和多线程写文件一样没有提升速度. * * 疑似RandomAccessFile 读写文件时会阻塞,对文件加锁神马的的,待研究. * * */ public class GetTheMiddle { private int count = 1000; // 数组的个数, private int size = 10; // 每个数组的元素个数 private int[][] dataArr; public GetTheMiddle() { dataArr = new int[count][size]; } public GetTheMiddle(int count, int size) { this.count = count; this.size = size; this.dataArr = new int[count][size]; } public int[][] getDataArr() { return dataArr; } public int[][] readData(File f) { try { RandomAccessFile rf = new RandomAccessFile(f, "r"); for (int i = 0; i < count; i++) { for (int j = 0; j < size; j++) { dataArr[i][j] = rf.readInt(); } } rf.close(); } catch (Exception e) { e.printStackTrace(); } return dataArr; } class ReadDataTask implements Runnable { private File f; private int dataIndex; public ReadDataTask(File f,int dataIndex) { this.f = f; this.dataIndex = dataIndex; } @Override public void run() { try { RandomAccessFile rf = new RandomAccessFile(f, "r"); rf.skipBytes(dataIndex * size * 4 ); for (int j = 0; j < size; j++) { dataArr[dataIndex][j] = rf.readInt(); } rf.close(); } catch (Exception e) { e.printStackTrace(); } } } public int[][] readData_M(File f) { try { ExecutorService exec = Executors.newCachedThreadPool(); for(int i=0;i<count;i++) { exec.execute(new ReadDataTask(f,i)); } exec.shutdown(); while(true) { if(exec.isTerminated()) break; } } catch (Exception e) { e.printStackTrace(); } return dataArr; } public static void main(String[] args) { int count = 3; int size = 4; boolean bPrintData = true; // 是否打印生成的数组,当数据量大是不打印,只在小数据量时打印以便测试 System.out.printf("count = %d, size = %d \n\n", count, size); GenerateIntArray generator = new GenerateIntArray(count, size); GetTheMiddle gm = new GetTheMiddle(count,size); File f; try { f = new File("D:\\D\\test_data.dat"); generator.refreshDataArr(); generator.writeData2File_B(f); System.out.println("正在读取数据,请稍后..."); long startTmie = System.nanoTime(); gm.readData(f); long totalTime = (System.nanoTime() - startTmie)/ 100000; System.out.println("readData(f) 读取数据成功, 耗时:" + totalTime); System.out.println(); System.out.println("正在读取数据,请稍后..."); startTmie = System.nanoTime(); gm.readData_M(f); totalTime = (System.nanoTime() - startTmie)/ 100000; System.out.println("readData_M(f) 读取数据成功, 耗时:" + totalTime); System.out.println(); } catch (Exception e) { e.printStackTrace(); } if(bPrintData) { System.out.println("generator中生成的数据..."); int[][] intArr = generator.getDataArr(); for (int i = 0; i < count; i++) { for (int j = 0; j < size; j++) { System.out.printf("%d ", intArr[i][j]); } System.out.println(); } System.out.println("读取出来的数组..."); intArr = gm.getDataArr(); for (int i = 0; i < count; i++) { for (int j = 0; j < size; j++) { System.out.printf("%d ", intArr[i][j]); } System.out.println(); } } } }
相关推荐
RandomAccessFile类是Java I/O库中的一个重要组件,它提供了对文件进行随机访问的能力,这意味着你可以直接跳到文件的任意位置进行读写操作,而不仅仅局限于从头到尾的顺序访问。这个类非常适合处理大数据量的文件,...
Java中的`RandomAccessFile`类是用于处理文件的高级接口,它允许我们对文件进行随机访问,即在文件的任何位置进行读写操作,而不仅仅是从文件头开始顺序读写。这种能力使得`RandomAccessFile`在处理大文件或者需要...
花1K内存实现高效I-O的RandomAccessFile类 自己搜搜这个关键字. 我主要是用来优化Android上多线程断点下载的写文件效率 RandomAccessFile是操作硬盘的,比操作内存的数据慢了几百万倍, 所有有人做出优化,我特上传...
`RandomAccessFile`是Java中的一个核心类,主要用于读写随机访问文件。与传统的`FileInputStream`和`FileOutputStream`不同,`RandomAccessFile`允许程序在文件的任意位置进行读写操作,而不是按照文件的线性顺序。...
最近在用java的IO包下面的RandomAccessFile类读写中文文件时遇到了乱码问题,解决不了。于是索性自己写个类,可以进行中文文件读写而不乱码。 压缩包里提供了.jar包和源代码。 ************************************...
Java中的`RandomAccessFile`类是一个强大的文件操作工具,它允许程序员以随机访问模式读取和写入文件。与标准的`FileInputStream`和`FileOutputStream`不同,`RandomAccessFile`不仅支持顺序读写,还能直接跳转到...
NULL 博文链接:https://chaoyi.iteye.com/blog/2083498
Java的`RandomAccessFile`类是Java I/O流体系中的一种特殊类型,它允许程序员以随机访问模式读取和写入文件。与传统的输入/输出流不同,`...在实际项目中,可以根据需求结合其他I/O类和并发机制,优化文件操作性能。
Java 使用 RandomAccessFile 类基于指针读写文件实例代码 Java 中的 RandomAccessFile 类是一种基于指针操作的文件读写方式,能够实现对文件的随机访问。该类不同于其他许多基于流方式读写文件的类,它直接继承自 ...
6. 文件读写完成以后一定要关闭:在使用RandomAccessFile类时,读写完成以后一定要关闭文件,以免出现问题。 在RafDemo.java中,我们使用RandomAccessFile类来演示文件的读写操作。首先,我们创建了一个文件,并...
对大数据文本文件读取(按行读取)的优化,目前常规的方案有三种,第一种LineNumberReader,第二种RandomAccessFile,第三种是内存映射文件在RandomAccessFile基础上调用getChannel().map(...);代码提供在...
`RandomAccessFile`是Java中的一个类,位于`java.io`包中,它提供了对文件进行读写的能力,并且可以随机地定位到文件中的任何位置进行数据的读取或写入,这使得在处理大型文件时更为灵活高效。与`FileInputStream`和...
花1K内存实现高效IO的RandomAccessFile类.doc
2. **RandomAccessFile类**:Java提供了`java.io.RandomAccessFile`类来实现文件的随机读写。它可以定位到文件的任意位置进行读写,非常适合处理大文件或需要频繁跳转的场景。使用`RandomAccessFile`时,需要传入...
在Java编程中,`RandomAccessFile` 类提供了一种方式来处理文件中的数据,允许程序随机访问文件的任何部分。但在处理中文或其他非ASCII字符时,可能会遇到乱码问题。这是因为不同编码方式对字符的表示方式不同,如果...
文件操作——File 、 RandomAccessFile(上).mp4
Java中的RandomAccessFile类是用于文件随机读写的工具类,它属于java.io包。RandomAccessFile提供了读取和写入文件的能力,并且允许程序访问文件的任意位置,这使得它能够方便地进行文件的随机访问。...
Java中的`RandomAccessFile`是一个非常重要的类,它允许我们以随机访问模式读写文件,这意味着我们可以自由地在文件的任何位置进行读写操作,而不仅仅是顺序地从头到尾处理文件。这个类提供了对文件内容进行高效定位...