tests: Remove references to io/ioutil (#652)

As the go doc says: "Deprecated: As of Go 1.16, the same functionality is
now provided by package io or package os, and those implementations should
be preferred in new code."

Co-authored-by: Klaus Post <klauspost@gmail.com>
diff --git a/flate/deflate_test.go b/flate/deflate_test.go
index 7c1ed0d..02e2cd4 100644
--- a/flate/deflate_test.go
+++ b/flate/deflate_test.go
@@ -9,7 +9,7 @@
 	"bytes"
 	"fmt"
 	"io"
-	"io/ioutil"
+	"os"
 	"reflect"
 	"strings"
 	"sync"
@@ -296,7 +296,7 @@
 
 	// stream should work for ordinary reader too
 	r = NewReader(buf1)
-	out, err = ioutil.ReadAll(r)
+	out, err = io.ReadAll(r)
 	if err != nil {
 		t.Errorf("testSync: read: %s", err)
 		return
@@ -324,7 +324,7 @@
 		t.Logf("level: %d - Size:%.2f%%, %d b\n", level, float64(buffer.Len()*100)/float64(limit), buffer.Len())
 	}
 	r := NewReader(&buffer)
-	out, err := ioutil.ReadAll(r)
+	out, err := io.ReadAll(r)
 	if err != nil {
 		t.Errorf("read: %s", err)
 		return
@@ -380,7 +380,7 @@
 
 func TestDeflateInflateString(t *testing.T) {
 	for _, test := range deflateInflateStringTests {
-		gold, err := ioutil.ReadFile(test.filename)
+		gold, err := os.ReadFile(test.filename)
 		if err != nil {
 			t.Error(err)
 		}
@@ -417,7 +417,7 @@
 	w.Close()
 
 	r := NewReaderDict(&b, []byte(dict))
-	data, err := ioutil.ReadAll(r)
+	data, err := io.ReadAll(r)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -463,7 +463,7 @@
 		t.Logf("test disabled with -short")
 		return
 	}
-	w, err := NewWriter(ioutil.Discard, 1)
+	w, err := NewWriter(io.Discard, 1)
 	if err != nil {
 		t.Fatalf("NewWriter: %v", err)
 	}
@@ -484,7 +484,7 @@
 		if testing.Short() && level > 1 {
 			break
 		}
-		w, err := NewWriter(ioutil.Discard, level)
+		w, err := NewWriter(io.Discard, level)
 		if err != nil {
 			t.Fatalf("NewWriter: %v", err)
 		}
@@ -492,9 +492,9 @@
 		for i := 0; i < 1024; i++ {
 			w.Write(buf)
 		}
-		w.Reset(ioutil.Discard)
+		w.Reset(io.Discard)
 
-		wref, err := NewWriter(ioutil.Discard, level)
+		wref, err := NewWriter(io.Discard, level)
 		if err != nil {
 			t.Fatalf("NewWriter: %v", err)
 		}
@@ -646,7 +646,7 @@
 				}
 
 				r := NewReader(buf)
-				got, err := ioutil.ReadAll(r)
+				got, err := io.ReadAll(r)
 				if err != nil {
 					t.Errorf("i=%d, firstN=%d, flush=%t: ReadAll: %v", i, firstN, flush, err)
 					continue
diff --git a/flate/flate_test.go b/flate/flate_test.go
index 182909a..9817efe 100644
--- a/flate/flate_test.go
+++ b/flate/flate_test.go
@@ -14,7 +14,8 @@
 	"compress/flate"
 	"encoding/hex"
 	"fmt"
-	"io/ioutil"
+	"io"
+	"os"
 	"testing"
 )
 
@@ -71,7 +72,7 @@
 
 func TestRegressions(t *testing.T) {
 	// Test fuzzer regressions
-	data, err := ioutil.ReadFile("testdata/regression.zip")
+	data, err := os.ReadFile("testdata/regression.zip")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -84,7 +85,7 @@
 		if err != nil {
 			t.Fatal(err)
 		}
-		data1, err := ioutil.ReadAll(data)
+		data1, err := io.ReadAll(data)
 		if err != nil {
 			t.Fatal(err)
 		}
@@ -111,7 +112,7 @@
 						t.Error(err)
 					}
 					fr1 := NewReader(buf)
-					data2, err := ioutil.ReadAll(fr1)
+					data2, err := io.ReadAll(fr1)
 					if err != nil {
 						t.Error(err)
 					}
@@ -133,7 +134,7 @@
 						t.Error(err)
 					}
 					fr1 = flate.NewReader(buf)
-					data2, err = ioutil.ReadAll(fr1)
+					data2, err = io.ReadAll(fr1)
 					if err != nil {
 						t.Error(err)
 					}
@@ -158,7 +159,7 @@
 				}
 				t.Log(buf.Len())
 				fr1 := NewReader(buf)
-				data2, err := ioutil.ReadAll(fr1)
+				data2, err := io.ReadAll(fr1)
 				if err != nil {
 					t.Error(err)
 				}
@@ -346,7 +347,7 @@
 		if err != nil {
 			t.Fatal(err)
 		}
