2017-02-01 33 views
0

Swiftのファイルから連続して読み込もうとしています。ファイルの下部に連続してデータが追加されます。私はこれを達成するためのInputStreamを使用しようとしている:Swiftで閉じるのではなく、endEncounteredに達するInputStreamを教えてください

func setup() { 
    self.inputStream = InputStream(fileAtPath: "/path/to/file.txt") 

    self.inputStream.delegate = self 
    self.inputStream.schedule(in: RunLoop.current, forMode: .defaultRunLoopMode) 
    self.inputStream.open() 
} 

func stream (_ aStream : Stream, handle eventCode : Stream.Event) { 
    let inStream = aStream as? InputStream 

    switch (eventCode){ 
    case Stream.Event.openCompleted: 
     print("Stream opened") 
     break 
    case Stream.Event.hasBytesAvailable: 
     print("HasBytesAvailable") 
     let bufferSize = 1024 
     var buffer = Array<UInt8>(repeating: 0, count: bufferSize) 

     let bytesRead = inStream?.read(&buffer, maxLength: bufferSize) 

     if bytesRead! >= 0 { 
      let output = NSString(bytes: &buffer, length: bytesRead!, encoding: String.Encoding.utf8.rawValue) 
      print ("\(output!)") 
     } 
     break 
    case Stream.Event.errorOccurred: 
     print("ErrorOccurred") 
     break 
    case Stream.Event.endEncountered: 
     print("EndEncountered") 
     break 
    default: 
     print("unknown") 
    } 
} 

それが現在の.txtファイルの状態の終わりに当たったときしかし、それはendEncounteredを送信し、(理にかなって)読むことをやめます。私はそれを続けるように指示する方法を理解する必要があります。助言がありますか?ありがとう。

+0

は、あなただけの新しいファイルリーダーを作成し、最後に中断したところに開始インデックスを設定できませんでしたか?ストリームには「リセット」メソッドもあります。 – Carcigenicate

答えて

0

私はこれをpipe.fileHandleForReading.waitForDataInBackgroundAndNotify()を使用して別の方法で解決しました。それは他の誰かを助けている場合ここで

は、私が使用するコードです:

override func viewDidLoad() { 
    super.viewDidLoad() 

    NotificationCenter.default.addObserver(
     self, 
     selector: #selector(ViewController.commandOutputNotification(_:)), 
     name: NSNotification.Name.NSFileHandleDataAvailable, 
     object: nil) 

    self.startTasks() 
} 

func startTasks() { 
    self.task = Process() 
    self.task!.terminationHandler = self.commandTerminationHandler 
    let argumentsString = "tail -n 1 -f /path/to/file/file.log" 

    self.task!.launchPath = "/bin/sh" 
    self.task!.arguments = ["-c", argumentsString] 

    let pipe = Pipe() 

    task!.standardOutput = pipe 
    task!.standardError = pipe 

    pipe.fileHandleForReading.waitForDataInBackgroundAndNotify() 

    task!.launch() 
} 

func commandTerminationHandler(_ task: Process) -> Void { 
    // TODO: finish this 
} 

func commandOutputNotification(_ notification: Notification) { 
    let fileHandle = notification.object as! FileHandle 
    let data = fileHandle.availableData 

    if data.count > 0 { 
     processLogData(data:(String.init(data: data, encoding: String.Encoding.utf8))) 
     fileHandle.waitForDataInBackgroundAndNotify() 
    } 
} 

func processLogData(data:String?) { 
    // Handle data String here 
} 
関連する問題