从Cocoa中的文件中只读"N"个字节

Grz*_*lak 18 cocoa objective-c nsdata

如何从指定文件中只读取"N"个字节?

Jim*_*vey 26

如果您希望以类似于通过NSData加载它的方式随机访问文件的内容,但实际上没有将所有内容读入内存,则可以使用内存映射.这样做意味着磁盘上的文件被视为虚拟内存的一部分,并且将像常规虚拟内存一样进行分页.

NSError * error = nil;
NSData * theData = [NSData dataWithContentsOfFile: thePath
                                          options: NSMappedRead
                                            error: &error];
Run Code Online (Sandbox Code Playgroud)

如果您不关心获取文件系统错误的详细信息,您可以使用:

NSData * theData = [NSData dataWithContentsOfMappedFile: thePath];
Run Code Online (Sandbox Code Playgroud)

然后你只需使用NSData的-getBytes:range:方法来提取特定的数据,只有文件的相关部分才能从永久存储中读取; 他们也有资格被分页.

  • 你知道这与NSInputStream*stream = [NSInputStream inputStreamWithFileAtPath:thePath]有什么不同吗?[stream read:theBuffer maxLength:255]; ?我假设他们是相同的 (2认同)
  • NSInputStream将离散地从文件系统中读取块.如果您以顺序方式访问该文件,则流式传输很好.如果您需要随机访问,那么NSFileHandle或映射数据对象是可行的方式,后者更适合整体随机访问. (2认同)

Pet*_*sey 24

- [NSFileHandle readDataOfLength:].

NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:filePath];
NSData *fileData = [handle readDataOfLength:N];
[handle closeFile];
Run Code Online (Sandbox Code Playgroud)

  • [[NSFileHandle fileHandleForReadingAtPath:path] readDataOfLength:length] (4认同)

Ale*_*lex 0

打开文件:

NSData *fileData = [NSData dataWithContentsOfFile:fileName];
Run Code Online (Sandbox Code Playgroud)

读取你想要的字节:

int bytes[1000];
[fileData getBytes:bytes length:sizeof(int) * 1000];
Run Code Online (Sandbox Code Playgroud)

  • 在此示例中,必须先读取整个文件,然后才能读取这 N 个字节。就我而言,当文件大约 900 MB 时,此方法似乎有点“硬核” (5认同)