-		data, err = ioutil.ReadAll(NewReader(bytes.NewReader(data)))
+		data, err = io.ReadAll(NewReader(bytes.NewReader(data)))
 		if tc.want == "fail" {
 			if err == nil {
 				t.Errorf("#%d (%s): got nil error, want non-nil", i, tc.desc)
diff --git a/flate/huffman_bit_writer_test.go b/flate/huffman_bit_writer_test.go
index 60aef15..dfb93e3 100644
--- a/flate/huffman_bit_writer_test.go
+++ b/flate/huffman_bit_writer_test.go
@@ -8,7 +8,6 @@
 	"bytes"
 	"flag"
 	"fmt"
-	"io/ioutil"
 	"os"
 	"path/filepath"
 	"strings"
@@ -40,7 +39,7 @@
 }
 
 func testBlockHuff(t *testing.T, in, out string) {
-	all, err := ioutil.ReadFile(in)
+	all, err := os.ReadFile(in)
 	if err != nil {
 		t.Error(err)
 		return
@@ -52,7 +51,7 @@
 	bw.flush()
 	got := buf.Bytes()
 
-	want, err := ioutil.ReadFile(out)
+	want, err := os.ReadFile(out)
 	if err != nil && !*update {
 		t.Error(err)
 		return
@@ -63,7 +62,7 @@
 		if *update {
 			if in != out {
 				t.Logf("Updating %q", out)
-				if err := ioutil.WriteFile(out, got, 0666); err != nil {
+				if err := os.WriteFile(out, got, 0666); err != nil {
 					t.Error(err)
 				}
 				return
@@ -73,7 +72,7 @@
 		}
 
 		t.Errorf("%q != %q (see %q)", in, out, in+".got")
-		if err := ioutil.WriteFile(in+".got", got, 0666); err != nil {
+		if err := os.WriteFile(in+".got", got, 0666); err != nil {
 			t.Error(err)
 		}
 		return
@@ -88,7 +87,7 @@
 	got = buf.Bytes()
 	if !bytes.Equal(got, want) {
 		t.Errorf("after reset %q != %q (see %q)", in, out, in+".reset.got")
-		if err := ioutil.WriteFile(in+".reset.got", got, 0666); err != nil {
+		if err := os.WriteFile(in+".reset.got", got, 0666); err != nil {
 			t.Error(err)
 		}
 		return
@@ -199,7 +198,7 @@
 	if *update {
 		if test.input != "" {
 			t.Logf("Updating %q", test.want)
-			input, err := ioutil.ReadFile(test.input)
+			input, err := os.ReadFile(test.input)
 			if err != nil {
 				t.Error(err)
 				return
@@ -229,12 +228,12 @@
 
 	if test.input != "" {
 		t.Logf("Testing %q", test.want)
-		input, err := ioutil.ReadFile(test.input)
+		input, err := os.ReadFile(test.input)
 		if err != nil {
 			t.Error(err)
 			return
 		}
-		want, err := ioutil.ReadFile(test.want)
+		want, err := os.ReadFile(test.want)
 		if err != nil {
 			t.Error(err)
 			return
@@ -246,7 +245,7 @@
 		got := buf.Bytes()
 		if !bytes.Equal(got, want) {
 			t.Errorf("writeBlock did not yield expected result for file %q with input. See %q", test.want, test.want+gotSuffix)
-			if err := ioutil.WriteFile(test.want+gotSuffix, got, 0666); err != nil {
+			if err := os.WriteFile(test.want+gotSuffix, got, 0666); err != nil {
 				t.Error(err)
 			}
 		}
@@ -260,7 +259,7 @@
 		got = buf.Bytes()
 		if !bytes.Equal(got, want) {
 			t.Errorf("reset: writeBlock did not yield expected result for file %q with input. See %q", test.want, test.want+".reset"+gotSuffix)
-			if err := ioutil.WriteFile(test.want+".reset"+gotSuffix, got, 0666); err != nil {
+			if err := os.WriteFile(test.want+".reset"+gotSuffix, got, 0666); err != nil {
 				t.Error(err)
 			}
 			return
@@ -269,7 +268,7 @@
 		testWriterEOF(t, "wb", test, true)
 	}
 	t.Logf("Testing %q", test.wantNoInput)
-	wantNI, err := ioutil.ReadFile(test.wantNoInput)
+	wantNI, err := os.ReadFile(test.wantNoInput)
 	if err != nil {
 		t.Error(err)
 		return
@@ -281,7 +280,7 @@
 	got := buf.Bytes()
 	if !bytes.Equal(got, wantNI) {
 		t.Errorf("writeBlock did not yield expected result for file %q with input. See %q", test.wantNoInput, test.wantNoInput+gotSuffix)
-		if err := ioutil.WriteFile(test.wantNoInput+gotSuffix, got, 0666); err != nil {
+		if err := os.WriteFile(test.wantNoInput+gotSuffix, got, 0666); err != nil {
 			t.Error(err)
 		}
 	} else if got[0]&1 == 1 {
@@ -299,7 +298,7 @@
 	got = buf.Bytes()
 	if !bytes.Equal(got, wantNI) {
 		t.Errorf("reset: writeBlock did not yield expected result for file %q without input. See %q", test.wantNoInput, test.wantNoInput+".reset"+gotSuffix)
-		if err := ioutil.WriteFile(test.wantNoInput+".reset"+gotSuffix, got, 0666); err != nil {
+		if err := os.WriteFile(test.wantNoInput+".reset"+gotSuffix, got, 0666); err != nil {
 			t.Error(err)
 		}
 		return
@@ -340,7 +339,7 @@
 	var input []byte
 	if useInput {
 		var err error
-		input, err = ioutil.ReadFile(test.input)
+		input, err = os.ReadFile(test.input)
 		if err != nil {
 			t.Error(err)
 			return
diff --git a/flate/inflate_test.go b/flate/inflate_test.go
index f907602..aac29c6 100644
--- a/flate/inflate_test.go
+++ b/flate/inflate_test.go
@@ -8,7 +8,6 @@
 	"bytes"
 	"crypto/rand"
 	"io"
-	"io/ioutil"
 	"strconv"
 	"strings"
 	"testing"
@@ -59,7 +58,7 @@
 	for i, v := range vectors {
 		r := strings.NewReader(v.input)
 		zr := NewReader(r)
-		b, err := ioutil.ReadAll(zr)
+		b, err := io.ReadAll(zr)
 		if err != io.ErrUnexpectedEOF {
 			t.Errorf("test %d, error mismatch: got %v, want io.ErrUnexpectedEOF", i, err)
 		}
@@ -143,7 +142,7 @@
 		buf := bytes.NewReader(data)
 		r := NewReader(buf)
 
-		_, err := io.Copy(ioutil.Discard, r)
+		_, err := io.Copy(io.Discard, r)
 		if (test.n == 0 && err == nil) || (test.n != 0 && err != nil) {
 			t.Logf("%q: OK:", test.id)
 			t.Logf(" - got %v", err)
@@ -172,7 +171,7 @@
 		buf := bytes.NewReader(data)
 		r := NewReader(buf)
 
-		_, err := io.Copy(ioutil.Discard, r)
+		_, err := io.Copy(io.Discard, r)
 		if test.err == (err != nil) {
 			t.Logf("%q: OK:", test.id)
 			t.Logf(" - got %v", err)
@@ -256,7 +255,7 @@
 
 	dec := NewReader(bytes.NewBuffer(buf))
 	// ReadAll does not use WriteTo, but we wrap it in a NopCloser to be sure.
-	readall, err := ioutil.ReadAll(ioutil.NopCloser(dec))
+	readall, err := io.ReadAll(io.NopCloser(dec))
 	if err != nil {
 		t.Fatal(err)
 	}
diff --git a/flate/reader_test.go b/flate/reader_test.go
index 5543964..bc83c1f 100644
--- a/flate/reader_test.go
+++ b/flate/reader_test.go
@@ -7,7 +7,7 @@
 import (
 	"bytes"
 	"io"
-	"io/ioutil"
+	"os"
 	"runtime"
 	"strings"
 	"testing"
@@ -16,7 +16,7 @@
 func TestNlitOutOfRange(t *testing.T) {
 	// Trying to decode this bogus flate data, which has a Huffman table
 	// with nlit=288, should not panic.
-	io.Copy(ioutil.Discard, NewReader(strings.NewReader(
+	io.Copy(io.Discard, NewReader(strings.NewReader(
 		"\xfc\xfe\x36\xe7\x5e\x1c\xef\xb3\x55\x58\x77\xb6\x56\xb5\x43\xf4"+
 			"\x6f\xf2\xd2\xe6\x3d\x99\xa0\x85\x8c\x48\xeb\xf8\xda\x83\x04\x2a"+
 			"\x75\xc4\xf8\x0f\x12\x11\xb9\xb4\x4b\x09\xa0\xbe\x8b\x91\x4c")))
@@ -43,7 +43,7 @@
 	b.ReportAllocs()
 	b.StopTimer()
 	b.SetBytes(int64(n))
-	buf0, err := ioutil.ReadFile(testfiles[testfile])
+	buf0, err := os.ReadFile(testfiles[testfile])
 	if err != nil {
 		b.Fatal(err)
 	}
@@ -70,7 +70,7 @@
 	res := r.(Resetter)
 	for i := 0; i < b.N; i++ {
 		res.Reset(bytes.NewReader(buf1), nil)
-		io.Copy(ioutil.Discard, r)
+		io.Copy(io.Discard, r)
 	}
 }
 
diff --git a/flate/token_test.go b/flate/token_test.go
index a8066c3..f634625 100644
--- a/flate/token_test.go
+++ b/flate/token_test.go
@@ -2,7 +2,7 @@
 
 import (
 	"bytes"
-	"io/ioutil"
+	"os"
 	"testing"
 )
 
@@ -13,7 +13,7 @@
 // loadTestTokens will load test tokens.
 // First block from enwik9, varint encoded.
 func loadTestTokens(t testFatal) *tokens {
-	b, err := ioutil.ReadFile("testdata/tokens.bin")
+	b, err := os.ReadFile("testdata/tokens.bin")
 	if err != nil {
 		t.Fatal(err)
 	}
diff --git a/flate/writer_test.go b/flate/writer_test.go
index a3b1547..0a011a9 100644
--- a/flate/writer_test.go
+++ b/flate/writer_test.go
@@ -10,9 +10,9 @@
 	"compress/flate"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"math"
 	"math/rand"
+	"os"
 	"runtime"
 	"strconv"
 	"strings"
@@ -32,7 +32,7 @@
 	data := make([]byte, 100000)
 	t.Run(fmt.Sprint("stateless"), func(t *testing.T) {
 		testMem(t, func() {
-			StatelessDeflate(ioutil.Discard, data, false, nil)
+			StatelessDeflate(io.Discard, data, false, nil)
 		})
 	})
 	for level := HuffmanOnly; level <= BestCompression; level++ {
@@ -40,7 +40,7 @@
 			var zr *Writer
 			var err error
 			testMem(t, func() {
-				zr, err = NewWriter(ioutil.Discard, level)
+				zr, err = NewWriter(io.Discard, level)
 				if err != nil {
 					t.Fatal(err)
 				}
@@ -54,7 +54,7 @@
 			var zr *flate.Writer
 			var err error
 			testMem(t, func() {
-				zr, err = flate.NewWriter(ioutil.Discard, level)
+				zr, err = flate.NewWriter(io.Discard, level)
 				if err != nil {
 					t.Fatal(err)
 				}
@@ -66,7 +66,7 @@
 }
 
 func TestWriterRegression(t *testing.T) {
-	data, err := ioutil.ReadFile("testdata/regression.zip")
+	data, err := os.ReadFile("testdata/regression.zip")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -91,7 +91,7 @@
 						t.Error(err)
 						return
 					}
-					in, err := ioutil.ReadAll(r)
+					in, err := io.ReadAll(r)
 					if err != nil {
 						t.Error(err)
 					}
@@ -113,7 +113,7 @@
 						t.Fatal(msg + err.Error())
 					}
 					fr1 := NewReader(buf)
-					data2, err := ioutil.ReadAll(fr1)
+					data2, err := io.ReadAll(fr1)
 					if err != nil {
 						t.Fatal(msg + err.Error())
 					}
@@ -136,7 +136,7 @@
 						t.Fatal(msg + err.Error())
 					}
 					fr1 = NewReader(buf)
-					data2, err = ioutil.ReadAll(fr1)
+					data2, err = io.ReadAll(fr1)
 					if err != nil {
 						t.Fatal(msg + err.Error())
 					}
@@ -151,7 +151,7 @@
 
 func benchmarkEncoder(b *testing.B, testfile, level, n int) {
 	b.SetBytes(int64(n))
-	buf0, err := ioutil.ReadFile(testfiles[testfile])
+	buf0, err := os.ReadFile(testfiles[testfile])
 	if err != nil {
 		b.Fatal(err)
 	}
@@ -167,14 +167,14 @@
 	}
 	buf0 = nil
 	runtime.GC()
-	w, err := NewWriter(ioutil.Discard, level)
+	w, err := NewWriter(io.Discard, level)
 	if err != nil {
 		b.Fatal(err)
 	}
 	b.ResetTimer()
 	b.ReportAllocs()
 	for i := 0; i < b.N; i++ {
-		w.Reset(ioutil.Discard)
+		w.Reset(io.Discard)
 		_, err = w.Write(buf1)
 		if err != nil {
 			b.Fatal(err)
@@ -219,7 +219,7 @@
 
 func benchmarkStatelessEncoder(b *testing.B, testfile, n int) {
 	b.SetBytes(int64(n))
-	buf0, err := ioutil.ReadFile(testfiles[testfile])
+	buf0, err := os.ReadFile(testfiles[testfile])
 	if err != nil {
 		b.Fatal(err)
 	}
@@ -238,7 +238,7 @@
 	b.ResetTimer()
 	b.ReportAllocs()
 	for i := 0; i < b.N; i++ {
-		w := NewStatelessWriter(ioutil.Discard)
+		w := NewStatelessWriter(io.Discard)
 		_, err = w.Write(buf1)
 		if err != nil {
 			b.Fatal(err)
@@ -304,7 +304,7 @@
 				t.Fatal("Level", l, "Expected an error on close")
 			}
 
-			w.Reset(ioutil.Discard)
+			w.Reset(io.Discard)
 			n2, err = w.Write([]byte{1, 2, 3, 4, 5, 6})
 			if err != nil {
 				t.Fatal("Level", l, "Got unexpected error after reset:", err)
@@ -343,7 +343,7 @@
 			}
 			for ; offset <= 256; offset *= 2 {
 				// Fail after 'fail' writes
-				w, err := NewWriter(ioutil.Discard, l)
+				w, err := NewWriter(io.Discard, l)
 				if err != nil {
 					t.Fatalf("NewWriter: level %d: %v", l, err)
 				}
@@ -511,7 +511,7 @@
 				b.ReportAllocs()
 
 				for i := 0; i < b.N; i++ {
-					w, err := NewWriter(ioutil.Discard, j)
+					w, err := NewWriter(io.Discard, j)
 					if err != nil {
 						b.Fatal(err)
 					}
@@ -530,7 +530,7 @@
 		b.ReportAllocs()
 
 		for i := 0; i < b.N; i++ {
-			w, err := NewWriter(ioutil.Discard, level)
+			w, err := NewWriter(io.Discard, level)
 			if err != nil {
 				b.Fatal(err)
 			}
diff --git a/fse/fse_test.go b/fse/fse_test.go
index 9e617f3..a924874 100644
--- a/fse/fse_test.go
+++ b/fse/fse_test.go
@@ -8,7 +8,7 @@
 import (
 	"bytes"
 	"fmt"
-	"io/ioutil"
+	"os"
 	"reflect"
 	"strings"
 	"testing"
@@ -22,31 +22,31 @@
 	err  error
 }{
 	// gettysburg.txt is a small plain text.
-	{name: "gettysburg", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/gettysburg.txt") }},
+	{name: "gettysburg", fn: func() ([]byte, error) { return os.ReadFile("../testdata/gettysburg.txt") }},
 	// Digits is the digits of the irrational number e. Its decimal representation
 	// does not repeat, but there are only 10 possible digits, so it should be
 	// reasonably compressible.
-	{name: "digits", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/e.txt") }},
+	{name: "digits", fn: func() ([]byte, error) { return os.ReadFile("../testdata/e.txt") }},
 	// Twain is Project Gutenberg's edition of Mark Twain's classic English novel.
-	{name: "twain", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/Mark.Twain-Tom.Sawyer.txt") }},
+	{name: "twain", fn: func() ([]byte, error) { return os.ReadFile("../testdata/Mark.Twain-Tom.Sawyer.txt") }},
 	// Random bytes
-	{name: "random", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/sharnd.out") }, err: ErrIncompressible},
+	{name: "random", fn: func() ([]byte, error) { return os.ReadFile("../testdata/sharnd.out") }, err: ErrIncompressible},
 	// Low entropy
 	{name: "low-ent", fn: func() ([]byte, error) { return []byte(strings.Repeat("1221", 10000)), nil }},
 	// Super Low entropy
 	{name: "superlow-ent", fn: func() ([]byte, error) { return []byte(strings.Repeat("1", 10000) + strings.Repeat("2", 500)), nil }},
 	// Zero bytes
 	{name: "zeroes", fn: func() ([]byte, error) { return make([]byte, 10000), nil }, err: ErrUseRLE},
-	{name: "crash1", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/crash1.bin") }, err: ErrIncompressible},
-	{name: "crash2", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/crash2.bin") }, err: ErrIncompressible},
-	{name: "crash3", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/crash3.bin") }, err: ErrIncompressible},
-	{name: "endzerobits", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/endzerobits.bin") }, err: nil},
-	{name: "endnonzero", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/endnonzero.bin") }, err: ErrIncompressible},
-	{name: "case1", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/case1.bin") }, err: ErrIncompressible},
-	{name: "case2", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/case2.bin") }, err: ErrIncompressible},
-	{name: "case3", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/case3.bin") }, err: ErrIncompressible},
-	{name: "pngdata.001", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/pngdata.bin") }, err: nil},
-	{name: "normcount2", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/normcount2.bin") }, err: nil},
+	{name: "crash1", fn: func() ([]byte, error) { return os.ReadFile("../testdata/crash1.bin") }, err: ErrIncompressible},
+	{name: "crash2", fn: func() ([]byte, error) { return os.ReadFile("../testdata/crash2.bin") }, err: ErrIncompressible},
+	{name: "crash3", fn: func() ([]byte, error) { return os.ReadFile("../testdata/crash3.bin") }, err: ErrIncompressible},
+	{name: "endzerobits", fn: func() ([]byte, error) { return os.ReadFile("../testdata/endzerobits.bin") }, err: nil},
+	{name: "endnonzero", fn: func() ([]byte, error) { return os.ReadFile("../testdata/endnonzero.bin") }, err: ErrIncompressible},
+	{name: "case1", fn: func() ([]byte, error) { return os.ReadFile("../testdata/case1.bin") }, err: ErrIncompressible},
+	{name: "case2", fn: func() ([]byte, error) { return os.ReadFile("../testdata/case2.bin") }, err: ErrIncompressible},
+	{name: "case3", fn: func() ([]byte, error) { return os.ReadFile("../testdata/case3.bin") }, err: ErrIncompressible},
+	{name: "pngdata.001", fn: func() ([]byte, error) { return os.ReadFile("../testdata/pngdata.bin") }, err: nil},
+	{name: "normcount2", fn: func() ([]byte, error) { return os.ReadFile("../testdata/normcount2.bin") }, err: nil},
 }
 
 var decTestfiles = []struct {
@@ -55,14 +55,14 @@
 	err  string
 }{
 	// gettysburg.txt is a small plain text.
-	{name: "hang1", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/dec-hang1.bin") }, err: "corruption detected (bitCount 252 > 32)"},
-	{name: "hang2", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/dec-hang2.bin") }, err: "newState (0) == oldState (0) and no bits"},
-	{name: "hang3", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/dec-hang3.bin") }, err: "maxSymbolValue too small"},
-	{name: "symlen1", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/dec-symlen1.bin") }, err: "symbolLen (257) too big"},
-	{name: "crash4", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/crash4.bin") }, err: "symbolLen (1) too small"},
-	{name: "crash5", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/crash5.bin") }, err: "symbolLen (1) too small"},
-	{name: "crash6", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/dec-crash6.bin") }, err: "newState (32768) outside table size (32768)"},
-	{name: "something", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/fse-artifact3.bin") }, err: "output size (1048576) > DecompressLimit (1048576)"},
+	{name: "hang1", fn: func() ([]byte, error) { return os.ReadFile("../testdata/dec-hang1.bin") }, err: "corruption detected (bitCount 252 > 32)"},
+	{name: "hang2", fn: func() ([]byte, error) { return os.ReadFile("../testdata/dec-hang2.bin") }, err: "newState (0) == oldState (0) and no bits"},
+	{name: "hang3", fn: func() ([]byte, error) { return os.ReadFile("../testdata/dec-hang3.bin") }, err: "maxSymbolValue too small"},
+	{name: "symlen1", fn: func() ([]byte, error) { return os.ReadFile("../testdata/dec-symlen1.bin") }, err: "symbolLen (257) too big"},
+	{name: "crash4", fn: func() ([]byte, error) { return os.ReadFile("../testdata/crash4.bin") }, err: "symbolLen (1) too small"},
+	{name: "crash5", fn: func() ([]byte, error) { return os.ReadFile("../testdata/crash5.bin") }, err: "symbolLen (1) too small"},
+	{name: "crash6", fn: func() ([]byte, error) { return os.ReadFile("../testdata/dec-crash6.bin") }, err: "newState (32768) outside table size (32768)"},
+	{name: "something", fn: func() ([]byte, error) { return os.ReadFile("../testdata/fse-artifact3.bin") }, err: "output size (1048576) > DecompressLimit (1048576)"},
 }
 
 func TestCompress(t *testing.T) {
@@ -88,7 +88,7 @@
 
 func ExampleCompress() {
 	// Read data
-	data, err := ioutil.ReadFile("../testdata/e.txt")
+	data, err := os.ReadFile("../testdata/e.txt")
 	if err != nil {
 		panic(err)
 	}
@@ -131,7 +131,7 @@
 
 func ExampleDecompress() {
 	// Read data
-	data, err := ioutil.ReadFile("../testdata/e.txt")
+	data, err := os.ReadFile("../testdata/e.txt")
 	if err != nil {
 		panic(err)
 	}
diff --git a/gzhttp/compress_test.go b/gzhttp/compress_test.go
index e2556c2..cfeb350 100644
--- a/gzhttp/compress_test.go
+++ b/gzhttp/compress_test.go
@@ -3,11 +3,12 @@
 import (
 	"bytes"
 	"fmt"
-	"io/ioutil"
+	"io"
 	"net"
 	"net/http"
 	"net/http/httptest"
 	"net/url"
+	"os"
 	"strconv"
 	"testing"
 
@@ -149,7 +150,7 @@
 	assertEqual(t, "", res.Header.Get("Accept-Ranges"))
 	zr, err := gzip.NewReader(resp.Body)
 	assertNil(t, err)
-	got, err := ioutil.ReadAll(zr)
+	got, err := io.ReadAll(zr)
 	assertNil(t, err)
 	assertEqual(t, testBody, got)
 }
@@ -174,7 +175,7 @@
 	assertEqual(t, "bytes", res.Header.Get("Accept-Ranges"))
 	zr, err := gzip.NewReader(resp.Body)
 	assertNil(t, err)
-	got, err := ioutil.ReadAll(zr)
+	got, err := io.ReadAll(zr)
 	assertNil(t, err)
 	assertEqual(t, testBody, got)
 }
@@ -256,7 +257,7 @@
 			req.Header.Set("Accept-Encoding", "gzip")
 			handler.ServeHTTP(rec, req)
 
-			body, err := ioutil.ReadAll(rec.Body)
+			body, err := io.ReadAll(rec.Body)
 			if err != nil {
 				t.Fatalf("Unexpected error reading response body: %v", err)
 			}
@@ -327,7 +328,7 @@
 			}
 			defer res.Body.Close()
 
-			body, err := ioutil.ReadAll(res.Body)
+			body, err := io.ReadAll(res.Body)
 			if err != nil {
 				t.Fatalf("Unexpected error reading response body in test iteration %d: %v", num, err)
 			}
@@ -431,7 +432,7 @@
 	}
 	req.Header.Set("Accept-Encoding", "gzip")
 	wrapper.ServeHTTP(rec, req)
-	body, err := ioutil.ReadAll(rec.Body)
+	body, err := io.ReadAll(rec.Body)
 	if err != nil {
 		t.Fatalf("Unexpected error reading response body: %v", err)
 	}
@@ -493,7 +494,7 @@
 	assertEqual(t, "gzip", res.Header.Get("Content-Encoding"))
 	gr, err := gzip.NewReader(w.Body)
 	assertNil(t, err)
-	got, err := ioutil.ReadAll(gr)
+	got, err := io.ReadAll(gr)
 	assertNil(t, err)
 	assertEqual(t, b, got)
 }
@@ -516,7 +517,7 @@
 	assertEqual(t, "gzip", res.Header.Get("Content-Encoding"))
 	gr, err := gzip.NewReader(w.Body)
 	assertNil(t, err)
-	got, err := ioutil.ReadAll(gr)
+	got, err := io.ReadAll(gr)
 	assertNil(t, err)
 	assertEqual(t, b, got)
 }
@@ -807,13 +808,13 @@
 				assertEqual(t, "gzip", res.Header.Get("Content-Encoding"))
 				zr, err := gzip.NewReader(resp.Body)
 				assertNil(t, err)
-				got, err := ioutil.ReadAll(zr)
+				got, err := io.ReadAll(zr)
 				assertNil(t, err)
 				assertEqual(t, testBody, got)
 
 			} else {
 				assertNotEqual(t, "gzip", res.Header.Get("Content-Encoding"))
-				got, err := ioutil.ReadAll(resp.Body)
+				got, err := io.ReadAll(resp.Body)
 				assertNil(t, err)
 				assertEqual(t, testBody, got)
 			}
@@ -1091,7 +1092,7 @@
 }
 
 func benchmark(b *testing.B, parallel bool, size, level int) {
-	bin, err := ioutil.ReadFile("testdata/benchmark.json")
+	bin, err := os.ReadFile("testdata/benchmark.json")
 	if err != nil {
 		b.Fatal(err)
 	}
diff --git a/gzhttp/transport_test.go b/gzhttp/transport_test.go
index 884c887..a059ac1 100644
--- a/gzhttp/transport_test.go
+++ b/gzhttp/transport_test.go
@@ -7,9 +7,9 @@
 import (
 	"bytes"
 	"io"
-	"io/ioutil"
 	"net/http"
 	"net/http/httptest"
+	"os"
 	"runtime"
 	"testing"
 
@@ -18,7 +18,7 @@
 )
 
 func TestTransport(t *testing.T) {
-	bin, err := ioutil.ReadFile("testdata/benchmark.json")
+	bin, err := os.ReadFile("testdata/benchmark.json")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -30,7 +30,7 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-	got, err := ioutil.ReadAll(resp.Body)
+	got, err := io.ReadAll(resp.Body)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -40,7 +40,7 @@
 }
 
 func TestTransportForced(t *testing.T) {
-	raw, err := ioutil.ReadFile("testdata/benchmark.json")
+	raw, err := os.ReadFile("testdata/benchmark.json")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -58,7 +58,7 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-	got, err := ioutil.ReadAll(resp.Body)
+	got, err := io.ReadAll(resp.Body)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -68,7 +68,7 @@
 }
 
 func TestTransportForcedDisabled(t *testing.T) {
-	raw, err := ioutil.ReadFile("testdata/benchmark.json")
+	raw, err := os.ReadFile("testdata/benchmark.json")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -85,7 +85,7 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-	got, err := ioutil.ReadAll(resp.Body)
+	got, err := io.ReadAll(resp.Body)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -95,7 +95,7 @@
 }
 
 func TestTransportZstd(t *testing.T) {
-	bin, err := ioutil.ReadFile("testdata/benchmark.json")
+	bin, err := os.ReadFile("testdata/benchmark.json")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -109,7 +109,7 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-	got, err := ioutil.ReadAll(resp.Body)
+	got, err := io.ReadAll(resp.Body)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -119,7 +119,7 @@
 }
 
 func TestTransportInvalid(t *testing.T) {
-	bin, err := ioutil.ReadFile("testdata/benchmark.json")
+	bin, err := os.ReadFile("testdata/benchmark.json")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -132,14 +132,14 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-	_, err = ioutil.ReadAll(resp.Body)
+	_, err = io.ReadAll(resp.Body)
 	if err == nil {
 		t.Fatal("expected error, got nil")
 	}
 }
 
 func TestTransportZstdDisabled(t *testing.T) {
-	raw, err := ioutil.ReadFile("testdata/benchmark.json")
+	raw, err := os.ReadFile("testdata/benchmark.json")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -154,7 +154,7 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-	got, err := ioutil.ReadAll(resp.Body)
+	got, err := io.ReadAll(resp.Body)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -164,7 +164,7 @@
 }
 
 func TestTransportZstdInvalid(t *testing.T) {
-	bin, err := ioutil.ReadFile("testdata/benchmark.json")
+	bin, err := os.ReadFile("testdata/benchmark.json")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -176,7 +176,7 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-	_, err = ioutil.ReadAll(resp.Body)
+	_, err = io.ReadAll(resp.Body)
 	if err == nil {
 		t.Fatal("expected error, got nil")
 	}
@@ -184,7 +184,7 @@
 }
 
 func TestDefaultTransport(t *testing.T) {
-	bin, err := ioutil.ReadFile("testdata/benchmark.json")
+	bin, err := os.ReadFile("testdata/benchmark.json")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -197,7 +197,7 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-	got, err := ioutil.ReadAll(resp.Body)
+	got, err := io.ReadAll(resp.Body)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -207,7 +207,7 @@
 }
 
 func BenchmarkTransport(b *testing.B) {
-	raw, err := ioutil.ReadFile("testdata/benchmark.json")
+	raw, err := os.ReadFile("testdata/benchmark.json")
 	if err != nil {
 		b.Fatal(err)
 	}
@@ -243,7 +243,7 @@
 			if err != nil {
 				b.Fatal(err)
 			}
-			n, err := io.Copy(ioutil.Discard, resp.Body)
+			n, err := io.Copy(io.Discard, resp.Body)
 			if err != nil {
 				b.Fatal(err)
 			}
@@ -264,7 +264,7 @@
 			if err != nil {
 				b.Fatal(err)
 			}
-			n, err := io.Copy(ioutil.Discard, resp.Body)
+			n, err := io.Copy(io.Discard, resp.Body)
 			if err != nil {
 				b.Fatal(err)
 			}
@@ -286,7 +286,7 @@
 			if err != nil {
 				b.Fatal(err)
 			}
-			n, err := io.Copy(ioutil.Discard, resp.Body)
+			n, err := io.Copy(io.Discard, resp.Body)
 			if err != nil {
 				b.Fatal(err)
 			}
@@ -314,7 +314,7 @@
 				if err != nil {
 					b.Fatal(err)
 				}
-				n, err := io.Copy(ioutil.Discard, resp.Body)
+				n, err := io.Copy(io.Discard, resp.Body)
 				if err != nil {
 					b.Fatal(err)
 				}
@@ -340,7 +340,7 @@
 				if err != nil {
 					b.Fatal(err)
 				}
-				n, err := io.Copy(ioutil.Discard, resp.Body)
+				n, err := io.Copy(io.Discard, resp.Body)
 				if err != nil {
 					b.Fatal(err)
 				}
@@ -369,7 +369,7 @@
 				if err != nil {
 					b.Fatal(err)
 				}
-				n, err := io.Copy(ioutil.Discard, resp.Body)
+				n, err := io.Copy(io.Discard, resp.Body)
 				if err != nil {
 					b.Fatal(err)
 				}
diff --git a/gzip/gunzip_test.go b/gzip/gunzip_test.go
index 2ca835a..d11325c 100644
--- a/gzip/gunzip_test.go
+++ b/gzip/gunzip_test.go
@@ -9,7 +9,6 @@
 	oldgz "compress/gzip"
 	"crypto/rand"
 	"io"
-	"io/ioutil"
 	"os"
 	"strings"
 	"testing"
@@ -419,7 +418,7 @@
 	defer gzip.Close()
 	done := make(chan bool, 1)
 	go func() {
-		_, err := io.Copy(ioutil.Discard, gzip)
+		_, err := io.Copy(io.Discard, gzip)
 		if err == nil {
 			t.Errorf("Copy succeeded")
 		} else {
@@ -470,7 +469,7 @@
 	const hello = "hello world\n"
 
 	r.Multistream(false)
-	data, err := ioutil.ReadAll(&r)
+	data, err := io.ReadAll(&r)
 	if string(data) != hello || err != nil {
 		t.Fatalf("first stream = %q, %v, want %q, %v", string(data), err, hello, nil)
 	}
@@ -479,7 +478,7 @@
 		t.Fatalf("second reset: %v", err)
 	}
 	r.Multistream(false)
-	data, err = ioutil.ReadAll(&r)
+	data, err = io.ReadAll(&r)
 	if string(data) != hello || err != nil {
 		t.Fatalf("second stream = %q, %v, want %q, %v", string(data), err, hello, nil)
 	}
@@ -522,7 +521,7 @@
 		t.Fatal(err)
 	}
 	// ReadAll does not use WriteTo, but we wrap it in a NopCloser to be sure.
-	readall, err := ioutil.ReadAll(ioutil.NopCloser(dec))
+	readall, err := io.ReadAll(io.NopCloser(dec))
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -574,7 +573,7 @@
 			}
 			continue
 		}
-		_, err = io.Copy(ioutil.Discard, r)
+		_, err = io.Copy(io.Discard, r)
 		if err != io.ErrUnexpectedEOF {
 			t.Errorf("io.Copy(%d) on truncated stream: got %v, want %v", i, err, io.ErrUnexpectedEOF)
 		}
@@ -582,7 +581,7 @@
 }
 
 func BenchmarkGunzipCopy(b *testing.B) {
-	dat, _ := ioutil.ReadFile("testdata/test.json")
+	dat, _ := os.ReadFile("testdata/test.json")
 	dat = append(dat, dat...)
 	dat = append(dat, dat...)
 	dat = append(dat, dat...)
@@ -603,7 +602,7 @@
 		if err != nil {
 			b.Fatal(err)
 		}
-		_, err = io.Copy(ioutil.Discard, r)
+		_, err = io.Copy(io.Discard, r)
 		if err != nil {
 			b.Fatal(err)
 		}
@@ -611,7 +610,7 @@
 }
 
 func BenchmarkGunzipNoWriteTo(b *testing.B) {
-	dat, _ := ioutil.ReadFile("testdata/test.json")
+	dat, _ := os.ReadFile("testdata/test.json")
 	dat = append(dat, dat...)
 	dat = append(dat, dat...)
 	dat = append(dat, dat...)
@@ -636,7 +635,7 @@
 		if err != nil {
 			b.Fatal(err)
 		}
-		_, err = io.Copy(ioutil.Discard, ioutil.NopCloser(r))
+		_, err = io.Copy(io.Discard, io.NopCloser(r))
 		if err != nil {
 			b.Fatal(err)
 		}
@@ -644,7 +643,7 @@
 }
 
 func BenchmarkGunzipStdlib(b *testing.B) {
-	dat, _ := ioutil.ReadFile("testdata/test.json")
+	dat, _ := os.ReadFile("testdata/test.json")
 	dat = append(dat, dat...)
 	dat = append(dat, dat...)
 	dat = append(dat, dat...)
@@ -669,7 +668,7 @@
 		if err != nil {
 			b.Fatal(err)
 		}
-		_, err = io.Copy(ioutil.Discard, r)
+		_, err = io.Copy(io.Discard, r)
 		if err != nil {
 			b.Fatal(err)
 		}
@@ -692,7 +691,7 @@
 		go func() {
 			r, err := NewReader(bytes.NewBuffer(testdata[:i]))
 			if err == nil {
-				b, err := ioutil.ReadAll(r)
+				b, err := io.ReadAll(r)
 				if err == nil && !bytes.Equal(testdata[:i], b) {
 					close(fail)
 				}
diff --git a/gzip/gzip_test.go b/gzip/gzip_test.go
index d43ebe1..e1ebb5a 100644
--- a/gzip/gzip_test.go
+++ b/gzip/gzip_test.go
@@ -8,8 +8,8 @@
 	"bufio"
 	"bytes"
 	"io"
-	"io/ioutil"
 	"math/rand"
+	"os"
 	"strconv"
 	"strings"
 	"testing"
@@ -28,7 +28,7 @@
 	if err != nil {
 		t.Fatalf("NewReader: %v", err)
 	}
-	b, err := ioutil.ReadAll(r)
+	b, err := io.ReadAll(r)
 	if err != nil {
 		t.Fatalf("ReadAll: %v", err)
 	}
@@ -61,7 +61,7 @@
 	if err != nil {
 		t.Fatalf("NewReader: %v", err)
 	}
-	b, err := ioutil.ReadAll(r)
+	b, err := io.ReadAll(r)
 	if err != nil {
 		t.Fatalf("ReadAll: %v", err)
 	}
@@ -146,7 +146,7 @@
 			t.Errorf("NewReader: %v", err)
 			continue
 		}
-		_, err = ioutil.ReadAll(r)
+		_, err = io.ReadAll(r)
 		if err != nil {
 			t.Errorf("ReadAll: %v", err)
 			continue
@@ -216,7 +216,7 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-	data, err := ioutil.ReadAll(r)
+	data, err := io.ReadAll(r)
 	if string(data) != "hello world\n" || err != nil {
 		t.Fatalf("ReadAll = %q, %v, want %q, nil", data, err, "hello world")
 	}
@@ -240,7 +240,7 @@
 var testbuf []byte
 
 func testFile(i, level int, t *testing.T) {
-	dat, _ := ioutil.ReadFile("testdata/test.json")
+	dat, _ := os.ReadFile("testdata/test.json")
 	dl := len(dat)
 	if len(testbuf) != i*dl {
 		// Make results predictable
@@ -271,7 +271,7 @@
 	if err != nil {
 		t.Fatal(err.Error())
 	}
-	decoded, err := ioutil.ReadAll(r)
+	decoded, err := io.ReadAll(r)
 	if err != nil {
 		t.Fatal(err.Error())
 	}
@@ -345,7 +345,7 @@
 	if err != nil {
 		t.Fatal(err.Error())
 	}
-	decoded, err := ioutil.ReadAll(r)
+	decoded, err := io.ReadAll(r)
 	if err != nil {
 		t.Fatal(err.Error())
 	}
@@ -462,17 +462,17 @@
 func BenchmarkGzipL9(b *testing.B)  { benchmarkGzipN(b, 9) }
 
 func benchmarkGzipN(b *testing.B, level int) {
-	dat, _ := ioutil.ReadFile("testdata/test.json")
+	dat, _ := os.ReadFile("testdata/test.json")
 	dat = append(dat, dat...)
 	dat = append(dat, dat...)
 	dat = append(dat, dat...)
 	dat = append(dat, dat...)
 	dat = append(dat, dat...)
 	b.SetBytes(int64(len(dat)))
-	w, _ := NewWriterLevel(ioutil.Discard, level)
+	w, _ := NewWriterLevel(io.Discard, level)
 	b.ResetTimer()
 	for n := 0; n < b.N; n++ {
-		w.Reset(ioutil.Discard)
+		w.Reset(io.Discard)
 		n, err := w.Write(dat)
 		if n != len(dat) {
 			panic("short write")
@@ -499,7 +499,7 @@
 func BenchmarkOldGzipL9(b *testing.B) { benchmarkOldGzipN(b, 9) }
 
 func benchmarkOldGzipN(b *testing.B, level int) {
-	dat, _ := ioutil.ReadFile("testdata/test.json")
+	dat, _ := os.ReadFile("testdata/test.json")
 	dat = append(dat, dat...)
 	dat = append(dat, dat...)
 	dat = append(dat, dat...)
@@ -507,10 +507,10 @@
 	dat = append(dat, dat...)
 
 	b.SetBytes(int64(len(dat)))
-	w, _ := oldgz.NewWriterLevel(ioutil.Discard, level)
+	w, _ := oldgz.NewWriterLevel(io.Discard, level)
 	b.ResetTimer()
 	for n := 0; n < b.N; n++ {
-		w.Reset(ioutil.Discard)
+		w.Reset(io.Discard)
 		n, err := w.Write(dat)
 		if n != len(dat) {
 			panic("short write")
@@ -535,7 +535,7 @@
 				b.ReportAllocs()
 
 				for i := 0; i < b.N; i++ {
-					w, err := NewWriterLevel(ioutil.Discard, j)
+					w, err := NewWriterLevel(io.Discard, j)
 					if err != nil {
 						b.Fatal(err)
 					}
@@ -555,7 +555,7 @@
 		b.ReportAllocs()
 
 		for i := 0; i < b.N; i++ {
-			w, err := NewWriterLevel(ioutil.Discard, level)
+			w, err := NewWriterLevel(io.Discard, level)
 			if err != nil {
 				b.Fatal(err)
 			}
diff --git a/huff0/compress_test.go b/huff0/compress_test.go
index 75c314e..58c2439 100644
--- a/huff0/compress_test.go
+++ b/huff0/compress_test.go
@@ -3,8 +3,9 @@
 import (
 	"bytes"
 	"fmt"
-	"io/ioutil"
+	"io"
 	"math/rand"
+	"os"
 	"path/filepath"
 	"reflect"
 	"strings"
@@ -25,29 +26,29 @@
 	// Digits is the digits of the irrational number e. Its decimal representation
 	// does not repeat, but there are only 10 possible digits, so it should be
 	// reasonably compressible.
-	{name: "digits", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/e.txt") }},
+	{name: "digits", fn: func() ([]byte, error) { return os.ReadFile("../testdata/e.txt") }},
 	// gettysburg.txt is a small plain text.
-	{name: "gettysburg", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/gettysburg.txt") }},
+	{name: "gettysburg", fn: func() ([]byte, error) { return os.ReadFile("../testdata/gettysburg.txt") }},
 	// Twain is Project Gutenberg's edition of Mark Twain's classic English novel.
-	{name: "twain", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/Mark.Twain-Tom.Sawyer.txt") }},
+	{name: "twain", fn: func() ([]byte, error) { return os.ReadFile("../testdata/Mark.Twain-Tom.Sawyer.txt") }},
 	// Random bytes
-	{name: "random", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/sharnd.out") }, err1X: ErrIncompressible, err4X: ErrIncompressible},
+	{name: "random", fn: func() ([]byte, error) { return os.ReadFile("../testdata/sharnd.out") }, err1X: ErrIncompressible, err4X: ErrIncompressible},
 	// Low entropy
 	{name: "low-ent.10k", fn: func() ([]byte, error) { return []byte(strings.Repeat("1221", 10000)), nil }},
 	// Super Low entropy
 	{name: "superlow-ent-10k", fn: func() ([]byte, error) { return []byte(strings.Repeat("1", 10000) + strings.Repeat("2", 500)), nil }},
 	// Zero bytes
 	{name: "zeroes", fn: func() ([]byte, error) { return make([]byte, 10000), nil }, err1X: ErrUseRLE, err4X: ErrUseRLE},
-	{name: "crash1", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/crash1.bin") }, err1X: ErrIncompressible, err4X: ErrIncompressible},
-	{name: "crash2", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/crash2.bin") }, err4X: ErrIncompressible},
-	{name: "crash3", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/crash3.bin") }, err1X: ErrIncompressible, err4X: ErrIncompressible},
-	{name: "endzerobits", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/endzerobits.bin") }, err1X: nil, err4X: ErrIncompressible},
-	{name: "endnonzero", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/endnonzero.bin") }, err4X: ErrIncompressible},
-	{name: "case1", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/case1.bin") }, err1X: nil},
-	{name: "case2", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/case2.bin") }, err1X: nil},
-	{name: "case3", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/case3.bin") }, err1X: nil},
-	{name: "pngdata.001", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/pngdata.bin") }, err1X: nil},
-	{name: "normcount2", fn: func() ([]byte, error) { return ioutil.ReadFile("../testdata/normcount2.bin") }, err1X: nil},
+	{name: "crash1", fn: func() ([]byte, error) { return os.ReadFile("../testdata/crash1.bin") }, err1X: ErrIncompressible, err4X: ErrIncompressible},
+	{name: "crash2", fn: func() ([]byte, error) { return os.ReadFile("../testdata/crash2.bin") }, err4X: ErrIncompressible},
+	{name: "crash3", fn: func() ([]byte, error) { return os.ReadFile("../testdata/crash3.bin") }, err1X: ErrIncompressible, err4X: ErrIncompressible},
+	{name: "endzerobits", fn: func() ([]byte, error) { return os.ReadFile("../testdata/endzerobits.bin") }, err1X: nil, err4X: ErrIncompressible},
+	{name: "endnonzero", fn: func() ([]byte, error) { return os.ReadFile("../testdata/endnonzero.bin") }, err4X: ErrIncompressible},
+	{name: "case1", fn: func() ([]byte, error) { return os.ReadFile("../testdata/case1.bin") }, err1X: nil},
+	{name: "case2", fn: func() ([]byte, error) { return os.ReadFile("../testdata/case2.bin") }, err1X: nil},
+	{name: "case3", fn: func() ([]byte, error) { return os.ReadFile("../testdata/case3.bin") }, err1X: nil},
+	{name: "pngdata.001", fn: func() ([]byte, error) { return os.ReadFile("../testdata/pngdata.bin") }, err1X: nil},
+	{name: "normcount2", fn: func() ([]byte, error) { return os.ReadFile("../testdata/normcount2.bin") }, err1X: nil},
 }
 
 type fuzzInput struct {
@@ -60,7 +61,7 @@
 var testfilesExtended []fuzzInput
 
 func init() {
-	data, err := ioutil.ReadFile("testdata/regression.zip")
+	data, err := os.ReadFile("testdata/regression.zip")
 	if err != nil {
 		panic(err)
 	}
@@ -76,7 +77,7 @@
 		if err != nil {
 			panic(err)
 		}
-		b, err := ioutil.ReadAll(rc)
+		b, err := io.ReadAll(rc)
 		if err != nil {
 			panic(err)
 		}
@@ -522,7 +523,7 @@
 			continue
 		}
 		b.Run(test.name, func(b *testing.B) {
-			dec, err := flate.NewWriter(ioutil.Discard, flate.HuffmanOnly)
+			dec, err := flate.NewWriter(io.Discard, flate.HuffmanOnly)
 			if err != nil {
 				b.Fatal(err)
 			}
@@ -540,7 +541,7 @@
 			b.ReportAllocs()
 			b.SetBytes(int64(len(buf0)))
 			for i := 0; i < b.N; i++ {
-				dec.Reset(ioutil.Discard)
+				dec.Reset(io.Discard)
 				n, err := dec.Write(buf0)
 				if err != nil {
 					b.Fatal(err)
diff --git a/huff0/decompress_test.go b/huff0/decompress_test.go
index 3a79077..fe23514 100644
--- a/huff0/decompress_test.go
+++ b/huff0/decompress_test.go
@@ -3,7 +3,8 @@
 import (
 	"bytes"
 	"fmt"
-	"io/ioutil"
+	"io"
+	"os"
 	"testing"
 
 	"github.com/klauspost/compress/zip"
@@ -100,7 +101,7 @@
 }
 
 func TestDecompress1XRegression(t *testing.T) {
-	data, err := ioutil.ReadFile("testdata/decompress1x_regression.zip")
+	data, err := os.ReadFile("testdata/decompress1x_regression.zip")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -116,7 +117,7 @@
 		if err != nil {
 			t.Fatal(err)
 		}
-		data, err := ioutil.ReadAll(rc)
+		data, err := io.ReadAll(rc)
 		if err != nil {
 			t.Fatal(err)
 		}
diff --git a/s2/_generate/cleanup.go b/s2/_generate/cleanup.go
index bcd7964..a0cc302 100644
--- a/s2/_generate/cleanup.go
+++ b/s2/_generate/cleanup.go
@@ -6,7 +6,6 @@
 import (
 	"bytes"
 	"flag"
-	"io/ioutil"
 	"log"
 	"os"
 
@@ -17,7 +16,7 @@
 	flag.Parse()
 	args := flag.Args()
 	for _, file := range args {
-		data, err := ioutil.ReadFile(file)
+		data, err := os.ReadFile(file)
 		if err != nil {
 			log.Fatalln(err)
 		}
@@ -26,7 +25,7 @@
 		if err != nil {
 			log.Fatalln(err)
 		}
-		err = ioutil.WriteFile(file, data, os.ModePerm)
+		err = os.WriteFile(file, data, os.ModePerm)
 		if err != nil {
 			log.Fatalln(err)
 		}
diff --git a/s2/cmd/_s2sx/main.go b/s2/cmd/_s2sx/main.go
index 1d5c49a..cf70235 100644
--- a/s2/cmd/_s2sx/main.go
+++ b/s2/cmd/_s2sx/main.go
@@ -8,7 +8,6 @@
 	"flag"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"os"
 	"os/signal"
 	"path"
@@ -97,7 +96,7 @@
 		_, _ = fmt.Fprintf(os.Stderr, "\nUse -os and -arch to specify the destination platform.")
 		os.Exit(1)
 	}
-	exec, err = ioutil.ReadAll(s2.NewReader(bytes.NewBuffer(exec)))
+	exec, err = io.ReadAll(s2.NewReader(bytes.NewBuffer(exec)))
 	exitErr(err)
 
 	written := int64(0)
diff --git a/s2/cmd/s2c/main.go b/s2/cmd/s2c/main.go
index 9e91356..7a3707a 100644
--- a/s2/cmd/s2c/main.go
+++ b/s2/cmd/s2c/main.go
@@ -7,7 +7,6 @@
 	"flag"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"log"
 	"net/http"
 	"os"
@@ -274,7 +273,7 @@
 				file.Close()
 				var buf *bytes.Buffer
 				for i := 0; i < *bench; i++ {
-					w := ioutil.Discard
+					w := io.Discard
 					// Verify with this buffer...
 					if *verify {
 						if buf == nil {
@@ -307,7 +306,7 @@
 						}
 						start := time.Now()
 						dec.Reset(buf)
-						n, err := io.Copy(ioutil.Discard, dec)
+						n, err := io.Copy(io.Discard, dec)
 						exitErr(err)
 						if int(n) != len(b) {
 							exitErr(fmt.Errorf("unexpected size, want %d, got %d", len(b), n))
@@ -359,7 +358,7 @@
 				file, _, mode := openFile(filename)
 				exitErr(err)
 				defer closeOnce.Do(func() { file.Close() })
-				inBytes, err := ioutil.ReadAll(file)
+				inBytes, err := io.ReadAll(file)
 				exitErr(err)
 
 				var out io.Writer
@@ -479,7 +478,7 @@
 			}
 			if *recomp {
 				dec := s2.NewReader(src)
-				src = ioutil.NopCloser(dec)
+				src = io.NopCloser(dec)
 			}
 
 			var out io.Writer
@@ -583,7 +582,7 @@
 	go func() {
 		defer wg.Done()
 		r := s2.NewReader(pr)
-		_, err = io.Copy(ioutil.Discard, r)
+		_, err = io.Copy(io.Discard, r)
 		pr.CloseWithError(fmt.Errorf("verify: %w", err))
 	}()
 	return writer, func() error {
diff --git a/s2/cmd/s2d/main.go b/s2/cmd/s2d/main.go
index 8f70301..0ee3e77 100644
--- a/s2/cmd/s2d/main.go
+++ b/s2/cmd/s2d/main.go
@@ -7,7 +7,6 @@
 	"flag"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"net/http"
 	"os"
 	"runtime"
@@ -82,7 +81,7 @@
 	if len(args) == 1 && args[0] == "-" {
 		r.Reset(os.Stdin)
 		if *verify {
-			_, err := io.Copy(ioutil.Discard, r)
+			_, err := io.Copy(io.Discard, r)
 			exitErr(err)
 			return
 		}
@@ -169,9 +168,9 @@
 					} else {
 						r.Reset(bytes.NewBuffer(b))
 						if *cpu > 1 {
-							output, err = r.DecodeConcurrent(ioutil.Discard, *cpu)
+							output, err = r.DecodeConcurrent(io.Discard, *cpu)
 						} else {
-							output, err = io.Copy(ioutil.Discard, r)
+							output, err = io.Copy(io.Discard, r)
 						}
 						exitErr(err)
 					}
@@ -264,7 +263,7 @@
 			var out io.Writer
 			switch {
 			case *verify:
-				out = ioutil.Discard
+				out = io.Discard
 			case *stdout:
 				out = os.Stdout
 			default:
@@ -281,7 +280,7 @@
 			var decoded io.Reader
 			start := time.Now()
 			if block {
-				all, err := ioutil.ReadAll(src)
+				all, err := io.ReadAll(src)
 				exitErr(err)
 				b, err := s2.Decode(nil, all)
 				exitErr(err)
diff --git a/s2/decode_test.go b/s2/decode_test.go
index 3d9aa20..86150b9 100644
--- a/s2/decode_test.go
+++ b/s2/decode_test.go
@@ -7,7 +7,8 @@
 import (
 	"bytes"
 	"fmt"
-	"io/ioutil"
+	"io"
+	"os"
 	"runtime"
 	"strings"
 	"testing"
@@ -16,7 +17,7 @@
 )
 
 func TestDecodeRegression(t *testing.T) {
-	data, err := ioutil.ReadFile("testdata/dec-block-regressions.zip")
+	data, err := os.ReadFile("testdata/dec-block-regressions.zip")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -34,7 +35,7 @@
 				t.Error(err)
 				return
 			}
-			in, err := ioutil.ReadAll(r)
+			in, err := io.ReadAll(r)
 			if err != nil {
 				t.Error(err)
 			}
@@ -45,7 +46,7 @@
 }
 
 func TestDecoderMaxBlockSize(t *testing.T) {
-	data, err := ioutil.ReadFile("testdata/enc_regressions.zip")
+	data, err := os.ReadFile("testdata/enc_regressions.zip")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -84,7 +85,7 @@
 				}
 
 				dec.Reset(&buf)
-				got, err := ioutil.ReadAll(dec)
+				got, err := io.ReadAll(dec)
 				if err != nil {
 					t.Error(err)
 					return
@@ -130,7 +131,7 @@
 				dec.Reset(&buf)
 				// Skip first...
 				dec.Skip(int64(len(data)))
-				got, err = ioutil.ReadAll(dec)
+				got, err = io.ReadAll(dec)
 				if err != nil {
 					t.Error(err)
 					return
@@ -175,7 +176,7 @@
 				t.Error(err)
 				return
 			}
-			b, err := ioutil.ReadAll(r)
+			b, err := io.ReadAll(r)
 			if err != nil {
 				t.Error(err)
 				return
diff --git a/s2/encode_test.go b/s2/encode_test.go
index 279c1d9..c0b0505 100644
--- a/s2/encode_test.go
+++ b/s2/encode_test.go
@@ -8,8 +8,8 @@
 	"bytes"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"math/rand"
+	"os"
 	"runtime"
 	"strings"
 	"testing"
@@ -74,7 +74,7 @@
 }
 
 func TestEncoderRegression(t *testing.T) {
-	data, err := ioutil.ReadFile("testdata/enc_regressions.zip")
+	data, err := os.ReadFile("testdata/enc_regressions.zip")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -151,10 +151,10 @@
 				var got []byte
 				if !strings.Contains(name, "-snappy") {
 					dec.Reset(&buf)
-					got, err = ioutil.ReadAll(dec)
+					got, err = io.ReadAll(dec)
 				} else {
 					sdec := snapref.NewReader(&buf)
-					got, err = ioutil.ReadAll(sdec)
+					got, err = io.ReadAll(sdec)
 				}
 				if err != nil {
 					t.Error(err)
@@ -188,10 +188,10 @@
 				}
 				if !strings.Contains(name, "-snappy") {
 					dec.Reset(&buf)
-					got, err = ioutil.ReadAll(dec)
+					got, err = io.ReadAll(dec)
 				} else {
 					sdec := snapref.NewReader(&buf)
-					got, err = ioutil.ReadAll(sdec)
+					got, err = io.ReadAll(sdec)
 				}
 				if err != nil {
 					t.Error(err)
@@ -214,7 +214,7 @@
 				t.Error(err)
 				return
 			}
-			b, err := ioutil.ReadAll(r)
+			b, err := io.ReadAll(r)
 			if err != nil {
 				t.Error(err)
 				return
@@ -307,7 +307,7 @@
 			fatalErr(t, err)
 
 			// Read the rest of the stream...
-			got, err := ioutil.ReadAll(dec)
+			got, err := io.ReadAll(dec)
 			fatalErr(t, err)
 			if !bytes.Equal(got, want) {
 				t.Error("Result mismatch", wantOffset)
@@ -340,7 +340,7 @@
 						t.Errorf("got offset %d, want %d", gotOffset, wantOffset)
 					}
 					// Read the rest of the stream...
-					got, err := ioutil.ReadAll(dec)
+					got, err := io.ReadAll(dec)
 					fatalErr(t, err)
 					if !bytes.Equal(got, want) {
 						t.Error("Result mismatch", wantOffset)
@@ -482,7 +482,7 @@
 	}
 
 	dec := NewReader(dst)
-	_, err = io.Copy(ioutil.Discard, dec)
+	_, err = io.Copy(io.Discard, dec)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -522,7 +522,7 @@
 	}
 
 	dec := NewReader(dst)
-	n, err := io.Copy(ioutil.Discard, dec)
+	n, err := io.Copy(io.Discard, dec)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -555,7 +555,7 @@
 	}
 
 	dec := NewReader(dst)
-	n, err := io.Copy(ioutil.Discard, dec)
+	n, err := io.Copy(io.Discard, dec)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -571,7 +571,7 @@
 	}
 
 	for name, opts := range testOptions(b) {
-		w := NewWriter(ioutil.Discard, opts...)
+		w := NewWriter(io.Discard, opts...)
 		b.Run(name, func(b *testing.B) {
 			b.ResetTimer()
 			b.ReportAllocs()
diff --git a/s2/index_test.go b/s2/index_test.go
index faa6704..cd6cde1 100644
--- a/s2/index_test.go
+++ b/s2/index_test.go
@@ -5,7 +5,6 @@
 	"encoding/hex"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"math/rand"
 	"sync"
 	"testing"
@@ -80,7 +79,7 @@
 		fatalErr(err)
 
 		// Read the rest of the stream...
-		got, err := ioutil.ReadAll(dec)
+		got, err := io.ReadAll(dec)
 		fatalErr(err)
 		if bytes.Equal(got, want) {
 			fmt.Println("Successfully skipped forward to", wantOffset)
diff --git a/s2/s2_test.go b/s2/s2_test.go
index d7837e6..ab2dafd 100644
--- a/s2/s2_test.go
+++ b/s2/s2_test.go
@@ -11,7 +11,6 @@
 	"flag"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"math"
 	"math/rand"
 	"net/http"
@@ -589,7 +588,7 @@
 
 func TestDecodeGoldenInput(t *testing.T) {
 	tDir := filepath.FromSlash(*testdataDir)
-	src, err := ioutil.ReadFile(filepath.Join(tDir, goldenCompressed))
+	src, err := os.ReadFile(filepath.Join(tDir, goldenCompressed))
 	if err != nil {
 		t.Fatalf("ReadFile: %v", err)
 	}
@@ -597,7 +596,7 @@
 	if err != nil {
 		t.Fatalf("Decode: %v", err)
 	}
-	want, err := ioutil.ReadFile(filepath.Join(tDir, goldenText))
+	want, err := os.ReadFile(filepath.Join(tDir, goldenText))
 	if err != nil {
 		t.Fatalf("ReadFile: %v", err)
 	}
@@ -691,7 +690,7 @@
 					want := src[i:]
 					dec.Reset(bytes.NewBuffer(compressed))
 					// Read some of it first
-					read, err := io.CopyN(ioutil.Discard, dec, int64(len(want)/10))
+					read, err := io.CopyN(io.Discard, dec, int64(len(want)/10))
 					if err != nil {
 						t.Fatal(err)
 					}
@@ -701,7 +700,7 @@
 					if err != nil {
 						t.Fatal(err)
 					}
-					got, err := ioutil.ReadAll(dec)
+					got, err := io.ReadAll(dec)
 					if err != nil {
 						t.Errorf("Skipping %d returned error: %v", i, err)
 						return
@@ -770,7 +769,7 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-	dst, err := ioutil.ReadAll(NewReader(buf))
+	dst, err := io.ReadAll(NewReader(buf))
 	if err != nil {
 		t.Fatalf("ReadAll: decoding: %v", err)
 	}
@@ -806,7 +805,7 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-	dst, err := ioutil.ReadAll(NewReader(buf))
+	dst, err := io.ReadAll(NewReader(buf))
 	if err != nil {
 		t.Fatalf("ReadAll: decoding: %v", err)
 	}
@@ -963,7 +962,7 @@
 			t.Errorf("i=%#02x: Close: %v", i, err)
 			continue
 		}
-		got, err := ioutil.ReadAll(NewReader(buf))
+		got, err := io.ReadAll(NewReader(buf))
 		if err != nil {
 			t.Errorf("i=%#02x: ReadAll: %v", i, err)
 			continue
@@ -999,7 +998,7 @@
 		"\x68\x10\xe6\xb6" + // Checksum.
 		"\x61\x62\x63\x64", // Uncompressed payload: "abcd".
 	))
-	g, err := ioutil.ReadAll(r)
+	g, err := io.ReadAll(r)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -1013,7 +1012,7 @@
 		"\x01\x04\x00\x00" + // Uncompressed chunk, 4 bytes long.
 		"", // No payload; corrupt input.
 	))
-	if _, err := ioutil.ReadAll(r); err != ErrCorrupt {
+	if _, err := io.ReadAll(r); err != ErrCorrupt {
 		t.Fatalf("got %v, want %v", err, ErrCorrupt)
 	}
 }
@@ -1028,7 +1027,7 @@
 		strings.Repeat("\x00", n),
 	))
 	// CRC is not set, so we should expect that error.
-	if _, err := ioutil.ReadAll(r); err != ErrCRC {
+	if _, err := io.ReadAll(r); err != ErrCRC {
 		t.Fatalf("got %v, want %v", err, ErrCRC)
 	}
 
@@ -1040,7 +1039,7 @@
 		string([]byte{chunkTypeUncompressedData, uint8(n32), uint8(n32 >> 8), uint8(n32 >> 16)}) +
 		strings.Repeat("\x00", n),
 	))
-	if _, err := ioutil.ReadAll(r); err != ErrCorrupt {
+	if _, err := io.ReadAll(r); err != ErrCorrupt {
 		t.Fatalf("got %v, want %v", err, ErrCorrupt)
 	}
 }
@@ -1070,7 +1069,7 @@
 			continue
 		}
 		r.Reset(strings.NewReader(s))
-		got, err := ioutil.ReadAll(r)
+		got, err := io.ReadAll(r)
 		switch s {
 		case encoded:
 			if err != nil {
@@ -1110,7 +1109,7 @@
 		if err := w.Flush(); err != nil {
 			t.Errorf("#%d: Flush: %v", i, err)
 			failed = true
-			got, err := ioutil.ReadAll(NewReader(buf))
+			got, err := io.ReadAll(NewReader(buf))
 			if err != nil {
 				t.Errorf("#%d: ReadAll: %v", i, err)
 				failed = true
@@ -1145,7 +1144,7 @@
 	if err := w.Flush(); err != nil {
 		t.Fatalf("Flush: %v", err)
 	}
-	got, err := ioutil.ReadAll(NewReader(buf1))
+	got, err := io.ReadAll(NewReader(buf1))
 	if err != nil {
 		t.Fatalf("ReadAll: %v", err)
 	}
@@ -1231,7 +1230,7 @@
 
 	t.Logf("encoded to %d -> %d bytes", len(src), buf.Len())
 	dec := NewReader(&buf)
-	decoded, err := ioutil.ReadAll(dec)
+	decoded, err := io.ReadAll(dec)
 	if err != nil {
 		t.Error(err)
 		return
@@ -1370,7 +1369,7 @@
 	enc.Close()
 	t.Logf("encoded to %d -> %d bytes", len(src), buf.Len())
 	dec := NewReader(&buf)
-	decoded, err := ioutil.ReadAll(dec)
+	decoded, err := io.ReadAll(dec)
 	if err != nil {
 		t.Error(err)
 		return
@@ -1510,7 +1509,7 @@
 }
 
 func readFile(b testing.TB, filename string) []byte {
-	src, err := ioutil.ReadFile(filename)
+	src, err := os.ReadFile(filename)
 	if err != nil {
 		b.Skipf("skipping %s: %v", testOrBenchmark(b), err)
 	}
@@ -2065,12 +2064,12 @@
 		test(t, data)
 	})
 	t.Run("4f9e1a0", func(t *testing.T) {
-		comp, _ := ioutil.ReadFile("testdata/4f9e1a0da7915a3d69632f5613ed78bc998a8a23.zst")
+		comp, _ := os.ReadFile("testdata/4f9e1a0da7915a3d69632f5613ed78bc998a8a23.zst")
 		dec, _ := zstd.NewReader(bytes.NewBuffer(comp))
-		data, _ := ioutil.ReadAll(dec)
+		data, _ := io.ReadAll(dec)
 		test(t, data)
 	})
-	data, err := ioutil.ReadFile("testdata/enc_regressions.zip")
+	data, err := os.ReadFile("testdata/enc_regressions.zip")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -2088,7 +2087,7 @@
 				t.Error(err)
 				return
 			}
-			b, err := ioutil.ReadAll(r)
+			b, err := io.ReadAll(r)
 			if err != nil {
 				t.Error(err)
 				return
diff --git a/snappy/snappy_test.go b/snappy/snappy_test.go
index c212356..9cf1ad1 100644
--- a/snappy/snappy_test.go
+++ b/snappy/snappy_test.go
@@ -10,7 +10,6 @@
 	"flag"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"math/rand"
 	"net/http"
 	"os"
@@ -509,7 +508,7 @@
 
 func TestDecodeGoldenInput(t *testing.T) {
 	tDir := filepath.FromSlash(*testdataDir)
-	src, err := ioutil.ReadFile(filepath.Join(tDir, goldenCompressed))
+	src, err := os.ReadFile(filepath.Join(tDir, goldenCompressed))
 	if err != nil {
 		t.Fatalf("ReadFile: %v", err)
 	}
@@ -517,7 +516,7 @@
 	if err != nil {
 		t.Fatalf("Decode: %v", err)
 	}
-	want, err := ioutil.ReadFile(filepath.Join(tDir, goldenText))
+	want, err := os.ReadFile(filepath.Join(tDir, goldenText))
 	if err != nil {
 		t.Fatalf("ReadFile: %v", err)
 	}
@@ -615,7 +614,7 @@
 	if _, err := NewWriter(buf).Write(src); err != nil {
 		t.Fatalf("Write: encoding: %v", err)
 	}
-	dst, err := ioutil.ReadAll(NewReader(buf))
+	dst, err := io.ReadAll(NewReader(buf))
 	if err != nil {
 		t.Fatalf("ReadAll: decoding: %v", err)
 	}
@@ -708,7 +707,7 @@
 			t.Errorf("i=%#02x: Close: %v", i, err)
 			continue
 		}
-		got, err := ioutil.ReadAll(NewReader(buf))
+		got, err := io.ReadAll(NewReader(buf))
 		if err != nil {
 			t.Errorf("i=%#02x: ReadAll: %v", i, err)
 			continue
@@ -744,7 +743,7 @@
 		"\x68\x10\xe6\xb6" + // Checksum.
 		"\x61\x62\x63\x64", // Uncompressed payload: "abcd".
 	))
-	g, err := ioutil.ReadAll(r)
+	g, err := io.ReadAll(r)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -758,7 +757,7 @@
 		"\x01\x04\x00\x00" + // Uncompressed chunk, 4 bytes long.
 		"", // No payload; corrupt input.
 	))
-	if _, err := ioutil.ReadAll(r); err != ErrCorrupt {
+	if _, err := io.ReadAll(r); err != ErrCorrupt {
 		t.Fatalf("got %v, want %v", err, ErrCorrupt)
 	}
 }
@@ -772,7 +771,7 @@
 		"\x01\x05\x00\x01" + // Uncompressed chunk, n bytes long.
 		strings.Repeat("\x00", n),
 	))
-	if _, err := ioutil.ReadAll(r); err != ErrCorrupt {
+	if _, err := io.ReadAll(r); err != ErrCorrupt {
 		t.Fatalf("got %v, want %v", err, ErrCorrupt)
 	}
 }
@@ -795,7 +794,7 @@
 			continue
 		}
 		r.Reset(strings.NewReader(s))
-		got, err := ioutil.ReadAll(r)
+		got, err := io.ReadAll(r)
 		switch s {
 		case encoded:
 			if err != nil {
@@ -910,7 +909,7 @@
 					continue
 				}
 			}
-			got, err := ioutil.ReadAll(NewReader(buf))
+			got, err := io.ReadAll(NewReader(buf))
 			if err != nil {
 				t.Errorf("#%d: ReadAll: %v", i, err)
 				failed = true
@@ -945,7 +944,7 @@
 	if err := w.Flush(); err != nil {
 		t.Fatalf("Flush: %v", err)
 	}
-	got, err := ioutil.ReadAll(NewReader(buf1))
+	got, err := io.ReadAll(NewReader(buf1))
 	if err != nil {
 		t.Fatalf("ReadAll: %v", err)
 	}
@@ -1022,7 +1021,7 @@
 }
 
 func readFile(b testing.TB, filename string) []byte {
-	src, err := ioutil.ReadFile(filename)
+	src, err := os.ReadFile(filename)
 	if err != nil {
 		b.Skipf("skipping %s: %v", testOrBenchmark(b), err)
 	}
diff --git a/zlib/writer_test.go b/zlib/writer_test.go
index 5f4af64..76b5c1c 100644
--- a/zlib/writer_test.go
+++ b/zlib/writer_test.go
@@ -8,7 +8,6 @@
 	"bytes"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"os"
 	"testing"
 )
@@ -33,7 +32,7 @@
 		return
 	}
 	defer golden.Close()
-	b0, err0 := ioutil.ReadAll(golden)
+	b0, err0 := io.ReadAll(golden)
 	if err0 != nil {
 		t.Errorf("%s (level=%d, dict=%q): %v", fn, level, d, err0)
 		return
@@ -73,7 +72,7 @@
 	defer zlibr.Close()
 
 	// Compare the decompressed data.
-	b1, err1 := ioutil.ReadAll(zlibr)
+	b1, err1 := io.ReadAll(zlibr)
 	if err1 != nil {
 		t.Errorf("%s (level=%d, dict=%q): %v", fn, level, d, err1)
 		return
@@ -94,7 +93,7 @@
 	var b0 []byte
 	var err error
 	if fn != "" {
-		b0, err = ioutil.ReadFile(fn)
+		b0, err = os.ReadFile(fn)
 		if err != nil {
 			t.Errorf("%s (level=%d): %v", fn, level, err)
 			return
diff --git a/zstd/blockdec.go b/zstd/blockdec.go
index 7eed729..f52d1ae 100644
--- a/zstd/blockdec.go
+++ b/zstd/blockdec.go
@@ -10,7 +10,6 @@
 	"errors"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"os"
 	"path/filepath"
 	"sync"
@@ -651,7 +650,7 @@
 		fatalErr(binary.Write(&buf, binary.LittleEndian, hist.decoders.matchLengths.fse))
 		fatalErr(binary.Write(&buf, binary.LittleEndian, hist.decoders.offsets.fse))
 		buf.Write(in)
-		ioutil.WriteFile(filepath.Join("testdata", "seqs", fn), buf.Bytes(), os.ModePerm)
+		os.WriteFile(filepath.Join("testdata", "seqs", fn), buf.Bytes(), os.ModePerm)
 	}
 
 	return nil
diff --git a/zstd/bytebuf.go b/zstd/bytebuf.go
index 2ad0207..176788f 100644
--- a/zstd/bytebuf.go
+++ b/zstd/bytebuf.go
@@ -7,7 +7,6 @@
 import (
 	"fmt"
 	"io"
-	"io/ioutil"
 )
 
 type byteBuffer interface {
@@ -124,7 +123,7 @@
 }
 
 func (r *readerWrapper) skipN(n int64) error {
-	n2, err := io.CopyN(ioutil.Discard, r.r, n)
+	n2, err := io.CopyN(io.Discard, r.r, n)
 	if n2 != n {
 		err = io.ErrUnexpectedEOF
 	}
diff --git a/zstd/decodeheader_test.go b/zstd/decodeheader_test.go
index e6d8be2..741369c 100644
--- a/zstd/decodeheader_test.go
+++ b/zstd/decodeheader_test.go
@@ -3,7 +3,7 @@
 import (
 	"bytes"
 	"encoding/json"
-	"io/ioutil"
+	"io"
 	"os"
 	"strings"
 	"testing"
@@ -16,7 +16,7 @@
 	const regen = false
 	golden := make(map[string]Header)
 	if !regen {
-		b, err := ioutil.ReadFile("testdata/headers-want.json.zst")
+		b, err := os.ReadFile("testdata/headers-want.json.zst")
 		if err != nil {
 			t.Fatal(err)
 		}
@@ -50,7 +50,7 @@
 				return
 			}
 			defer r.Close()
-			b, err := ioutil.ReadAll(r)
+			b, err := io.ReadAll(r)
 			if err != nil {
 				t.Error(err)
 				return
diff --git a/zstd/decoder_test.go b/zstd/decoder_test.go
index 971b5cd..e3f0a2f 100644
--- a/zstd/decoder_test.go
+++ b/zstd/decoder_test.go
@@ -12,7 +12,6 @@
 	"errors"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"log"
 	"math/rand"
 	"os"
@@ -40,7 +39,7 @@
 	// The hash file will be reused between runs if present.
 	const baseFile = "testdata/backup.bin"
 	const blockSize = 1024
-	hashes, err := ioutil.ReadFile(baseFile + ".hash")
+	hashes, err := os.ReadFile(baseFile + ".hash")
 	if os.IsNotExist(err) {
 		// Create the hash file.
 		f, err := os.Open(baseFile)
@@ -70,7 +69,7 @@
 				break
 			}
 		}
-		err = ioutil.WriteFile(baseFile+".hash", hashes, os.ModePerm)
+		err = os.WriteFile(baseFile+".hash", hashes, os.ModePerm)
 		if err != nil {
 			// We can continue for now
 			t.Error(err)
@@ -103,7 +102,7 @@
 		}
 		if n > 0 {
 			if cHash+4 > len(hashes) {
-				extra, _ := io.Copy(ioutil.Discard, dec)
+				extra, _ := io.Copy(io.Discard, dec)
 				t.Fatal("not enough hashes (length mismatch). Only have", len(hashes)/4, "hashes. Got block of", n, "bytes and", extra, "bytes still on stream.")
 			}
 			_, _ = xx.Write(buf[:n])
@@ -125,7 +124,7 @@
 					buf2 := make([]byte, sizeBack+1<<20)
 					n, _ := io.ReadFull(org, buf2)
 					if n > 0 {
-						err = ioutil.WriteFile(baseFile+".section", buf2[:n], os.ModePerm)
+						err = os.WriteFile(baseFile+".section", buf2[:n], os.ModePerm)
 						if err == nil {
 							t.Log("Wrote problematic section to", baseFile+".section")
 						}
@@ -159,7 +158,7 @@
 	}
 	defer zr.Close()
 
-	_, err = ioutil.ReadAll(zr)
+	_, err = io.ReadAll(zr)
 	if !errors.Is(err, wantErr) {
 		t.Errorf("want error %v, got %v", wantErr, err)
 	}
@@ -255,7 +254,7 @@
 	var decs = make([]*Decoder, n)
 	for i := range decs {
 		// Wrap in NopCloser to avoid shortcut.
-		input := ioutil.NopCloser(bytes.NewBuffer(testdata.Bytes()))
+		input := io.NopCloser(bytes.NewBuffer(testdata.Bytes()))
 		decs[i], err = NewReader(input, WithDecoderConcurrency(1), WithDecoderLowmem(true))
 		if err != nil {
 			t.Fatal(err)
@@ -320,7 +319,7 @@
 	var decs = make([]*Decoder, n)
 	for i := range decs {
 		// Wrap in NopCloser to avoid shortcut.
-		input := ioutil.NopCloser(bytes.NewBuffer(testdata.Bytes()))
+		input := io.NopCloser(bytes.NewBuffer(testdata.Bytes()))
 		decs[i], err = NewReader(input, WithDecoderConcurrency(1), WithDecoderLowmem(false))
 		if err != nil {
 			t.Fatal(err)
@@ -374,7 +373,7 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-	_, err = io.Copy(ioutil.Discard, dec)
+	_, err = io.Copy(io.Discard, dec)
 	if err == nil {
 		dec.Close()
 		t.Fatal("Wanted error, got none")
@@ -386,7 +385,7 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-	_, err = io.Copy(ioutil.Discard, dec)
+	_, err = io.Copy(io.Discard, dec)
 	if err != nil {
 		dec.Close()
 		t.Fatalf("Wanted no error, got %+v", err)
@@ -524,7 +523,7 @@
 		t.Fatal(err)
 	}
 	defer dec.Close()
-	n, err := io.Copy(ioutil.Discard, dec)
+	n, err := io.Copy(io.Discard, dec)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -553,7 +552,7 @@
 		t.Fatal(err)
 	}
 	defer dec.Close()
-	n, err := io.Copy(ioutil.Discard, dec)
+	n, err := io.Copy(io.Discard, dec)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -584,7 +583,7 @@
 		t.SkipNow()
 	}
 	file := "testdata/z000028.zst"
-	payload, err := ioutil.ReadFile(file)
+	payload, err := os.ReadFile(file)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -666,7 +665,7 @@
 				t.Error(err)
 				return
 			}
-			got, gotErr := ioutil.ReadAll(dec)
+			got, gotErr := io.ReadAll(dec)
 			t.Log("Received:", len(got), gotErr)
 
 			// Check a fresh instance
@@ -681,7 +680,7 @@
 				return
 			}
 			defer decL.Close()
-			got2, gotErr2 := ioutil.ReadAll(decL)
+			got2, gotErr2 := io.ReadAll(decL)
 			t.Log("Fresh Reader received:", len(got2), gotErr2)
 			if gotErr != gotErr2 {
 				if gotErr != nil && gotErr2 != nil && gotErr.Error() != gotErr2.Error() {
@@ -705,7 +704,7 @@
 				t.Error(err)
 				return
 			}
-			in, err := ioutil.ReadAll(r)
+			in, err := io.ReadAll(r)
 			if err != nil {
 				t.Error(err)
 			}
@@ -743,7 +742,7 @@
 				t.Error(err)
 				return
 			}
-			in, err := ioutil.ReadAll(r)
+			in, err := io.ReadAll(r)
 			if err != nil {
 				t.Error(err)
 			}
@@ -757,7 +756,7 @@
 				return
 			}
 			defer decL.Close()
-			got2, gotErr2 := ioutil.ReadAll(decL)
+			got2, gotErr2 := io.ReadAll(decL)
 			t.Log("Reader Reader received:", len(got2), gotErr2)
 			if gotErr != gotErr2 {
 				if gotErr != nil && gotErr2 != nil && gotErr.Error() != gotErr2.Error() {
@@ -795,7 +794,7 @@
 		})
 		t.Run(fmt.Sprintf("Reader-%d", len(in)), func(t *testing.T) {
 			dec.Reset(bytes.NewReader(inb))
-			_, err := io.Copy(ioutil.Discard, dec)
+			_, err := io.Copy(io.Discard, dec)
 			if err == nil {
 				t.Error("want error, got nil")
 			}
@@ -804,7 +803,7 @@
 }
 
 func TestDecoder_Reset(t *testing.T) {
-	in, err := ioutil.ReadFile("testdata/z000028")
+	in, err := os.ReadFile("testdata/z000028")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -847,8 +846,8 @@
 			t.Fatalf("decoded reported length mismatch %d != %d", n, len(decoded))
 		}
 		if !bytes.Equal(decoded, in) {
-			ioutil.WriteFile("testdata/"+t.Name()+"-z000028.got", decoded, os.ModePerm)
-			ioutil.WriteFile("testdata/"+t.Name()+"-z000028.want", in, os.ModePerm)
+			os.WriteFile("testdata/"+t.Name()+"-z000028.got", decoded, os.ModePerm)
+			os.WriteFile("testdata/"+t.Name()+"-z000028.want", in, os.ModePerm)
 			t.Fatal("Decoded does not match")
 		}
 	}
@@ -858,13 +857,13 @@
 		if err != nil {
 			t.Fatal(err)
 		}
-		decoded, err := ioutil.ReadAll(ioutil.NopCloser(dec))
+		decoded, err := io.ReadAll(io.NopCloser(dec))
 		if err != nil {
 			t.Fatal(err)
 		}
 		if !bytes.Equal(decoded, in) {
-			ioutil.WriteFile("testdata/"+t.Name()+"-z000028.got", decoded, os.ModePerm)
-			ioutil.WriteFile("testdata/"+t.Name()+"-z000028.want", in, os.ModePerm)
+			os.WriteFile("testdata/"+t.Name()+"-z000028.got", decoded, os.ModePerm)
+			os.WriteFile("testdata/"+t.Name()+"-z000028.want", in, os.ModePerm)
 			t.Fatal("Decoded does not match")
 		}
 	}
@@ -888,7 +887,7 @@
 				t.Fatal(err)
 			}
 			defer r.Close()
-			in, err := ioutil.ReadAll(r)
+			in, err := io.ReadAll(r)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -904,7 +903,7 @@
 			if err != nil {
 				t.Fatal(err)
 			}
-			got, err := ioutil.ReadAll(dec)
+			got, err := io.ReadAll(dec)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -912,7 +911,7 @@
 			if err != nil {
 				t.Fatal(err)
 			}
-			got2, err := ioutil.ReadAll(dec)
+			got2, err := io.ReadAll(dec)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -942,7 +941,7 @@
 				t.Fatal(err)
 			}
 			defer r.Close()
-			in, err := ioutil.ReadAll(r)
+			in, err := io.ReadAll(r)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -958,7 +957,7 @@
 			if err != nil {
 				t.Fatal(err)
 			}
-			got, err := ioutil.ReadAll(dec)
+			got, err := io.ReadAll(dec)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -976,7 +975,7 @@
 			if err != nil {
 				t.Fatal(err)
 			}
-			got2, err := ioutil.ReadAll(dec)
+			got2, err := io.ReadAll(dec)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -999,7 +998,7 @@
 			t.Fatal(err)
 			return
 		}
-		want[tt.Name+".zst"], _ = ioutil.ReadAll(r)
+		want[tt.Name+".zst"], _ = io.ReadAll(r)
 	}
 
 	dec, err := newDec()
@@ -1019,13 +1018,13 @@
 				t.Error(err)
 				return
 			}
-			data, err := ioutil.ReadAll(r)
+			data, err := io.ReadAll(r)
 			r.Close()
 			if err != nil {
 				t.Error(err)
 				return
 			}
-			err = dec.Reset(ioutil.NopCloser(bytes.NewBuffer(data)))
+			err = dec.Reset(io.NopCloser(bytes.NewBuffer(data)))
 			if err != nil {
 				t.Error(err)
 				return
@@ -1035,7 +1034,7 @@
 			var wg sync.WaitGroup
 			wg.Add(1)
 			go func() {
-				got, gotError = ioutil.ReadAll(dec)
+				got, gotError = io.ReadAll(dec)
 				wg.Done()
 			}()
 
@@ -1068,12 +1067,12 @@
 				} else {
 					fileName, _ := filepath.Abs(filepath.Join("testdata", t.Name()+"-want.bin"))
 					_ = os.MkdirAll(filepath.Dir(fileName), os.ModePerm)
-					err := ioutil.WriteFile(fileName, wantB, os.ModePerm)
+					err := os.WriteFile(fileName, wantB, os.ModePerm)
 					t.Log("Wrote file", fileName, err)
 
 					fileName, _ = filepath.Abs(filepath.Join("testdata", t.Name()+"-"+name+".bin"))
 					_ = os.MkdirAll(filepath.Dir(fileName), os.ModePerm)
-					err = ioutil.WriteFile(fileName, got, os.ModePerm)
+					err = os.WriteFile(fileName, got, os.ModePerm)
 					t.Log("Wrote file", fileName, err)
 				}
 				t.Logf("Length, want: %d, got: %d", len(wantB), len(got))
@@ -1106,7 +1105,7 @@
 			t.Fatal(err)
 			return
 		}
-		want[tt.Name+".zst"], _ = ioutil.ReadAll(r)
+		want[tt.Name+".zst"], _ = io.ReadAll(r)
 	}
 
 	dec, err := newDec()
@@ -1129,7 +1128,7 @@
 				t.Error(err)
 				return
 			}
-			got, err := ioutil.ReadAll(dec)
+			got, err := io.ReadAll(dec)
 			if err == ErrCRCMismatch && !strings.Contains(tt.Name, "badsum") {
 				t.Error(err)
 				return
@@ -1174,7 +1173,7 @@
 				b.Fatal(err)
 			}
 			defer r.Close()
-			in, err := ioutil.ReadAll(r)
+			in, err := io.ReadAll(r)
 			if err != nil {
 				b.Fatal(err)
 			}
@@ -1188,7 +1187,7 @@
 			if err != nil {
 				b.Fatal(err)
 			}
-			got, err := ioutil.ReadAll(dec)
+			got, err := io.ReadAll(dec)
 			if err != nil {
 				b.Fatal(err)
 			}
@@ -1200,7 +1199,7 @@
 				if err != nil {
 					b.Fatal(err)
 				}
-				_, err := io.Copy(ioutil.Discard, dec)
+				_, err := io.Copy(io.Discard, dec)
 				if err != nil {
 					b.Fatal(err)
 				}
@@ -1227,7 +1226,7 @@
 				b.Fatal(err)
 			}
 			defer r.Close()
-			in, err := ioutil.ReadAll(r)
+			in, err := io.ReadAll(r)
 			if err != nil {
 				b.Fatal(err)
 			}
@@ -1254,7 +1253,7 @@
 			return nil
 		}
 		b.Run(filepath.Base(path), func(b *testing.B) {
-			raw, err := ioutil.ReadFile(path)
+			raw, err := os.ReadFile(path)
 			if err != nil {
 				b.Error(err)
 			}
@@ -1302,7 +1301,7 @@
 			return nil
 		}
 		b.Run(filepath.Base(path), func(b *testing.B) {
-			raw, err := ioutil.ReadFile(path)
+			raw, err := os.ReadFile(path)
 			if err != nil {
 				b.Error(err)
 			}
@@ -1367,7 +1366,7 @@
 				b.Fatal(err)
 			}
 			defer r.Close()
-			in, err := ioutil.ReadAll(r)
+			in, err := io.ReadAll(r)
 			if err != nil {
 				b.Fatal(err)
 			}
@@ -1402,7 +1401,7 @@
 		b.Fatal(err)
 	}
 
-	data, err := ioutil.ReadFile(path)
+	data, err := os.ReadFile(path)
 	if err != nil {
 		b.Fatal(err)
 	}
@@ -1410,7 +1409,7 @@
 	if err != nil {
 		b.Fatal(err)
 	}
-	n, err := io.Copy(ioutil.Discard, dec)
+	n, err := io.Copy(io.Discard, dec)
 	if err != nil {
 		b.Fatal(err)
 	}
@@ -1428,7 +1427,7 @@
 			if err != nil {
 				b.Fatal(err)
 			}
-			_, err := io.CopyN(ioutil.Discard, dec, n)
+			_, err := io.CopyN(io.Discard, dec, n)
 			if err != nil {
 				b.Fatal(err)
 			}
@@ -1449,7 +1448,7 @@
 			if err != nil {
 				b.Fatal(err)
 			}
-			_, err := io.CopyN(ioutil.Discard, dec, n)
+			_, err := io.CopyN(io.Discard, dec, n)
 			if err != nil {
 				b.Fatal(err)
 			}
@@ -1470,7 +1469,7 @@
 			if err != nil {
 				b.Fatal(err)
 			}
-			_, err := io.CopyN(ioutil.Discard, dec, n)
+			_, err := io.CopyN(io.Discard, dec, n)
 			if err != nil {
 				b.Fatal(err)
 			}
@@ -1492,7 +1491,7 @@
 				b.Fatal(err)
 			}
 			// io.Copy will use io.WriterTo
-			_, err := io.Copy(ioutil.Discard, dec)
+			_, err := io.Copy(io.Discard, dec)
 			if err != nil {
 				b.Fatal(err)
 			}
@@ -1513,7 +1512,7 @@
 				b.Fatal(err)
 			}
 			// io.Copy will use io.WriterTo
-			_, err := io.Copy(ioutil.Discard, dec)
+			_, err := io.Copy(io.Discard, dec)
 			if err != nil {
 				b.Fatal(err)
 			}
@@ -1566,7 +1565,7 @@
 			t.Fatal(err)
 			return
 		}
-		want[tt.Name+".zst"], _ = ioutil.ReadAll(r)
+		want[tt.Name+".zst"], _ = io.ReadAll(r)
 	}
 	var wg sync.WaitGroup
 	for i, tt := range zr.File {
@@ -1582,7 +1581,7 @@
 			if err != nil {
 				t.Fatal(err)
 			}
-			in, err := ioutil.ReadAll(r)
+			in, err := io.ReadAll(r)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -1602,12 +1601,12 @@
 				} else {
 					fileName, _ := filepath.Abs(filepath.Join("testdata", t.Name()+"-want.bin"))
 					_ = os.MkdirAll(filepath.Dir(fileName), os.ModePerm)
-					err := ioutil.WriteFile(fileName, wantB, os.ModePerm)
+					err := os.WriteFile(fileName, wantB, os.ModePerm)
 					t.Log("Wrote file", fileName, err)
 
 					fileName, _ = filepath.Abs(filepath.Join("testdata", t.Name()+"-got.bin"))
 					_ = os.MkdirAll(filepath.Dir(fileName), os.ModePerm)
-					err = ioutil.WriteFile(fileName, got, os.ModePerm)
+					err = os.WriteFile(fileName, got, os.ModePerm)
 					t.Log("Wrote file", fileName, err)
 				}
 				t.Logf("Length, want: %d, got: %d", len(wantB), len(got))
@@ -1639,7 +1638,7 @@
 			if err != nil {
 				t.Fatal(err)
 			}
-			in, err := ioutil.ReadAll(r)
+			in, err := io.ReadAll(r)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -1794,7 +1793,7 @@
 	}
 	defer dec.Close()
 
-	_, err = ioutil.ReadAll(dec)
+	_, err = io.ReadAll(dec)
 	if err != ErrDecoderNilInput {
 		t.Fatalf("Expected ErrDecoderNilInput when decoding from a nil reader, got %v", err)
 	}
@@ -1803,7 +1802,7 @@
 
 	dec.Reset(bytes.NewBuffer(emptyZstdBlob))
 
-	result, err := ioutil.ReadAll(dec)
+	result, err := io.ReadAll(dec)
 	if err != nil && err != io.EOF {
 		t.Fatal(err)
 	}
@@ -1813,14 +1812,14 @@
 
 	dec.Reset(nil)
 
-	_, err = ioutil.ReadAll(dec)
+	_, err = io.ReadAll(dec)
 	if err != ErrDecoderNilInput {
 		t.Fatalf("Expected ErrDecoderNilInput when decoding from a nil reader, got %v", err)
 	}
 
 	dec.Reset(bytes.NewBuffer(emptyZstdBlob))
 
-	result, err = ioutil.ReadAll(dec)
+	result, err = io.ReadAll(dec)
 	if err != nil && err != io.EOF {
 		t.Fatal(err)
 	}
@@ -1846,7 +1845,7 @@
 
 		dec.Reset(bytes.NewBuffer(zstdBlob))
 
-		_, err = ioutil.ReadAll(dec)
+		_, err = io.ReadAll(dec)
 		if err == nil {
 			t.Fatal("Expected decoding error")
 		}
@@ -1866,7 +1865,7 @@
 
 		dec.Reset(bytes.NewBuffer(zstdBlob))
 
-		res, err := ioutil.ReadAll(dec)
+		res, err := io.ReadAll(dec)
 		if err != nil {
 			t.Fatalf("Unexpected error: '%s'", err)
 		}
diff --git a/zstd/dict_test.go b/zstd/dict_test.go
index 5c587a7..872d594 100644
--- a/zstd/dict_test.go
+++ b/zstd/dict_test.go
@@ -3,7 +3,8 @@
 import (
 	"bytes"
 	"fmt"
-	"io/ioutil"
+	"io"
+	"os"
 	"strings"
 	"testing"
 
@@ -30,7 +31,7 @@
 				t.Fatal(err)
 			}
 			defer r.Close()
-			in, err := ioutil.ReadAll(r)
+			in, err := io.ReadAll(r)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -64,7 +65,7 @@
 				t.Fatal(err)
 			}
 			defer r.Close()
-			in, err := ioutil.ReadAll(r)
+			in, err := io.ReadAll(r)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -106,7 +107,7 @@
 			t.Fatal(err)
 		}
 		defer r.Close()
-		in, err := ioutil.ReadAll(r)
+		in, err := io.ReadAll(r)
 		if err != nil {
 			t.Fatal(err)
 		}
@@ -206,7 +207,7 @@
 				t.Fatal(err)
 			}
 			defer r.Close()
-			in, err := ioutil.ReadAll(r)
+			in, err := io.ReadAll(r)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -239,7 +240,7 @@
 			t.Fatal(err)
 		}
 		defer r.Close()
-		in, err := ioutil.ReadAll(r)
+		in, err := io.ReadAll(r)
 		if err != nil {
 			t.Fatal(err)
 		}
@@ -309,7 +310,7 @@
 	// All files have CRC
 	// https://files.klauspost.com/compress/zstd-dict-tests.zip
 	fn := "testdata/zstd-dict-tests.zip"
-	data, err := ioutil.ReadFile(fn)
+	data, err := os.ReadFile(fn)
 	if err != nil {
 		t.Skip("extended dict test not found.")
 	}
@@ -329,7 +330,7 @@
 				t.Fatal(err)
 			}
 			defer r.Close()
-			in, err := ioutil.ReadAll(r)
+			in, err := io.ReadAll(r)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -355,7 +356,7 @@
 				t.Fatal(err)
 			}
 			defer r.Close()
-			in, err := ioutil.ReadAll(r)
+			in, err := io.ReadAll(r)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -375,7 +376,7 @@
 	// All files have CRC
 	// https://files.klauspost.com/compress/zstd-dict-tests.zip
 	fn := "testdata/zstd-dict-tests.zip"
-	data, err := ioutil.ReadFile(fn)
+	data, err := os.ReadFile(fn)
 	if err != nil {
 		t.Skip("extended dict test not found.")
 	}
@@ -395,7 +396,7 @@
 				t.Fatal(err)
 			}
 			defer r.Close()
-			in, err := ioutil.ReadAll(r)
+			in, err := io.ReadAll(r)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -421,7 +422,7 @@
 				t.Fatal(err)
 			}
 			defer r.Close()
-			in, err := ioutil.ReadAll(r)
+			in, err := io.ReadAll(r)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -449,7 +450,7 @@
 				tb.Fatal(err)
 			}
 			defer r.Close()
-			in, err := ioutil.ReadAll(r)
+			in, err := io.ReadAll(r)
 			if err != nil {
 				tb.Fatal(err)
 			}
diff --git a/zstd/encoder_test.go b/zstd/encoder_test.go
index c289d97..52a2909 100644
--- a/zstd/encoder_test.go
+++ b/zstd/encoder_test.go
@@ -8,7 +8,6 @@
 	"bytes"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"math/rand"
 	"os"
 	"runtime"
@@ -65,7 +64,7 @@
 }
 
 func TestEncoder_EncodeAllSimple(t *testing.T) {
-	in, err := ioutil.ReadFile("testdata/z000028")
+	in, err := os.ReadFile("testdata/z000028")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -95,8 +94,8 @@
 				t.Error(err, len(decoded))
 			}
 			if !bytes.Equal(decoded, in) {
-				ioutil.WriteFile("testdata/"+t.Name()+"-z000028.got", decoded, os.ModePerm)
-				ioutil.WriteFile("testdata/"+t.Name()+"-z000028.want", in, os.ModePerm)
+				os.WriteFile("testdata/"+t.Name()+"-z000028.got", decoded, os.ModePerm)
+				os.WriteFile("testdata/"+t.Name()+"-z000028.want", in, os.ModePerm)
 				t.Fatal("Decoded does not match")
 			}
 			t.Log("Encoded content matched")
@@ -105,7 +104,7 @@
 }
 
 func TestEncoder_EncodeAllConcurrent(t *testing.T) {
-	in, err := ioutil.ReadFile("testdata/z000028")
+	in, err := os.ReadFile("testdata/z000028")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -143,8 +142,8 @@
 						t.Error(err, len(decoded))
 					}
 					if !bytes.Equal(decoded, in) {
-						//ioutil.WriteFile("testdata/"+t.Name()+"-z000028.got", decoded, os.ModePerm)
-						//ioutil.WriteFile("testdata/"+t.Name()+"-z000028.want", in, os.ModePerm)
+						//os.WriteFile("testdata/"+t.Name()+"-z000028.got", decoded, os.ModePerm)
+						//os.WriteFile("testdata/"+t.Name()+"-z000028.want", in, os.ModePerm)
 						t.Error("Decoded does not match")
 						return
 					}
@@ -166,7 +165,7 @@
 		t.Fatal(err)
 	}
 	defer dec.Close()
-	in, err := ioutil.ReadAll(dec)
+	in, err := io.ReadAll(dec)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -195,7 +194,7 @@
 				t.Error(err, len(decoded))
 			}
 			if !bytes.Equal(decoded, in) {
-				ioutil.WriteFile("testdata/"+t.Name()+"-xml.got", decoded, os.ModePerm)
+				os.WriteFile("testdata/"+t.Name()+"-xml.got", decoded, os.ModePerm)
 				t.Error("Decoded does not match")
 				return
 			}
@@ -206,7 +205,7 @@
 
 func TestEncoderRegression(t *testing.T) {
 	defer timeout(4 * time.Minute)()
-	data, err := ioutil.ReadFile("testdata/comp-crashers.zip")
+	data, err := os.ReadFile("testdata/comp-crashers.zip")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -246,7 +245,7 @@
 						t.Error(err)
 						return
 					}
-					in, err := ioutil.ReadAll(r)
+					in, err := io.ReadAll(r)
 					if err != nil {
 						t.Error(err)
 					}
@@ -281,7 +280,7 @@
 }
 
 func TestEncoder_EncodeAllTwain(t *testing.T) {
-	in, err := ioutil.ReadFile("../testdata/Mark.Twain-Tom.Sawyer.txt")
+	in, err := os.ReadFile("../testdata/Mark.Twain-Tom.Sawyer.txt")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -319,7 +318,7 @@
 						t.Error(err, len(decoded))
 					}
 					if !bytes.Equal(decoded, in) {
-						ioutil.WriteFile("testdata/"+t.Name()+"-Mark.Twain-Tom.Sawyer.txt.got", decoded, os.ModePerm)
+						os.WriteFile("testdata/"+t.Name()+"-Mark.Twain-Tom.Sawyer.txt.got", decoded, os.ModePerm)
 						t.Fatal("Decoded does not match")
 					}
 					t.Log("Encoded content matched")
@@ -330,7 +329,7 @@
 }
 
 func TestEncoder_EncodeAllPi(t *testing.T) {
-	in, err := ioutil.ReadFile("../testdata/pi.txt")
+	in, err := os.ReadFile("../testdata/pi.txt")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -368,7 +367,7 @@
 						t.Error(err, len(decoded))
 					}
 					if !bytes.Equal(decoded, in) {
-						ioutil.WriteFile("testdata/"+t.Name()+"-pi.txt.got", decoded, os.ModePerm)
+						os.WriteFile("testdata/"+t.Name()+"-pi.txt.got", decoded, os.ModePerm)
 						t.Fatal("Decoded does not match")
 					}
 					t.Log("Encoded content matched")
@@ -696,7 +695,7 @@
 	if testing.Short() {
 		t.SkipNow()
 	}
-	in, err := ioutil.ReadFile("testdata/silesia.tar")
+	in, err := os.ReadFile("testdata/silesia.tar")
 	if err != nil {
 		if os.IsNotExist(err) {
 			t.Skip("Missing testdata/silesia.tar")
@@ -722,7 +721,7 @@
 		t.Error(err, len(decoded))
 	}
 	if !bytes.Equal(decoded, in) {
-		ioutil.WriteFile("testdata/"+t.Name()+"-silesia.tar.got", decoded, os.ModePerm)
+		os.WriteFile("testdata/"+t.Name()+"-silesia.tar.got", decoded, os.ModePerm)
 		t.Fatal("Decoded does not match")
 	}
 	t.Log("Encoded content matched")
@@ -787,7 +786,7 @@
 	}
 	defer dec.Close()
 
-	gotb, err := ioutil.ReadAll(dec)
+	gotb, err := io.ReadAll(dec)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -867,7 +866,7 @@
 		t.Fatal(err)
 	}
 	defer dec.Close()
-	in, err := ioutil.ReadAll(dec)
+	in, err := io.ReadAll(dec)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -886,7 +885,7 @@
 		t.Error(err, len(decoded))
 	}
 	if !bytes.Equal(decoded, in) {
-		ioutil.WriteFile("testdata/"+t.Name()+"-enwik9.got", decoded, os.ModePerm)
+		os.WriteFile("testdata/"+t.Name()+"-enwik9.got", decoded, os.ModePerm)
 		t.Fatal("Decoded does not match")
 	}
 	t.Log("Encoded content matched")
@@ -909,7 +908,7 @@
 		t.Fatal(err)
 	}
 	defer dec.Close()
-	in, err := ioutil.ReadAll(dec)
+	in, err := io.ReadAll(dec)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -934,7 +933,7 @@
 			t.Error(err, len(decoded))
 		}
 		if !bytes.Equal(decoded, in) {
-			ioutil.WriteFile("testdata/"+t.Name()+"-enwik9.got", decoded, os.ModePerm)
+			os.WriteFile("testdata/"+t.Name()+"-enwik9.got", decoded, os.ModePerm)
 			t.Fatal("Decoded does not match")
 		}
 		t.Log("Encoded content matched")
@@ -950,7 +949,7 @@
 	if err != nil {
 		b.Fatal(err)
 	}
-	in, err := ioutil.ReadAll(dec)
+	in, err := io.ReadAll(dec)
 	if err != nil {
 		b.Fatal(err)
 	}
@@ -976,7 +975,7 @@
 	if err != nil {
 		b.Fatal(err)
 	}
-	in, err := ioutil.ReadAll(f)
+	in, err := io.ReadAll(f)
 	if err != nil {
 		b.Fatal(err)
 	}
@@ -1008,7 +1007,7 @@
 	if err != nil {
 		b.Fatal(err)
 	}
-	in, err := ioutil.ReadAll(f)
+	in, err := io.ReadAll(f)
 	if err != nil {
 		b.Fatal(err)
 	}
@@ -1041,7 +1040,7 @@
 	if err != nil {
 		b.Fatal(err)
 	}
-	in, err := ioutil.ReadAll(f)
+	in, err := io.ReadAll(f)
 	if err != nil {
 		b.Fatal(err)
 	}
@@ -1065,7 +1064,7 @@
 	if err != nil {
 		b.Fatal(err)
 	}
-	in, err := ioutil.ReadAll(f)
+	in, err := io.ReadAll(f)
 	if err != nil {
 		b.Fatal(err)
 	}
@@ -1089,7 +1088,7 @@
 	if err != nil {
 		b.Fatal(err)
 	}
-	in, err := ioutil.ReadAll(f)
+	in, err := io.ReadAll(f)
 	if err != nil {
 		b.Fatal(err)
 	}
@@ -1191,7 +1190,7 @@
 	data := make([]byte, 10<<20)
 	rng.Read(data)
 	wantSize := int64(len(data))
-	enc, _ := NewWriter(ioutil.Discard, WithEncoderLevel(SpeedFastest))
+	enc, _ := NewWriter(io.Discard, WithEncoderLevel(SpeedFastest))
 	defer enc.Close()
 	n, err := io.Copy(enc, bytes.NewBuffer(data))
 	if err != nil {
@@ -1204,7 +1203,7 @@
 	b.ReportAllocs()
 	b.SetBytes(wantSize)
 	for i := 0; i < b.N; i++ {
-		enc.Reset(ioutil.Discard)
+		enc.Reset(io.Discard)
 		n, err := io.Copy(enc, bytes.NewBuffer(data))
 		if err != nil {
 			b.Fatal(err)
@@ -1220,7 +1219,7 @@
 	data := make([]byte, 10<<20)
 	rng.Read(data)
 	wantSize := int64(len(data))
-	enc, _ := NewWriter(ioutil.Discard, WithEncoderLevel(SpeedDefault))
+	enc, _ := NewWriter(io.Discard, WithEncoderLevel(SpeedDefault))
 	defer enc.Close()
 	n, err := io.Copy(enc, bytes.NewBuffer(data))
 	if err != nil {
@@ -1233,7 +1232,7 @@
 	b.ReportAllocs()
 	b.SetBytes(wantSize)
 	for i := 0; i < b.N; i++ {
-		enc.Reset(ioutil.Discard)
+		enc.Reset(io.Discard)
 		n, err := io.Copy(enc, bytes.NewBuffer(data))
 		if err != nil {
 			b.Fatal(err)
diff --git a/zstd/fuzz_test.go b/zstd/fuzz_test.go
index 1080dc2..fbe1104 100644
--- a/zstd/fuzz_test.go
+++ b/zstd/fuzz_test.go
@@ -10,7 +10,6 @@
 	"go/parser"
 	"go/token"
 	"io"
-	"io/ioutil"
 	"os"
 	rdebug "runtime/debug"
 	"strconv"
@@ -96,8 +95,8 @@
 		if err != nil {
 			t.Fatal(err)
 		}
-		b1, err1 := ioutil.ReadAll(decLow)
-		b2, err2 := ioutil.ReadAll(decHi)
+		b1, err1 := io.ReadAll(decLow)
+		b2, err2 := io.ReadAll(decHi)
 		if err1 != err2 {
 			t.Log(err1, err2)
 		}
diff --git a/zstd/seqdec_amd64_test.go b/zstd/seqdec_amd64_test.go
index 06983e5..071fec5 100644
--- a/zstd/seqdec_amd64_test.go
+++ b/zstd/seqdec_amd64_test.go
@@ -7,7 +7,7 @@
 	"bytes"
 	"encoding/csv"
 	"fmt"
-	"io/ioutil"
+	"io"
 	"os"
 	"reflect"
 	"strconv"
@@ -42,7 +42,7 @@
 	var wantOffsets = map[string][3]int{}
 	if !writeWant {
 		fn := "testdata/seqs-want.zip"
-		data, err := ioutil.ReadFile(fn)
+		data, err := os.ReadFile(fn)
 		tb := t
 		if err != nil {
 			tb.Fatal(err)
@@ -84,7 +84,7 @@
 		}
 	}
 	fn := "testdata/seqs.zip"
-	data, err := ioutil.ReadFile(fn)
+	data, err := os.ReadFile(fn)
 	tb := t
 	if err != nil {
 		tb.Fatal(err)
@@ -104,7 +104,7 @@
 			return
 		}
 
-		seqData, err := ioutil.ReadAll(r)
+		seqData, err := io.ReadAll(r)
 		if err != nil {
 			tb.Error(err)
 			return
@@ -150,6 +150,6 @@
 	}
 	if writeWant {
 		zw.Close()
-		ioutil.WriteFile("testdata/seqs-want.zip", buf.Bytes(), os.ModePerm)
+		os.WriteFile("testdata/seqs-want.zip", buf.Bytes(), os.ModePerm)
 	}
 }
diff --git a/zstd/seqdec_test.go b/zstd/seqdec_test.go
index 82e41ff..9fe19c1 100644
--- a/zstd/seqdec_test.go
+++ b/zstd/seqdec_test.go
@@ -5,7 +5,6 @@
 	"encoding/csv"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"os"
 	"reflect"
 	"strconv"
@@ -252,7 +251,7 @@
 			return
 		}
 
-		seqData, err := ioutil.ReadAll(r)
+		seqData, err := io.ReadAll(r)
 		if err != nil {
 			tb.Error(err)
 			return
@@ -298,7 +297,7 @@
 	}
 	if writeWant {
 		zw.Close()
-		ioutil.WriteFile("testdata/seqs-want.zip", buf.Bytes(), os.ModePerm)
+		os.WriteFile("testdata/seqs-want.zip", buf.Bytes(), os.ModePerm)
 	}
 }
 
@@ -316,7 +315,7 @@
 			return
 		}
 
-		seqData, err := ioutil.ReadAll(r)
+		seqData, err := io.ReadAll(r)
 		if err != nil {
 			tb.Error(err)
 			return
@@ -369,7 +368,7 @@
 			return
 		}
 
-		seqData, err := ioutil.ReadAll(r)
+		seqData, err := io.ReadAll(r)
 		if err != nil {
 			tb.Error(err)
 			return
@@ -419,7 +418,7 @@
 			return
 		}
 
-		seqData, err := ioutil.ReadAll(r)
+		seqData, err := io.ReadAll(r)
 		if err != nil {
 			tb.Error(err)
 			return
@@ -471,7 +470,7 @@
 			return
 		}
 
-		seqData, err := ioutil.ReadAll(r)
+		seqData, err := io.ReadAll(r)
 		if err != nil {
 			tb.Error(err)
 			return
@@ -527,7 +526,7 @@
 			return
 		}
 
-		seqData, err := ioutil.ReadAll(r)
+		seqData, err := io.ReadAll(r)
 		if err != nil {
 			tb.Error(err)
 			return
@@ -576,7 +575,7 @@
 		}
 	}
 
-	data, err := ioutil.ReadFile(path)
+	data, err := os.ReadFile(path)
 	failOnError(err)
 
 	zr, err := zip.NewReader(bytes.NewReader(data), int64(len(data)))
diff --git a/zstd/snappy_test.go b/zstd/snappy_test.go
index 97674f9..f471acd 100644
--- a/zstd/snappy_test.go
+++ b/zstd/snappy_test.go
@@ -3,7 +3,6 @@
 import (
 	"bytes"
 	"io"
-	"io/ioutil"
 	"os"
 	"testing"
 
@@ -11,7 +10,7 @@
 )
 
 func TestSnappy_ConvertSimple(t *testing.T) {
-	in, err := ioutil.ReadFile("testdata/z000028")
+	in, err := os.ReadFile("testdata/z000028")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -48,7 +47,7 @@
 		t.Error(err, len(decoded))
 	}
 	if !bytes.Equal(decoded, in) {
-		ioutil.WriteFile("testdata/z000028.got", decoded, os.ModePerm)
+		os.WriteFile("testdata/z000028.got", decoded, os.ModePerm)
 		t.Fatal("Decoded does not match")
 	}
 	t.Log("Encoded content matched")
@@ -64,7 +63,7 @@
 		t.Fatal(err)
 	}
 	defer dec.Close()
-	in, err := ioutil.ReadAll(dec)
+	in, err := io.ReadAll(dec)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -95,7 +94,7 @@
 		t.Error(err, len(decoded))
 	}
 	if !bytes.Equal(decoded, in) {
-		ioutil.WriteFile("testdata/xml.got", decoded, os.ModePerm)
+		os.WriteFile("testdata/xml.got", decoded, os.ModePerm)
 		t.Fatal("Decoded does not match")
 	}
 	t.Log("Encoded content matched")
@@ -105,7 +104,7 @@
 	if testing.Short() {
 		t.SkipNow()
 	}
-	in, err := ioutil.ReadFile("testdata/silesia.tar")
+	in, err := os.ReadFile("testdata/silesia.tar")
 	if err != nil {
 		if os.IsNotExist(err) {
 			t.Skip("Missing testdata/silesia.tar")
@@ -146,7 +145,7 @@
 		t.Error(err, len(decoded))
 	}
 	if !bytes.Equal(decoded, in) {
-		ioutil.WriteFile("testdata/silesia.tar.got", decoded, os.ModePerm)
+		os.WriteFile("testdata/silesia.tar.got", decoded, os.ModePerm)
 		t.Fatal("Decoded does not match")
 	}
 	t.Log("Encoded content matched")
@@ -169,7 +168,7 @@
 		t.Fatal(err)
 	}
 	defer dec.Close()
-	in, err := ioutil.ReadAll(dec)
+	in, err := io.ReadAll(dec)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -201,7 +200,7 @@
 		t.Error(err, len(decoded))
 	}
 	if !bytes.Equal(decoded, in) {
-		ioutil.WriteFile("testdata/enwik9.got", decoded, os.ModePerm)
+		os.WriteFile("testdata/enwik9.got", decoded, os.ModePerm)
 		t.Fatal("Decoded does not match")
 	}
 	t.Log("Encoded content matched")
@@ -217,7 +216,7 @@
 		b.Fatal(err)
 	}
 	defer dec.Close()
-	in, err := ioutil.ReadAll(dec)
+	in, err := io.ReadAll(dec)
 	if err != nil {
 		b.Fatal(err)
 	}
@@ -234,7 +233,7 @@
 	}
 	s := SnappyConverter{}
 	compBytes := comp.Bytes()
-	_, err = s.Convert(&comp, ioutil.Discard)
+	_, err = s.Convert(&comp, io.Discard)
 	if err != io.EOF {
 		b.Fatal(err)
 	}
@@ -242,7 +241,7 @@
 	b.ReportAllocs()
 	b.SetBytes(int64(len(in)))
 	for i := 0; i < b.N; i++ {
-		_, err := s.Convert(bytes.NewBuffer(compBytes), ioutil.Discard)
+		_, err := s.Convert(bytes.NewBuffer(compBytes), io.Discard)
 		if err != io.EOF {
 			b.Fatal(err)
 		}
@@ -260,7 +259,7 @@
 		b.Fatal(err)
 	}
 	defer dec.Close()
-	in, err := ioutil.ReadAll(dec)
+	in, err := io.ReadAll(dec)
 	if err != nil {
 		b.Fatal(err)
 	}
@@ -278,7 +277,7 @@
 	}
 	s := SnappyConverter{}
 	compBytes := comp.Bytes()
-	_, err = s.Convert(&comp, ioutil.Discard)
+	_, err = s.Convert(&comp, io.Discard)
 	if err != io.EOF {
 		b.Fatal(err)
 	}
@@ -286,7 +285,7 @@
 	b.ReportAllocs()
 	b.SetBytes(int64(len(in)))
 	for i := 0; i < b.N; i++ {
-		_, err := s.Convert(bytes.NewBuffer(compBytes), ioutil.Discard)
+		_, err := s.Convert(bytes.NewBuffer(compBytes), io.Discard)
 		if err != io.EOF {
 			b.Fatal(err)
 		}
@@ -294,7 +293,7 @@
 }
 
 func BenchmarkSnappy_ConvertSilesia(b *testing.B) {
-	in, err := ioutil.ReadFile("testdata/silesia.tar")
+	in, err := os.ReadFile("testdata/silesia.tar")
 	if err != nil {
 		if os.IsNotExist(err) {
 			b.Skip("Missing testdata/silesia.tar")
@@ -315,7 +314,7 @@
 	}
 	s := SnappyConverter{}
 	compBytes := comp.Bytes()
-	_, err = s.Convert(&comp, ioutil.Discard)
+	_, err = s.Convert(&comp, io.Discard)
 	if err != io.EOF {
 		b.Fatal(err)
 	}
@@ -323,7 +322,7 @@
 	b.ReportAllocs()
 	b.SetBytes(int64(len(in)))
 	for i := 0; i < b.N; i++ {
-		_, err := s.Convert(bytes.NewBuffer(compBytes), ioutil.Discard)
+		_, err := s.Convert(bytes.NewBuffer(compBytes), io.Discard)
 		if err != io.EOF {
 			b.Fatal(err)
 		}
diff --git a/zstd/zip_test.go b/zstd/zip_test.go
index e4119e5..83849c7 100644
--- a/zstd/zip_test.go
+++ b/zstd/zip_test.go
@@ -4,7 +4,7 @@
 	"archive/zip"
 	"bytes"
 	"fmt"
-	"io/ioutil"
+	"io"
 
 	"github.com/klauspost/compress/zstd"
 )
@@ -54,7 +54,7 @@
 		if err != nil {
 			panic(err)
 		}
-		b, err := ioutil.ReadAll(rc)
+		b, err := io.ReadAll(rc)
 		rc.Close()
 		if bytes.Equal(b, tmp) {
 			fmt.Println(file.Name, "ok")