Swift
Swift
Streaming Compression
See more Compression Examples
Compress and decompress using a stream.Chilkat Swift Downloads
func chilkatTest() {
var success: Bool = false
// This example assumes the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
let fac = CkoFileAccess()!
let compress = CkoCompression()!
compress.algorithm = "deflate"
let streamC = CkoStream()!
// This example sets the source and sink of the stream to files.
// A stream can have use other streams as a source or sink,
// or the application can itself be the source/sink by directly
// reading or writing a stream. (See below for an example of this..)
streamC.sourceFile = "qa_data/hamlet.xml"
streamC.sinkFile = "qa_output/hamlet_compressed.dat"
// Compress from source to sink.
success = compress.compressStream(strm: streamC)
if success != true {
print("\(compress.lastErrorText!)")
return
}
print("File-to-file deflate compression successful.")
// Note: The FileSize method returns a signed 32-bit integer. If the file is potentially larger than 2GB, call FileSizeStr instead to return
// the size of the file as a string, then convert to an integer value.
print("Original size = \(fac.fileSize(path: streamC.sourceFile).intValue)")
print("Compressed size = \(fac.fileSize(path: streamC.sinkFile).intValue)")
// Now do file-to-file decompression
let streamD = CkoStream()!
streamD.sourceFile = "qa_output/hamlet_compressed.dat"
streamD.sinkFile = "qa_output/hamlet_restored.xml"
// Decompress from source to sink.
success = compress.decompressStream(strm: streamD)
if success != true {
print("\(compress.lastErrorText!)")
return
}
print("File-to-file deflate decompression successful.")
// Let's double-check to see that the files are equal in size and content:
var bFilesEqual: Bool = fac.fileContentsEqual(path1: streamC.sourceFile, path2: streamD.sinkFile)
if bFilesEqual != true {
print("The output file is not equal to the input file!")
}
else {
print("The file was successfully compressed and decompressed.")
}
// ---------------------------------------------------------------------
// Now let's decompress again, but this time w/ the application reading
// the decompressed data directly from a stream.
let streamA = CkoStream()!
streamA.sourceFile = "qa_output/hamlet_compressed.dat"
// Start decompressing in a background thread.
var task: CkoTask? = compress.decompressStreamAsync(strm: streamA)
success = task!.run()
// Read decompressed data from streamA:
var decompressedText: String?
while (streamA.endOfStream != true) {
if streamA.dataAvailable == true {
decompressedText = streamA.readString()
print("\(decompressedText!)")
}
}
// Let's make sure the background task finished and that the decompress was successful.
// It should already be the case that the task is finished.
while (task!.finished != true) {
task!.sleepMs(numMs: 20)
}
// The decompressor may have finished, but it is possible that data
// remains to be flushed.
if streamA.dataAvailable == true {
decompressedText = streamA.readString()
print("\(decompressedText!)")
}
// Did streamA succeed in reading the entire file?
if task!.taskSuccess != true {
print("async decompress failed:")
print("\(task!.resultErrorText!)")
success = false
}
print("The async decompress was successful.")
}