gpt4 book ai didi

iphone - 如何在 iPhone 上读取大型 UTF-8 文件?

转载 作者:技术小花猫 更新时间:2023-10-29 10:34:35 26 4
gpt4 key购买 nike

我的应用程序下载一个 UTF-8 格式的文件,该文件太大而无法使用 NSString initWithContentsOfFile 方法读取。我遇到的问题是 NSFileHandle readDataOfLength 方法读取了指定数量的字节,我最终可能只读取了 UTF-8 字符的一部分。这里最好的解决方案是什么?

稍后:

让它在航海日志中记录以下代码的工作:

    NSData *buf = [NSData dataWithContentsOfFile:path
options:NSDataReadingMappedIfSafe
error:nil];

NSString *data = [[[NSString alloc]
initWithBytesNoCopy:(void *)buf.bytes
length:buf.length
encoding:NSUTF8StringEncoding
freeWhenDone:NO] autorelease];

我的主要问题实际上是编码,而不是读取文件。

最佳答案

您可以使用 NSData +dataWithContentsOfFile:options:error:NSDataReadingMappedIfSafe 选项将您的文件映射到内存而不是加载它。因此,这将使用 iOS 中的虚拟内存管理器来确保文件的位以与桌面操作系统处理其磁盘虚拟内存文件相同的方式换入和换出 RAM。因此,您不需要足够的 RAM 来一次将整个文件保存在内存中,您只需要文件足够小以适应处理器的地址空间(因此,千兆字节)。您将获得一个与普通 NSData 完全一样的对象,这应该会为您省去与使用 NSFileHandle 和手动流式传输相关的大部分麻烦。

然后您可能需要将部分转换为 NSString,因为您实际上可以期望将其从 UTF-8 转换为另一种格式(尽管可能不会;值得一试 -initWithData:encoding: 并查看 NSString 是否足够智能,仅保留对原始数据的引用并根据需要从 UTF-8 扩展),我认为这才是您真正要问的问题。

我建议您使用 -initWithBytes:length:encoding: 将合理数量的字节转换为字符串。然后,您可以使用 -lengthOfBytesUsingEncoding: 来找出它实际有意义的字节数,并适本地推进您的读取指针。可以安全地假设 NSString 将丢弃您提供的字节末尾的任何部分字符。

编辑:所以,像这样:

// map the file, rather than loading it
NSData *data = [NSData dataWithContentsOfFile:...whatever...
options:NSDataReadingMappedIfSafe
error:&youdDoSomethingSafeHere];

// we'll maintain a read pointer to our current location in the data
NSUinteger readPointer = 0;

// continue while data remains
while(readPointer < [data length])
{
// work out how many bytes are remaining
NSUInteger distanceToEndOfData = [data length] - readPointer;

// grab at most 16kb of them, being careful not to read too many
NSString *newPortion =
[[NSString alloc] initWithBytes:(uint8_t *)[data bytes] + readPointer
length:distanceToEndOfData > 16384 ? 16384 : distanceToEndOfData
encoding:NSUTF8StringEncoding];

// do whatever we want with the string
[self doSomethingWithFragment:newPortion];

// advance our read pointer by the number of bytes actually read, and
// clean up
readPointer += [newPortion lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
[newPortion release];
}

当然,一个隐含的假设是所有 UTF-8 编码都是唯一的,我不得不承认我的知识还不足以保证绝对肯定。

关于iphone - 如何在 iPhone 上读取大型 UTF-8 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8928723/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com