Swift - 将字节流写入文件

Swift - writing a byte stream to file

我有一个几百字节的字符串和一些 Int32 值。我想将这些逐字逐句地写入文件。

我尝试了很多建议的解决方案并且 none 对我有用。我在文件中得到无关的括号、空格或逗号。

任何人都可以提出一个简单、可靠的解决方案吗?

我以为我的问题很清楚,但是看了评论,我简化了。

如何编写 and/or 将“12345”附加到文件,以便文件包含以下十六进制值:3132333435?

通过编写 NSData 字符串,我可以获得的最佳结果是 <3132333435>。

我可以使用此 link 获得所需的结果:Does swift have a protocol for writing a stream of bytes?,但我无法将数据附加到我创建的文件中。

基本上,问题是将您的数据正确转换为指针以将其指向 NSOutputStream.write。以下扩展应该可以满足您的需求:

extension NSOutputStream {
    enum WriteErrors : ErrorType {
        case UTF8ConversionFailed
    }

    func write(string:String) throws -> Int {
        guard let data = string.dataUsingEncoding(NSUTF8StringEncoding) else {
            throw WriteErrors.UTF8ConversionFailed
        }

        return write(UnsafePointer(data.bytes), maxLength: data.length)
    }

    func write(var i:Int32) throws -> Int {
        return withUnsafePointer(&i) {
            self.write(UnsafePointer([=10=]), maxLength: sizeof(Int32))
        }
    }
}

请注意,将原始二进制数据写入文件是不明智的,您应该首先标准化字节顺序,但我将其留作 reader.

的练习。

我建议使用 NSFileHandle。

我是这样测试的。我从包含单词 "testing" 的文件 ~/Desktop/test.txt 开始。然后我 运行 这个代码:

    let s = "12345"
    let d = s.dataUsingEncoding(NSASCIIStringEncoding)!
    let path = ("~/Desktop/test.txt" as NSString).stringByExpandingTildeInPath
    if let fh = NSFileHandle(forWritingAtPath: path) {
        fh.seekToEndOfFile()
        fh.writeData(d)
        fh.closeFile()
    }

结果是文件现在包含

testing12345

十六进制转储显示底层字节是:

74 65 73 74 69 6E 67 31 32 33 34 35

我相信这就是你所说的你想要实现的目标。

另外,再补充一句:

The best result I can obtain is <3132333435>

这里听起来好像问题仅仅是您不知道如何读取控制台输出。 <> 不在文件中;它们只是数据控制台表示的一部分。最好使用 BBEdit / TextW运行gler 或专用的十六进制转储器来查看文件的实际字节。