如何读取服务器上的文本文件?

时间:2015-08-22 09:42:06

标签: ios swift

我使用此代码读取本地文本文件,它的工作!

class StreamReader  {   
let encoding : UInt
let chunkSize : Int

var fileHandle : NSFileHandle!
let buffer : NSMutableData!
let delimData : NSData!
var atEof : Bool = false

init?(path: String, delimiter: String = "\n", encoding : UInt = NSUTF8StringEncoding, chunkSize : Int = 4096) {
    self.chunkSize = chunkSize
    self.encoding = encoding

    if let fileHandle = NSFileHandle(forReadingAtPath: path),
        delimData = delimiter.dataUsingEncoding(encoding),
        buffer = NSMutableData(capacity: chunkSize)
    {
        self.fileHandle = fileHandle
        self.delimData = delimData
        self.buffer = buffer
    } else {
        self.fileHandle = nil
        self.delimData = nil
        self.buffer = nil
        return nil
    }
}

deinit {
    self.close()
}

/// Return next line, or nil on EOF.
func nextLine() -> String? {
    precondition(fileHandle != nil, "Attempt to read from closed file")

    if atEof {
        return nil
    }

    // Read data chunks from file until a line delimiter is found:
    var range = buffer.rangeOfData(delimData, options: nil, range: NSMakeRange(0, buffer.length))
    while range.location == NSNotFound {
        let tmpData = fileHandle.readDataOfLength(chunkSize)
        if tmpData.length == 0 {
            // EOF or read error.
            atEof = true
            if buffer.length > 0 {
                // Buffer contains last line in file (not terminated by delimiter).
                let line = NSString(data: buffer, encoding: encoding)

                buffer.length = 0
                return line as String?
            }
            // No more lines.
            return nil
        }
        buffer.appendData(tmpData)
        range = buffer.rangeOfData(delimData, options: nil, range: NSMakeRange(0, buffer.length))
    }

    // Convert complete line (excluding the delimiter) to a string:
    let line = NSString(data: buffer.subdataWithRange(NSMakeRange(0, range.location)),
        encoding: encoding)
    // Remove line (and the delimiter) from the buffer:
    buffer.replaceBytesInRange(NSMakeRange(0, range.location + range.length), withBytes: nil, length: 0)

    return line as String?
}

/// Start reading from the beginning of file.
func rewind() -> Void {
    fileHandle.seekToFileOffset(0)
    buffer.length = 0
    atEof = false
}

/// Close the underlying file. No reading must be done after calling this method.
func close() -> Void {
    fileHandle?.closeFile()
    fileHandle = nil
}
}

用法

var path_up1 = "/Users/rrr/Desktop/up/1.txt"
 if let aStreamReader = StreamReader(path: path_up1) {
                while let line = aStreamReader.nextLine() {
                    println(line)
    }
    }

但我必须阅读服务器上的文件(例如:http://www.1111.com/1.txt)。

帮助我,PLZ!

1 个答案:

答案 0 :(得分:1)

您可以通过NSURLConnection

直接阅读该文件
let url = NSURL(string:"http://www.1111.com/1.txt")!
let request = NSURLRequest(URL: url)
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.currentQueue()) { (response, data, error) -> Void in
  if error != nil {
    println(error!)
  } else {
    if let textFile = NSString(data: data, encoding: NSUTF8StringEncoding) {
      println(textFile)
    }
  }
}

该示例假定文本文件是UTF-8编码的。

或者,如果您想要按顺序读取数据,请实施NSURLConnection的委托方法并使用init?(request:delegate:startImmediately:)