ファイルの入出力

ファイルには主にテキストファイルとバイナリファイルがあります。ここではOSX(Swift)でテキストとバイナリファイルの入出力をする方法を紹介します。

テキストファイルの入力

テキストファイルは文字列クラスにより読み込み可能です。

let text = String(contentsOfFile: url, encoding: NSUTF8StringEncoding, error: nil)

この命令により指定したurlのテキストファイルがtextへ入ります。

テキストファイルの出力

テキストファイルの保存に関しては、文字列オブジェクトから行うことが可能です。文字列オブジェクトのwriteメソッドを使用します。

let text = "保存される文字列"
do{
    try text.write(to: url, atomically: true, encoding: String.Encoding.utf8)
}catch{
    //Error処理
}

writeのto:に保存するurlを指定します。encoding:で文字の保存形式を指定します。基本的にUTF8で保存すればいいかと思います。atomically:はアトミックWrite(不可分操作)の指定です。trueだとバックアップファイルを作ってから、保存先に保存します。falseだと直接保存先に保存します。アトミックWriteだと、保存中に悪いことがあった時に、バックアップファイルを使うことで復元し操作しなかったことにできます。

バイナリファイルの入力

バイナリファイルの扱いにはNSDataを使用します。URLから以下のように命令しNSDataのオブジェクトを作ります。

let binaryData=try Data(contentsOf: url, options: [])

urlにはOpenダイアローグなどで取得したURLオブジェクトをいれてください。これでbinaryDataにバイナリデータが入ります。あとはbinaryDataを扱ってデータを取り出します。

例えば、ファイルの4から8バイト目を取得したいときは以下のようにします。

var tmp=[UInt8](repeating:0,count:4)
binaryData.copyBytes(to: &tmp, from: Range(uncheckedBounds: (lower: 4, upper: 8)))

一行目でUInt8の4要素配列であるtmpを定義しています。二行目でbinaryDataからtmpへとバイナリデータを読み取っています。これにより、tmp[i]に バイナリファイルのi+1番目のバイトデータが入ります。

バイナリファイルの出力

出力においてもNSDataを使用します。NSData.writeメソッドを使用しurlを指定すれば、指定したurlにバイナリファイルが作成されます。内容はNSDataオブジェクトとなります。例えば、Int型の数値1,2,3を記憶したバイナリファイルを保存したい場合は以下のようにします。

let saveData:[Int]=[1,2,3]
do{
    try Data(bytes: saveData,count: MemoryLayout<Int>.size*saveData.count).write(to: url)
}catch{
    //Error処理
}

3行目でNSDataオブジェクトを作成し、writeでurlへ出力しています。保存は失敗する可能性があるので、do,tryでエラー処理を行っています。エラーがあった場合はcatchの中へ移動します。

著者:安井 真人(やすい まさと)