Чтение строк из и запись в файлы и URL.

Cocoa

Чтение файлов или URL-адресов с использованием NSString очень просто, при условии, что вы знаете, какую кодировку использует ресурс, если вы не знаете кодировку, чтение ресурса представляется более сложной задачей. Когда вы пишете в файл или URL, необходимо указать кодировку для последующего использования.

Чтение из файлов и URL

NSString обеспечивает различные методы для чтения данных из файлов и URL-адресов. В общем, это намного проще для чтения данных, если вы знаете кодировку. Если у вас есть обычный текст и Вам не известна кодировка, вы уже находитесь в трудном положении. Вы должны избегать этой ситуации, если это вообще возможно, что требует для использования текстовых файлов указывать кодировку (желательно UTF-8 или UTF-16 + BOM).

Чтение данных с помощью известной кодировки

Для чтения из файла или URL, для которого вы знаете, кодировку, вы используете stringWithContentsOfFile:encoding:error: или stringWithContentsOfURL:encoding:error: или соответствующей init... метод, как показано в следующем примере.

NSString *path = ...;

NSError *error;

NSString *stringFromFileAtPath = [[NSString alloc]

                                      initWithContentsOfFile:path

                                      encoding:NSUTF8StringEncoding

                                      error:&error];

if (stringFromFileAtPath == nil) {

    // произошла ошибка

    NSLog(@"Error reading file at %@\n%@",

              path, [error localizedFailureReason]);

    //продолжение реализации ...

Вы также можете инициализировать строку, используя объект данных, как показано на следующих примерах. Опять же, вы должны указать правильную кодировку.

NSString *path = ...;

NSData *data = [NSData dataWithContentsOfFile:path];

// предположим данные в UTF8

NSString *string = [NSString stringWithUTF8String:[data bytes]];

// Если данные в другой кодировке, например ISO-8859-1

NSString *string = [[NSString alloc]

            initWithData:data encoding: NSISOLatin1StringEncoding];
Важно: NSString предоставляет методы (такие, как stringWithContentsOfFile: и initWithContentsOfURL:) для чтения из файла или URL, без указания кодировки. Поскольку эти методы не указывают кодировку, вы можете потерять информацию или уничтожить данные, используя их. Вам настоятельно не рекомендуется использовать эти методы, поскольку они являются устаревшими.

Чтение данных с неизвестной кодировкой

Если вы окажетесь с текстом в неизвестной кодировке, то лучше сначала убедиться, что существует механизм для исправления неизбежных ошибок. Например, Apple Mail и Safari имеют меню с выбором кодировки, TextEdit позволяет пользователю переоткрыть файл с явно указанной кодировкой.

Если вы вынуждены угадать кодировку (заметим, что в отсутствие явной информации, это будет предположением):

  1. Попробуйте stringWithContentsOfFile:usedEncoding:error: или initWithContentsOfFile:usedEncoding:error: (или их URL эквиваленты).
  2. Эти методы пытаются определить кодировку ресурса, и в случае успеха возвращают по ссылке используемую кодировку.

  3. Если пункт 1 не удался, попробуйте прочитать ресурс, указав кодировку UTF-8.
  4. Если и 2-й пункт неудачен, попробуйте соответствующую унаследованную кодировку.

    «Соответствующую» здесь немного зависит от обстоятельств, это может быть строка в C кодировке по умолчанию, это может быть ISO или Windows, Latin 1, или нечто другое, в зависимости от того, что за данные и откуда получены.

  5. Наконец, вы можете попробовать NSAttributedString в методах загрузки из Application Kit (таких, как initWithURL:options:documentAttributes:error:).

    Эти методы попытаются загрузить текстовые файлы и возвращают используемую кодировку. Они могут быть использованы для более или менее произвольных текстовых документов, и которые стоит рассматривать, если ваше приложение не имеет представления о тексте. Они не могут быть использованы в случаях для Foundation-уровня инструментов и документов, которые не являются естественно-языковыми текстами.

Запись в файлы и URL

По сравнению с чтением данных из файла или URL-адреса, запись в NSString просто обеспечивает два удобных метода, writeToFile:atomically:encoding:error: и writeToURL:atomically:encoding:error:. Вы должны указать кодировку, которая должна использоваться, и выбрать, следует ли писать ресурс атомарно или нет. Если вы не хотите писать атомарно, строка записывается непосредственно на путь, который вы укажите, в противном случае она будет записана во вспомогательный файл, а затем вспомогательный файл переименовывается в путь. Этот параметр гарантирует, что файл, если он вообще существует, не будет поврежден, даже если система совершит аварию во время записи. При записи в URL-адрес, опция атомарность игнорируется, если пункт назначения не того типа, который может быть доступен атомарно.

NSString *path = ...;

NSString *string = ...;

NSError *error;

BOOL ok = [string writeToFile:path atomically:YES

                  encoding:NSUnicodeStringEncoding error:&error];

if (!ok) {

    // обработка ошибки...

    NSLog(@"Error writing file at %@\n%@",

              path, [error localizedFailureReason]);

    // продолжение реализации ...

Резюме

В данной таблице представлены наиболее распространенные способы чтения и записи строковых объектов в и из файлов и URL-адресов:

ИсточникМетод читающийМетод записывающий
ФайлstringWithContentsOfFile:encoding:error:
stringWithContentsOfFile:usedEncoding:error:
writeToFile:atomically:encoding:error:
URLstringWithContentsOfURL:encoding:error:
stringWithContentsOfURL:usedEncoding:error:
writeToURL:atomically:encoding:error:
 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac