橘本橘橘猫 2023-02-15 17:57 采纳率: 25%
浏览 82
已结题

Andoird Native&Linux&C/C++&随机读写

核心问题:
Android Native层如何用Open(不是File)去实现对文件的随机读写呢?
背景:
1:题主正在写一个测试磁盘速度的Tool(直接访问磁盘就需要O_DIRECT字段,所以就排除了File的方式)
2:开发环境是Windows系统+Andoird手机
思考:
1:Windows的API?例如CreateFile可以实现这个需求,但是Android是基于Linux系统的,无法使用,目前还在尝试使用NDK倒windows的库,但是Windows的库太多了,关联性也比较强,比较难以实现,
2Java的RandomAccessFile源码,但是没有是使用O_DIRECT,而且追到IoTracker就没下文了,有点难顶
3:通过随机修改文件内的文件指针,来达到随机读写,但是性能好像会缺失,目前正在实践

由于时间紧迫,想请教大家,非常感谢!

  • 写回答

9条回答 默认 最新

  • GISer Liu 2023-02-15 18:14
    关注

    Andoird Native&Linux&C/C++&随机读写 核心问题: Android Native层如何用Open(不是File)去实现对文件的随机读写呢? 背景: 1:题主正在写一个测试磁盘速度的Tool(直接访问磁盘就需要O_DIRECT字段,所以就排除了File的方式) 2:开发环境是Windows系统+Andoird手机 思考: 1:Windows的API?例如CreateFile可以实现这个需求,但是Android是基于Linux系统的,无法使用,目前还在尝试使用NDK倒windows的库,但是Windows的库太多了,关联性也比较强,比较难以实现, 2:Java的RandomAccessFile源码,但是没有是使用O_DIRECT,而且追到IoTracker就没下文了,有点难顶 3:通过随机修改文件内的文件指针,来达到随机读写,但是性能好像会缺失,目前正在实践 由于时间紧迫,想请教大家,非常感谢!

    在 Android Native 层中使用 open() 函数进行文件的随机读写是可行的。以下是一些注意事项和步骤:

    1. 首先需要在 C/C++ 代码中包含 <fcntl.h> 头文件和 <unistd.h> 头文件。
    2. 使用 open() 函数打开文件,并使用 O_DIRECT 标志以进行直接 I/O 操作,如下所示: python
      int fd = open("/path/to/file", O_RDWR | O_DIRECT);
      
    3. 对文件进行读写操作时,可以使用 pread()pwrite() 函数,这些函数可以直接在文件的指定偏移量处进行读写操作。例如,下面的代码片段使用 pread() 从文件的第 10 个字节开始读取 100 个字节的数据: scss
      char buffer[100];
      ssize_t n = pread(fd, buffer, sizeof(buffer), 10);
      
    4. 为了实现随机读写,可以在 pread()pwrite() 函数中使用不同的偏移量进行读写操作。例如,可以使用 rand() 函数生成随机偏移量,并使用 lseek() 函数将文件指针移动到该偏移量处,然后进行读写操作。以下是示例代码: scss
      // 生成随机偏移量
      off_t offset = rand() % file_size;
      
      // 将文件指针移动到随机偏移量处
      lseek(fd, offset, SEEK_SET);
      
      // 从随机偏移量处读取 100 个字节的数据
      char buffer[100];
      ssize_t n = pread(fd, buffer, sizeof(buffer), offset);
      
      // 将随机偏移量处写入 100 个字节的数据
      ssize_t n = pwrite(fd, buffer, sizeof(buffer), offset);
      

    注意:使用 O_DIRECT 标志进行直接 I/O 操作可能会对性能产生影响。此外,随机读写可能会导致文件系统的碎片化,因此应该谨慎使用。

    评论

报告相同问题?

问题事件

  • 系统已结题 2月23日
  • 创建了问题 2月15日

悬赏问题

  • ¥15 C#.net通过内网url地址获取文件并下载问题,浏览器postman可以正常下载,用程序不行
  • ¥15 本人本科机械,目前研一。没有深度学习基础,目前对研究生课题一片迷茫,请教各位!
  • ¥15 关于R语言单因素与多因素线性回归的平均值
  • ¥15 服务器清除BIOS之后引导不了
  • ¥15 CPLEX用OPL编写的混合整数线性优化问题。
  • ¥15 可以用EasyConnect连接实验室内网,但无法连接内网才能访问的服务器,为什么?
  • ¥15 前端预览docx文件,文件从后端传送过来。
  • ¥15 层次聚类和蛋白质相似度
  • ¥25 主成分分析中的第一第二主成分分别代表哪些参数
  • ¥15 oracle数据库查询语句问题