我正在閱讀一個非常大的文件使用NSInputStream並將它們發送到數據包中的設備。如果接收方沒有收到數據包,我可以使用數據包編號發回給發送方,代表丟失數據包的起始位置(以字節爲單位)。只讀文件的一部分從磁盤在objective-c
我知道一個NSInputStream不能倒帶和抓取數據包,但有沒有另一種方法來抓取請求的字節範圍,而無需將整個大文件加載到內存中?
如果有[NSData dataWithContentsOfFileAtPath:inRange]方法,它將是完美的。
我正在閱讀一個非常大的文件使用NSInputStream並將它們發送到數據包中的設備。如果接收方沒有收到數據包,我可以使用數據包編號發回給發送方,代表丟失數據包的起始位置(以字節爲單位)。只讀文件的一部分從磁盤在objective-c
我知道一個NSInputStream不能倒帶和抓取數據包,但有沒有另一種方法來抓取請求的字節範圍,而無需將整個大文件加載到內存中?
如果有[NSData dataWithContentsOfFileAtPath:inRange]方法,它將是完美的。
你可以用NSInputStream倒帶:
[stream setProperty:[NSNumber numberWithInt:offset]
forKey:NSStreamFileCurrentOffsetKey];
不適用於我的情況 – 2013-07-12 06:22:16
我不認爲有,做一個標準功能,但你可以自己寫一個,使用類別和C標準輸入輸出API:
@interface NSData(DataWithContentsOfFileAtOffsetWithSize)
+ (NSData *) dataWithContentsOfFile:(NSString *)path atOffset:(off_t)offset withSize:(size_t)bytes;
@end
@implementation NSData(DataWithContentsOfFileAtOffsetWithSize)
+ (NSData *) dataWithContentsOfFile:(NSString *)path atOffset:(off_t)offset withSize:(size_t)bytes
{
FILE *file = fopen([path UTF8String], "rb");
if(file == NULL)
return nil;
void *data = malloc(bytes); // check for NULL!
fseeko(file, offset, SEEK_SET);
fread(data, 1, bytes, file); // check return value, in case read was short!
fclose(file);
// NSData takes ownership and will call free(data) when it's released
return [NSData dataWithBytesNoCopy:data length:bytes];
}
@end
然後你可以這樣:
// Read 100 bytes of data beginning at offset 500 from "somefile"
NSData *data = [NSData dataWithContentsOfFile:@"somefile" atOffset:500 withSize:100];
我應該釋放NSData對象在調用函數? – 2012-04-21 16:48:23
你的意思是NSInputStream? – Tim 2009-09-12 20:08:15
是的。我的意思是一個NSInputStream。對不起,我感到困惑 – coneybeare 2009-09-12 20:36:06
你對設備的功能有任何控制嗎?它是否可能爲接收到的數據包發送ack,因此您將數據包保存在內存中並重新發送,直到您收到確認? – 2009-09-12 21:14:04