Read and write a String from text file

前端 未结 21 1421
别跟我提以往
别跟我提以往 2020-11-22 00:02

I need to read and write data to/from a text file, but I haven\'t been able to figure out how.

I found this sample code in the Swift\'s iBook, but I still don\'t kno

相关标签:
21条回答
  • 2020-11-22 00:32

    Xcode 8.x • Swift 3.x or later

    do {
        // get the documents folder url
        if let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
            // create the destination url for the text file to be saved
            let fileURL = documentDirectory.appendingPathComponent("file.txt")
            // define the string/text to be saved
            let text = "Hello World !!!"
            // writing to disk 
            // Note: if you set atomically to true it will overwrite the file if it exists without a warning
            try text.write(to: fileURL, atomically: false, encoding: .utf8)
            print("saving was successful")
            // any posterior code goes here
            // reading from disk
            let savedText = try String(contentsOf: fileURL)
            print("savedText:", savedText)   // "Hello World !!!\n"
        }
    } catch {
        print("error:", error)
    }
    
    0 讨论(0)
  • 2020-11-22 00:32

    New simpler and recommended method: Apple recommends using URLs for filehandling and the other solutions here seem deprecated (see comments below). The following is the new simple way of reading and writing with URL's (don't forget to handle the possible URL errors):

    Swift 5+, 4 and 3.1

    import Foundation  // Needed for those pasting into Playground
    
    let fileName = "Test"
    let dir = try? FileManager.default.url(for: .documentDirectory, 
          in: .userDomainMask, appropriateFor: nil, create: true)
    
    // If the directory was found, we write a file to it and read it back
    if let fileURL = dir?.appendingPathComponent(fileName).appendingPathExtension("txt") {
    
        // Write to the file named Test
        let outString = "Write this text to the file"
        do {
            try outString.write(to: fileURL, atomically: true, encoding: .utf8)
        } catch {
            print("Failed writing to URL: \(fileURL), Error: " + error.localizedDescription)
        }
    
        // Then reading it back from the file
        var inString = ""
        do {
            inString = try String(contentsOf: fileURL)
        } catch {
            print("Failed reading from URL: \(fileURL), Error: " + error.localizedDescription)
        }
        print("Read from the file: \(inString)")
    }
    
    0 讨论(0)
  • 2020-11-22 00:34

    Assuming that you have moved your text file data.txt to your Xcode-project (Use drag'n'drop and check "Copy files if necessary") you can do the following just like in Objective-C:

    let bundle = NSBundle.mainBundle()
    let path = bundle.pathForResource("data", ofType: "txt")        
    let content = NSString.stringWithContentsOfFile(path) as String
    
    println(content) // prints the content of data.txt
    

    Update:
    For reading a file from Bundle (iOS) you can use:

    let path = NSBundle.mainBundle().pathForResource("FileName", ofType: "txt")
    var text = String(contentsOfFile: path!, encoding: NSUTF8StringEncoding, error: nil)!
    println(text)
    

    Update for Swift 3:

    let path = Bundle.main.path(forResource: "data", ofType: "txt") // file path for file "data.txt"
    var text = String(contentsOfFile: path!, encoding: NSUTF8StringEncoding, error: nil)!
    

    For Swift 5

    let path = Bundle.main.path(forResource: "ListAlertJson", ofType: "txt") // file path for file "data.txt"
    let string = try String(contentsOfFile: path!, encoding: String.Encoding.utf8)
    
    0 讨论(0)
  • 2020-11-22 00:34

    Xcode 8, Swift 3 way to read file from the app bundle:

    if let path = Bundle.main.path(forResource: filename, ofType: nil) {
        do {
            let text = try String(contentsOfFile: path, encoding: String.Encoding.utf8)
            print(text)
        } catch {
            printError("Failed to read text from \(filename)")
        }
    } else {
        printError("Failed to load file from app bundle \(filename)")
    } 
    

    Here's a convenient copy and paste Extension

    public extension String {
        func contentsOrBlank()->String {
            if let path = Bundle.main.path(forResource:self , ofType: nil) {
                do {
                    let text = try String(contentsOfFile:path, encoding: String.Encoding.utf8)
                    return text
                    } catch { print("Failed to read text from bundle file \(self)") }
            } else { print("Failed to load file from bundle \(self)") }
            return ""
        }
        }
    

    For example

    let t = "yourFile.txt".contentsOrBlank()
    

    You almost always want an array of lines:

    let r:[String] = "yourFile.txt"
         .contentsOrBlank()
         .characters
         .split(separator: "\n", omittingEmptySubsequences:ignore)
         .map(String.init)
    
    0 讨论(0)
  • 2020-11-22 00:36

    Simplest way to read a file in Swift > 4.0

     let path = Bundle.main.path(forResource: "data", ofType: "txt") // file path for file "data.txt"
            do {
                var text = try String(contentsOfFile: path!)
            }
            catch(_){print("error")}
        }
    
    0 讨论(0)
  • I had to recode like this:

    let path = NSBundle.mainBundle().pathForResource("Output_5", ofType: "xml")
    let text = try? NSString(contentsOfFile: path! as String, encoding: NSUTF8StringEncoding)
    print(text)
    
    0 讨论(0)
提交回复
热议问题