@NSBundle包,是一種特定的文件類型,一個主要作用是 獲取Resources文件夾中的資源
? ? ?bundle是一個目錄,其中包含了程序會使用到的資源. 這些資源包含了如圖像,聲音,編譯好的代碼,nib文件(用戶也會把bundle稱為plug-in). 對應bundle,cocoa提供了類NSBundle.
? ? ?
? ? ?我們的程序是一個bundle. 在Finder中,一個應用程序看上去和其他文件沒有什么區別. 但是實際上它是一個包含了nib文件,編譯代碼,以及其他資源的目錄. 我們把這個目錄叫做程序的main bundle。
? ? ?[NSBundle mainBundle]是獲得NSBundle的一個單例對象,次單例對象 已經設置了默認的resourcePath,也就是你的app打包后的路徑,[NSBundle mainBundle]resourcePath]就是獲得這個完整的打包后的app路徑,但你的test.txt文件并不在這個目錄,而是在app內部,這時就需要拼接路徑字符串[NSString stringWithFormat:@"%@%@%@",[[NSBundle mainBundle]resourcePath],@"/",path];
---------------------------------------------------------------------------------------------------------------------------------------------
? iOS程序有固定的文件訪問限制,只能在自己的沙盒內。
? UIImage *img=[UIImage imageNamed:@"cellicon.png"];
? 這段代碼從相對路徑加載了一個png圖片資源作為UIImage對象,沒有任何問題。因為它在內部已經偷偷得幫你把路徑轉化為相對路徑了,你還不知道吧!
? 接下來,如果要加載一些自定義格式的文件或者數據,就會出現相對路徑和絕對路徑的問題。比如
? NSFileHandle *fileHandle=[NSFileHandlefile HandleForReadingAtPath:newPath];
? newPath為一個字符串路徑,這里的路徑你卻不能像上面那樣
? NSFileHandle *fileHandle=[NSFileHandle fileHandleForReadingAtPath:@"test.txt"];
? 這樣系統是找不到文件的,因為這里需要的是文件的絕對路徑,而@“test.txt”完全是無效的。
? 這個時候就需要NSBundle的幫忙了,這個類專門用來負責路徑轉化等等功能那。大家都知道ios項目雖然在xcode下可以創建文件夾結構,但是實際上它是沒有文件結構概念的,所以此時假如要加載放在項目目錄下的test.txt文件,完整的代碼應該是這樣
方法1:
? NSString *newPath=[NSString stringWithFormat:@"%@%@%@",[[NSBundle mainBundle]resourcePath],@"/",path];
? NSLog(@"url=%@",newPath);
? NSFileHandle *fileHandle=[NSFileHandlefile HandleForReadingAtPath:newPath];
控制臺輸出app路徑resourcePath:
/Users/zouzouyanghong/Library/Application Support/iPhone Simulator/5.0/Applications/76116A6A-572D-43AE-AE78-17D7A88DCAFC/JFitnessProduct.app
控制臺輸出拼接后完整文件絕對路徑:
/Users/zouzouyanghong/Library/Application Support/iPhone Simulator/5.0/Applications/76116A6A-572D-43AE-AE78-17D7A88DCAFC/JFitnessProduct.app/test.jat
方法2:
? NSString *newPath=[[NSBundle mainBundle] pathForResource:@"test" ofType:@"txt"];
? NSFileHandle *fileHandle=[NSFileHandle fileHandleForReadingAtPath:newPath];
[[NSBundle mainBundle] pathForResource:@"test" ofType:@"jat"];前面的就不再介紹了,pathForResource方法有兩個參數,前面這個為文件名,后面那個ofType就是文件類型,也就是文件后綴。
這里把文件名和后綴分開了,如果這是你得到的是一個完整的文件名如:@“test.txt”,那么你得自己想辦法把文件名和后綴分開了。
@要特別說明,此處的文件后綴是不需要“.”的,如果寫成@“.jat”是錯誤的,加載文件會失敗。
- 前言
- 沙盒機制與文件(一)
- 沙盒機制和文件(二)
- 沙盒機制和文件(三)
- NSBundle介紹以及讀取沙盒文件路徑問題
- 數據持久化(一)-----歸檔 讀寫 文件路徑
- 數據持久化(二)-----Sqlite
- 數據持久化(三)使用第三方類庫FMDB
- 數據持久化(四)之NSUserDefaults
- 數據持久化(五)之CoreData
- 數據持久化(六)之Using CoreData with MagicalRecord
- 數據解析(一)解析XML之系統自帶NSXMLParse類
- 數據解析(二)解析XML之GDataXMLNode
- 數據解析(三)解析JSON-----系統自帶NSJSONSerialization 與 第三方JSONKit
- iOS多線程編程(一)NSThread
- iOS多線程編程(二)NSOperationQueue
- iOS多線程編程(三)Grand Central Dispatch(GCD)詳解
- iOS網絡編程(一)NSURLConnection
- iOS網絡編程(二) 自定義請求網絡類----推薦用于需要請求過程片段數據
- iOS網絡編程(三) 異步加載及緩存圖片---->SDWebImage
- iOS網絡編程(四) 異步加載及緩存圖片-----自定義類
- iOS網絡編程(五) 異步加載及緩存圖片-----EGO
- iOS網絡編程(六) NSURLSession詳解
- iOS網絡編程(7) 第三方開源庫----->AFNetworking