iOS 中 CSV格式文件读写

iOS 中 CSV格式文件读写,第1张

逗号分隔值 (Comma-Separated Values, CSV ,有时也称为 字符分隔值 ,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。(:来自百度百科)

假设我们的项目中有一个 csv 文件,叫做1

假设我们有一个 likee.csv 需要放在Documents目录下

2.够造需要写入的数据

3.够造为NSData,并使用NSData进行文件的写入。

在 mac 下文本的默认编码格式使用的是UTF-8,在 windows 的 Excel 上,对中文的处理是GBK,所以可能会造成乱码的问题。如果读取文件是无法读出内容,就和使用的编码格式有关。所以建议先使用UTF-8进行解码,如果无法显示内容,再用GBK进行解码

最近遇到一个保存图片时的崩溃, 崩溃信息如下:

提示的异常信息是:

查看一下调用函数, 主要调用如下:

说明在执行 NSData *imageData = UIImagePNGRepresentation(image) 这个 *** 作时,崩溃了。而且崩溃的原因是 内存分配出错 。 通常这种问题都是因为内存不足引起的。但是查看了一下log, 发现并没有 MemoryWarning 这句日志, 说明程序还没来得及处理系统的内存警告就崩溃了

根据这些现象猜测可能的原因

针对这两种猜测,作了相应的处理

其实有 UIImage 对象的时候,说明图片已经可以正常展示,加载这张图片到内存暂时是没有问题的。但保存的时候又根据 UIImage 对象生成 NSData, 然后在通过NSData保存文件。 在NSData写入文件到释放前,内存里面其实有两份 图片 的数据, 一份是显示的, 一份是准备用来保存的NSData。 这样其实就是临时分配了一块大空间,如果可以减少临时对象的分配,直接读取UIImage的数据来存储就可以降低内存的使用。

通过查阅文档,发现Image IO 的库可以做到。

于是,保存函数改成这样:

这种情况比较好处理,就是因为加到 AutoReleasePool 的对象没有马上释放,必须要等下一次 RunLoop 循环才会清理。

这种问题可以加 @autoreleasepool{} 处理。

最后函数变成:

当然 @autoreleasepool 写在这里作用并不大, 应该要加在相应的for()循环里面。

因此定义一个宏,方便替换,只要把原来的 for 替换成 AutoRelease_for 就可以。

1.获取Caches 文件夹路径。

NSString *pathDocuments = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0]

2.在Caches 文件夹下面 建一个子文件夹便于管理!

NSString *imagePath = [NSString stringWithFormat:@"%@/Media", pathDocuments]

[[NSFileManager defaultManager] createDirectoryAtPath:imagePath withIntermediateDirectories:YES attributes:nil error:nil]

文件名字为 Media。

3.获取NSData

NSString * path = [[NSBundle mainBundle] pathForResource:@"D0024" ofType:@"mp4"]

NSData *videoMy=[NSData dataWithContentsOfFile:path]

NSMutableData *videoData =[NSMutableData data]

[videoData setData:[NSData data]]

[videoData appendData:videoMy]

NSString *filePath = [imagePath stringByAppendingPathComponent:@"DJI_0024.mp4"]

BOOL isSuccess = [videoData writeToFile:filePath atomically:YES]

if (isSuccess) {

NSLog(@"能写进去")

}

else{

NSLog(@"不成功")

}

NSURL *url = [NSURL fileURLWithPath:filePath]

AVPlayerViewController * play = [[AVPlayerViewController alloc]init]

play.player = [[AVPlayer alloc]initWithURL:url]

[self presentViewController:play animated:YES completion:nil]


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11649567.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存