将NSMutableArray保存到txt文件/将txt文件加载回NSMutableArray

时间:2011-03-22 12:20:46

标签: iphone objective-c cocoa-touch nsmutablearray

我浏览了一下,试图找到一个简单的方法,首先将一个MutableArray(它将包含来自UITextViews的不同文本数组,带有返回等)保存到txt文件中,然后将txt文件加载回我的MutableArray

我没有设法提出反向方法(加载文本文件),并想知道我应该怎么做。我确定txt文件和可变数组并不真正兼容,特别是如果我想让MutableArray从UITextViews中保存各种文本字符串。

有没有办法在可变数组中标记一个部分的开头,在txt文件中标记下一个部分的开头?目的是能够在程序和简单的文本编辑器中编辑txt文件,而不会弄乱可变数组的结构。

我可以在文本文件中使用某个特殊字符(显然不是\ n)来分隔不同的对象吗?

到目前为止,我已经提出了这个问题。对不起,我是初学者,非常基础。第一个问题是我收到错误消息'NSMutableArray'可能没有响应'-writeToFile:atomically:encoding:error:'。接下来,我不知道如何将txt加载回我的数组。最后,我想提出一种方法来分离txt中的数组,使其保持可编辑状态,但那将是绝对的结冰。也许解决方案是将一个数组中的每个Object保存在一个单独的txt文件中,然后将每个txt加载到数组中?

// GENERATE ARRAY

NoteBook = [[NSMutableArray alloc] init];

for (int temp = 0; temp < 3; temp++) {
    [NoteBook insertObject:@"Title\n\n Line1\nLine2..." atIndex:temp];
}

// SAVING MY MUTABLE ARRAY

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents directory

NSError *error;
BOOL succeed = [NoteBook writeToFile:[documentsDirectory stringByAppendingPathComponent:@"myfile.txt"]
                          atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (!succeed){
    // Handle error here
}



// LOADING TEXTFILE AND PUT IT INTO A MUTABLE ARRAY
// NO IDEA... how to do this

5 个答案:

答案 0 :(得分:3)

使用例如

将数组转换为字符串,反之亦然
NSString* arrayText = [NoteBook componentsJoinedByString: @"<your-favourite-separator-string>"];

使用[arrayText writeToFile ...]

写入文件

从文件中读回字符串后,使用

Notebook = [arrayText componentsSeparatedByString: @"<your-favourite-separator-string>"];

最后,不要这样做。将数组直接保存到属性列表(阅读那些)或JSON或其他一些结构化数据格式。

答案 1 :(得分:2)

为什么不将可变数组转换为JSON并将该字符串写入文件?反过来是从文件中读取字符串并使用JSON解析器返回到数组。 json-framework非常易于使用。

只要您编写有效的JSON,就可以通过编辑文本文件来创建或修改数组。

答案 2 :(得分:2)

  1. 将NSMutableArray设为NSArray。因为NSMutableArray没有writeToFile。
  2. 从文件中检索数组

    NSArray *theCatalogInfo=nil;
    NSString *theCatalogFilePath = [NSString stringWithFormat:@"%@/Documents/",NSHomeDirectory()];
    theCatalogFilePath = [theCatalogFilePath stringByAppendingString:kCatalogCachePath];
    if(nil!=theCatalogFilePath)
    {
        theCatalogInfo=[[NSArray alloc]initWithContentsOfFile:theCatalogFilePath];
    }
    
  3. 将数组保存到文件

    NSString *theCatalogFilePath = [NSString stringWithFormat:@"%@/Documents/",NSHomeDirectory()];
    theCatalogFilePath = [theCatalogFilePath stringByAppendingString:kCatalogCachePath];
    
    [**YourArray** writeToFile:theCatalogFilePath atomically:YES];
    

答案 3 :(得分:0)

查看以下三种方法来创建文本文件,写入文件并从中读取数据。 关键是存储由空格分隔的不同对象。你应该很简单。

-(void)createFile
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains
    (NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"Sample.txt"]; 

    NSFileManager * file_manager = [NSFileManager defaultManager];

    if(![file_manager fileExistsAtPath:filePath])
    {
        [file_manager createFileAtPath:filePath contents:nil attributes:nil];

        NSString *content = @"NULL NULL NULL";
        [content writeToFile:filePath 
                  atomically:NO 
                    encoding:NSStringEncodingConversionAllowLossy 
                       error:nil];
    }

}

-(void)writeToFile
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains
    (NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"Sample.txt"]; 

    NSString *content = [NSString stringWithFormat:@"%@ %@ %@", obj1, obj2, obj3];

    [content writeToFile:filePath 
                atomically:NO 
                encoding:NSStringEncodingConversionAllowLossy 
                error:nil];
}

-(void)readFromFile
{
    objects = [[NSArray alloc] init];
    NSArray *paths = NSSearchPathForDirectoriesInDomains
    (NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"Sample.txt"]; 
    if (filePath) {  
        NSString *myText = [NSString stringWithContentsOfFile:filePath encoding:NSASCIIStringEncoding error:nil];  
        if (myText) { 
            objects = [myText componentsSeparatedByString:@" "];
        }
    }

}

答案 4 :(得分:0)

如果您的nsarray包含nsdictionary,nsarray,nsstring,nsnumber,nsdata或nsdate对象(没有自定义对象,int等),您只需将可变数组的内容写入plist文件即可。

这将维护您拥有的数据结构,您只需将数据直接读入数组即可。我在几个数据类中的表现是

NSArray *tempArray = [NSArray arrayWithContentsOfFile:[Utils getFileLocation]];
if (tempArray == nil) {
    yourArray = [[NSMutableArray alloc] init];
} else {
    yourArray = [[NSArray deepMutableCopy:tempArray] retain];
}