Go
Go
Streaming Compression
See more Compression Examples
Compress and decompress using a stream.Chilkat Go Downloads
success := false
// This example assumes the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
fac := chilkat.NewFileAccess()
compress := chilkat.NewCompression()
compress.SetAlgorithm("deflate")
streamC := chilkat.NewStream()
// 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.SetSourceFile("qa_data/hamlet.xml")
streamC.SetSinkFile("qa_output/hamlet_compressed.dat")
// Compress from source to sink.
success = compress.CompressStream(streamC)
if success != true {
fmt.Println(compress.LastErrorText())
fac.DisposeFileAccess()
compress.DisposeCompression()
streamC.DisposeStream()
return
}
fmt.Println("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.
fmt.Println("Original size = ", fac.FileSize(streamC.SourceFile()))
fmt.Println("Compressed size = ", fac.FileSize(streamC.SinkFile()))
// Now do file-to-file decompression
streamD := chilkat.NewStream()
streamD.SetSourceFile("qa_output/hamlet_compressed.dat")
streamD.SetSinkFile("qa_output/hamlet_restored.xml")
// Decompress from source to sink.
success = compress.DecompressStream(streamD)
if success != true {
fmt.Println(compress.LastErrorText())
fac.DisposeFileAccess()
compress.DisposeCompression()
streamC.DisposeStream()
streamD.DisposeStream()
return
}
fmt.Println("File-to-file deflate decompression successful.")
// Let's double-check to see that the files are equal in size and content:
bFilesEqual := fac.FileContentsEqual(streamC.SourceFile(),streamD.SinkFile())
if bFilesEqual != true {
fmt.Println("The output file is not equal to the input file!")
} else {
fmt.Println("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.
streamA := chilkat.NewStream()
streamA.SetSourceFile("qa_output/hamlet_compressed.dat")
// Start decompressing in a background thread.
c := make(chan *chilkat.Task)
go compress.DecompressStreamAsync(streamA,c)
task := <-c
// Read decompressed data from streamA:
var decompressedText *string = new(string)
for (streamA.EndOfStream() != true) {
if streamA.DataAvailable() == true {
decompressedText = streamA.ReadString()
fmt.Println(*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.
for (task.Finished() != true) {
task.SleepMs(20)
}
// The decompressor may have finished, but it is possible that data
// remains to be flushed.
if streamA.DataAvailable() == true {
decompressedText = streamA.ReadString()
fmt.Println(*decompressedText)
}
// Did streamA succeed in reading the entire file?
if task.TaskSuccess() != true {
fmt.Println("async decompress failed:")
fmt.Println(task.ResultErrorText())
success = false
}
fmt.Println("The async decompress was successful.")
fac.DisposeFileAccess()
compress.DisposeCompression()
streamC.DisposeStream()
streamD.DisposeStream()
streamA.DisposeStream()
task.DisposeTask()