﻿package main

import (
	"compress/flate"
	"fmt"
	"os"
	"time"
)

func main() {


	dst_file, e := os.Create("main/flate/flate_dst.txt")
	checke_err_flate(e)
	//--------------------------------------------------------------
	// NewWriter返回给定级别的新Writer压缩数据。
	//在zlib之后，级别的范围是1（BestSpeed）到9（BestCompression）；
	//较高的级别通常运行较慢，但压缩程度更高。 级别0（NoCompression）不尝试任何压缩； 它仅添加必要的DEFLATE帧。
	// -1级（DefaultCompression）使用默认压缩级别。
	// -2级（HuffmanOnly）仅使用Huffman压缩，可以对所有类型的输入进行非常快速的压缩，但是会牺牲可观的压缩效率。
	//如果级别在[-2，9]范围内，则返回的错误为nil。
	//否则返回的错误将为非零。
	writer, e := flate.NewWriter(dst_file, -1)
	checke_err_flate(e)

	src_file, e := os.Open("main/flate/flate.txt")
	fileInfo, e := src_file.Stat()
	checke_err_flate(e)

	src_byte:=make([]byte,fileInfo.Size())
	i, e := src_file.Read(src_byte)
	checke_err_flate(e)

	fmt.Println("没压缩之前的字节数是：",i)
	// Write将data写入w，最终将压缩的数据形式写入其基础写入器。
	n, e := writer.Write(src_byte)
	checke_err_flate(e)
	fmt.Println("装载压缩文件数据的字节切片长度是：",n)

	// Flush将所有未决数据刷新到基础写入器。
	//它主要用于压缩网络协议中，以确保远程读取器具有足够的数据来重构数据包。
	//直到写入数据后，刷新才会返回。
	//当没有待处理的数据时调用Flush仍然会使Writer发出至少4个字节的同步标记。
	//如果基础编写器返回错误，则Flush返回该错误。
	//在zlib库的术语中，Flush等效于Z_SYNC_FLUSH。
	e = writer.Flush()
	checke_err_flate(e)

	// Close刷新并关闭编写器。但是这里的刷新跟上面的刷新是不一样的，千万别少了上面的刷新步骤，它是必不可少的，否则会导致下面解压读取字节时候出错！
	//这也体现了go并不是所有的close的实现里面都会包含flush()方法的！这也体现了go有些api非常的不统一！无可置疑的是，go大部分的close中都会包含flush,目前发现这个是不包含的！
	e = writer.Close()
	checke_err_flate(e)
	//e= dst_file.Close()
	//checke_err_flate(e)
	// Seek将下一次在文件上读取或写入的偏移量设置为偏移量，根据whence进行解释：0表示相对于文件原点，1表示相对于当前偏移量，2表示相对于末尾。
	//返回新的偏移量和错误（如果有）。
	//未指定使用O_APPEND打开的文件的Seek行为。
	ret, e := dst_file.Seek(0, 0)
	checke_err_flate(e)
	fmt.Println("移动文件指针偏移量到：",ret)

	//dst_file, e := os.Open("main/flate/flate_dst.txt")//事实上我们不用重新打开第二次了，我们上面的代码可以重置文件读写指针即可
	info, e := dst_file.Stat()
	checke_err_flate(e)
	dst_byte:=make([]byte,info.Size())
	n2, e := dst_file.Read(dst_byte)
	if e != nil {
		fmt.Println("发生了错误：",e)
	}

	fmt.Println("压缩后的字节数是：",n2)
	fmt.Println("压缩后的字节数据是：",dst_byte)
	fmt.Println("压缩后的字符串数据是：",string(dst_byte))
	//e = dst_file.Close()
	//if e != nil {
	//	fmt.Println("发生了错误0000：",e)
	//}
	fmt.Println("----------------解压缩---------------------")
	//上面的file文件我还没关闭。便于下面进行读取。只需要重置文件读写指针即可。这样的话不用打开多次文件。

	// NewReader返回一个新的ReadCloser，可用于读取r的未压缩版本。
	//如果r还没有实现io.ByteReader，则解压缩器可能会从r读取比所需更多的数据。
	//阅读完成后，调用方有责任在ReadCloser上调用Close。
	// NewReader返回的ReadCloser也实现了Resetter。
	time.Sleep(1e9)
	ret2, e := dst_file.Seek(0, 0)
	if e != nil {
		fmt.Println("发生了错误111：",e)
	}
	fmt.Println("移动文件指针偏移量到：",ret2)
//--------------------------------------------------------------
//	dst_file1, e := os.Open("main/flate/flate_dst.txt")
//	checke_err_flate(e)

	reader := flate.NewReader(dst_file)
	dst_read_byte:=make([]byte,900)//因为不知道解压后的数据字节数目是多少，所以我们必须给个足够大的切片空间

	n3, e1 := reader.Read(dst_read_byte)
	if e1 != nil {
		fmt.Println("发生了错误222：",e1)
	}

	fmt.Println("解压后的字节数是：",n3)
	fmt.Println("解压后的字节是：",dst_read_byte)
	fmt.Println("解压后的字符串是：",string(dst_read_byte))

	defer func() {
		i2:= reader.Close()
		checke_err_flate(i2)
		i2 = dst_file.Close()
		checke_err_flate(i2)
	}()
	/*所有输出如下：
		没压缩之前的字节数是： 625
		装载压缩文件数据的字节切片长度是： 625
		移动文件指针偏移量到： 0
		压缩后的字节数是： 449
		压缩后的字节数据是： [100 145 221 114 154 92 20 134 207 191 153 239 30 50 185 179 36 55 178 65 84 36 40 38 241 7 129 214 159 138 90 27 131 29 211 116 3 27 184 24 215 90 123 115 196 45 116 118 205 244 32 57 127 103 61 239 122 222 38 175 110 110 239 84 92 73 239 32 123 51 26 85 152 69 117 171 64 51 151 145 128 172 211 8 87 150 3 12 11 124 116 85 92 209 36 149 129 165 99 47 43 244 28 220 63 66 241 4 156 209 244 13 120 95 206 99 149 188 66 206 32 181 207 204 172 205 111 144 133 151 140 12 44 249 252 12 156 161 215 199 108 68 126 114 117 125 5 197 64 29 91 228 196 181 241 116 117 125 102 38 150 54 249 165 180 222 62 99 113 189 69 39 164 81 66 174 33 3 171 222 204 136 39 40 60 58 62 0 207 81 48 220 222 227 240 225 61 28 126 165 95 198 153 153 138 25 170 181 84 27 67 247 210 240 184 17 174 170 102 50 154 147 159 144 19 99 54 194 177 115 102 230 255 255 1 239 67 222 254 231 66 7 239 127 98 88 232 234 131 4 170 47 192 115 72 123 138 181 33 157 171 100 140 97 137 135 13 164 139 75 23 185 206 112 103 40 214 214 130 108 159 162 4 251 139 122 213 161 40 195 40 107 132 139 67 151 22 191 49 218 81 121 210 223 216 223 33 11 26 225 66 58 167 168 167 37 246 210 15 160 11 133 118 75 200 171 15 148 186 219 69 111 162 150 46 58 59 237 250 115 135 224 85 11 155 164 90 82 212 67 47 81 173 2 127 24 52 136 209 62 190 111 185 46 65 4 152 86 116 10 241 224 99 180 147 129 133 67 75 110 251 245 244 165 94 249 192 157 70 184 53 11 84 213 69 207 71 97 234 203 127 111 214 108 72 124 136 98 44 237 142 158 206 89 208 233 40 139 41 30 5 100 1 122 123 242 19 224 12 248 254 50 206 153 153 55 183 119 127 0 0 0 255 255 1 0 0 255 255]
		��K��pg(�ւl����zա(�(k��C��1�Qy����!�B:���%����vKȫ���Eo��.:;��s��U��ZR�C/Q�4��>�o�.A�Vt
		��c����CKn����^���F�5T�E�Ga��o�lH|�b,펞�Y��(�)dz{����2Ι�7�w   ��  ��
		----------------解压缩---------------------
		移动文件指针偏移量到： 0
		解压后的字节数是： 625
		解压后的字节是： [239 187 191 97 98 99 232 165 191 231 143 173 231 137 153 230 148 191 229 186 156 233 131 189 229 130 187 231 156 188 228 186 134 239 188 140 231 190 142 229 155 189 229 146 140 232 165 191 230 150 185 231 154 132 230 148 191 229 174 162 229 143 138 229 170 146 228 189 147 228 184 128 230 151 182 228 184 141 231 159 165 232 175 180 228 187 128 228 185 136 227 128 130 233 130 163 228 186 155 229 170 146 228 189 147 231 154 132 231 172 172 228 184 128 229 143 141 229 186 148 230 152 175 32 34 32 228 189 142 232 176 131 230 138 165 233 129 147 32 34 227 128 130 229 190 136 230 152 190 231 132 182 239 188 140 231 190 142 229 155 189 229 146 140 232 165 191 230 150 185 229 164 167 229 138 155 230 148 175 230 140 129 231 154 132 233 166 153 230 184 175 229 188 143 230 176 145 228 184 187 229 188 128 229 167 139 229 144 145 232 165 191 230 150 185 229 155 158 230 181 129 227 128 130 232 128 129 232 131 161 232 166 129 232 175 180 228 184 128 229 143 165 239 188 140 232 191 153 231 156 159 230 152 175 230 138 165 229 186 148 229 149 138 227 128 130 13 10 228 184 141 228 187 133 232 165 191 231 143 173 231 137 153 239 188 140 232 139 177 229 155 189 231 154 132 231 142 175 228 191 157 228 184 187 228 185 137 232 128 133 228 185 159 232 175 149 229 155 190 229 173 166 228 185 160 233 166 153 230 184 175 231 164 186 229 168 129 232 128 133 231 154 132 230 136 152 230 156 175 229 141 160 233 162 134 230 156 186 229 156 186 239 188 140 229 144 140 230 160 183 229 156 168 230 190 179 229 164 167 229 136 169 228 186 154 239 188 140 228 185 159 230 156 137 228 184 128 230 137 185 231 142 175 228 191 157 228 184 187 228 185 137 232 128 133 232 175 149 229 155 190 230 168 161 228 187 191 233 166 153 230 184 175 231 164 186 229 168 129 232 128 133 233 135 135 229 143 150 232 161 140 229 138 168 227 128 130 233 166 153 230 184 175 231 164 186 229 168 129 232 128 133 231 154 132 230 154 180 229 138 155 230 150 185 229 188 143 230 156 137 229 143 175 232 131 189 229 171 129 230 142 165 229 136 176 232 165 191 230 150 185 231 164 190 228 188 154 229 185 191 230 179 155 229 173 152 229 156 168 231 154 132 229 144 132 231 167 141 233 151 174 233 162 152 228 184 138 239 188 140 233 128 154 232 191 135 229 143 152 229 188 130 231 154 132 230 150 185 229 188 143 233 128 144 230 184 144 229 188 149 231 136 134 227 128 130 229 138 160 230 179 176 231 189 151 229 176 188 228 186 154 229 143 170 230 152 175 228 184 128 228 184 170 229 188 128 229 167 139 227 128 130 97 98 99 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
		解压后的字符串是： ﻿abc西班牙政府都傻眼了，美国和西方的政客及媒体一时不知说什么。那些媒体的第一反应是 " 低调报道 "。很显然，美国和西方大力支持的香港式民主开始向西方回流。老胡要说一句，这真是报应啊。
		不仅西班牙，英国的环保主义者也试图学习香港示威者的战术占领机场，同样在澳大利亚，也有一批环保主义者试图模仿香港示威者采取行动。香港示威者的暴力方式有可能嫁接到西方社会广泛存在的各种问题上，通过变异的方式逐渐引爆。加泰罗尼亚只是一个开始。abc

	 */

}
func checke_err_flate(err error)  {
	if err != nil {
		fmt.Println(err)
	}

}