all: replace io/ioutil with io and os package

For #45557

Change-Id: Icd0ff87bf46592e89cd4c88754cf07c3b0c300e6
GitHub-Last-Rev: f13b442112124c856513f1e5b6de17aa706787fe
GitHub-Pull-Request: golang/exp#43
Reviewed-on: https://go-review.googlesource.com/c/exp/+/430795
Run-TryBot: Jenny Rakoczy <jenny@golang.org>
Reviewed-by: Jenny Rakoczy <jenny@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Ian Lance Taylor <iant@google.com>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Meng Zhuo <mzh@golangcn.org>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Run-TryBot: Meng Zhuo <mzh@golangcn.org>
Auto-Submit: Jenny Rakoczy <jenny@golang.org>
diff --git a/apidiff/apidiff_test.go b/apidiff/apidiff_test.go
index 9d55e14..a13009d 100644
--- a/apidiff/apidiff_test.go
+++ b/apidiff/apidiff_test.go
@@ -4,7 +4,6 @@
 	"bufio"
 	"fmt"
 	"go/types"
-	"io/ioutil"
 	"os"
 	"os/exec"
 	"path/filepath"
@@ -18,7 +17,7 @@
 )
 
 func TestChanges(t *testing.T) {
-	dir, err := ioutil.TempDir("", "apidiff_test")
+	dir, err := os.MkdirTemp("", "apidiff_test")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -63,7 +62,7 @@
 	if err := os.MkdirAll(filepath.Join(dir, "src", "apidiff"), 0700); err != nil {
 		t.Fatal(err)
 	}
-	if err := ioutil.WriteFile(filepath.Join(dir, "src", "apidiff", "go.mod"), []byte("module apidiff\n"), 0666); err != nil {
+	if err := os.WriteFile(filepath.Join(dir, "src", "apidiff", "go.mod"), []byte("module apidiff\n"), 0666); err != nil {
 		t.Fatal(err)
 	}
 
diff --git a/cmd/gorelease/gorelease.go b/cmd/gorelease/gorelease.go
index b0ee1e9..5c2342e 100644
--- a/cmd/gorelease/gorelease.go
+++ b/cmd/gorelease/gorelease.go
@@ -88,7 +88,6 @@
 	"fmt"
 	"go/build"
 	"io"
-	"io/ioutil"
 	"log"
 	"os"
 	"os/exec"
@@ -166,7 +165,7 @@
 	// test without printing to stderr.
 	fs := flag.NewFlagSet("gorelease", flag.ContinueOnError)
 	fs.Usage = func() {}
-	fs.SetOutput(ioutil.Discard)
+	fs.SetOutput(io.Discard)
 	var baseOpt, releaseVersion string
 	fs.StringVar(&baseOpt, "base", "", "previous version to compare against")
 	fs.StringVar(&releaseVersion, "version", "", "proposed version to be released")
@@ -309,7 +308,7 @@
 		m.diagnostics = append(m.diagnostics, fmt.Sprintf("Version %s is lower than most pseudo-versions. Consider releasing v0.1.0-0 instead.", version))
 	}
 
-	m.goModData, err = ioutil.ReadFile(m.goModPath)
+	m.goModData, err = os.ReadFile(m.goModPath)
 	if err != nil {
 		return moduleInfo{}, err
 	}
@@ -371,7 +370,7 @@
 			// Modules with major version suffixes can be defined in two places
 			// (e.g., sub/go.mod and sub/v2/go.mod). They must not be defined in both.
 			if altGoModPath != "" {
-				if data, err := ioutil.ReadFile(altGoModPath); err == nil {
+				if data, err := os.ReadFile(altGoModPath); err == nil {
 					if altModPath := modfile.ModulePath(data); m.modPath == altModPath {
 						goModRel, _ := filepath.Rel(repoRoot, m.goModPath)
 						altGoModRel, _ := filepath.Rel(repoRoot, altGoModPath)
@@ -511,7 +510,7 @@
 	if m.modRoot, m.goModPath, err = downloadModule(ctx, v); err != nil {
 		return moduleInfo{}, err
 	}
-	if m.goModData, err = ioutil.ReadFile(m.goModPath); err != nil {
+	if m.goModData, err = os.ReadFile(m.goModPath); err != nil {
 		return moduleInfo{}, err
 	}
 	if m.goModFile, err = modfile.ParseLax(m.goModPath, m.goModData, nil); err != nil {
@@ -774,7 +773,7 @@
 		return "", errors.New("query is based on requirements in main go.mod file")
 	}
 
-	tmpDir, err := ioutil.TempDir("", "")
+	tmpDir, err := os.MkdirTemp("", "")
 	if err != nil {
 		return "", err
 	}
@@ -805,7 +804,7 @@
 		}
 	}()
 
-	tmpDir, err := ioutil.TempDir("", "")
+	tmpDir, err := os.MkdirTemp("", "")
 	if err != nil {
 		return nil, err
 	}
@@ -882,7 +881,7 @@
 	}
 	m := module.Version{Path: modPath, Version: version}
 
-	zipFile, err := ioutil.TempFile("", "gorelease-*.zip")
+	zipFile, err := os.CreateTemp("", "gorelease-*.zip")
 	if err != nil {
 		return "", err
 	}
@@ -891,7 +890,7 @@
 		os.Remove(zipFile.Name())
 	}()
 
-	dir, err = ioutil.TempDir("", "gorelease")
+	dir, err = os.MkdirTemp("", "gorelease")
 	if err != nil {
 		return "", err
 	}
@@ -980,7 +979,7 @@
 	// TODO(golang.org/issue/36812): 'go mod download' reads go.mod even though
 	// we don't need information about the main module or the build list.
 	// If it didn't read go.mod in this case, we wouldn't need a temp directory.
-	tmpDir, err := ioutil.TempDir("", "gorelease-download")
+	tmpDir, err := os.MkdirTemp("", "gorelease-download")
 	if err != nil {
 		return "", "", err
 	}
@@ -1073,7 +1072,7 @@
 		}
 	}
 
-	dir, err = ioutil.TempDir("", "gorelease-load")
+	dir, err = os.MkdirTemp("", "gorelease-load")
 	if err != nil {
 		return "", nil, nil, nil, nil, err
 	}
@@ -1096,15 +1095,15 @@
 	if err != nil {
 		return "", nil, nil, nil, nil, err
 	}
-	if err := ioutil.WriteFile(filepath.Join(dir, "go.mod"), goModData, 0666); err != nil {
+	if err := os.WriteFile(filepath.Join(dir, "go.mod"), goModData, 0666); err != nil {
 		return "", nil, nil, nil, nil, err
 	}
 
-	goSumData, err = ioutil.ReadFile(filepath.Join(modRoot, "go.sum"))
+	goSumData, err = os.ReadFile(filepath.Join(modRoot, "go.sum"))
 	if err != nil && !os.IsNotExist(err) {
 		return "", nil, nil, nil, nil, err
 	}
-	if err := ioutil.WriteFile(filepath.Join(dir, "go.sum"), goSumData, 0666); err != nil {
+	if err := os.WriteFile(filepath.Join(dir, "go.sum"), goSumData, 0666); err != nil {
 		return "", nil, nil, nil, nil, err
 	}
 
@@ -1119,7 +1118,7 @@
 	for _, imp := range imps {
 		fmt.Fprintf(fakeImports, "import _ %q\n", imp)
 	}
-	if err := ioutil.WriteFile(filepath.Join(dir, "tmp.go"), []byte(fakeImports.String()), 0666); err != nil {
+	if err := os.WriteFile(filepath.Join(dir, "tmp.go"), []byte(fakeImports.String()), 0666); err != nil {
 		return "", nil, nil, nil, nil, err
 	}
 
@@ -1148,7 +1147,7 @@
 	if err != nil {
 		return "", nil, nil, nil, nil, err
 	}
-	newGoModData, err := ioutil.ReadFile(goModPath)
+	newGoModData, err := os.ReadFile(goModPath)
 	if err != nil {
 		return "", nil, nil, nil, nil, err
 	}
@@ -1187,7 +1186,7 @@
 	if !cached {
 		// Check if 'go get' added new hashes to go.sum.
 		goSumPath := filepath.Join(dir, "go.sum")
-		newGoSumData, err := ioutil.ReadFile(goSumPath)
+		newGoSumData, err := os.ReadFile(goSumPath)
 		if err != nil {
 			if !os.IsNotExist(err) {
 				return "", nil, nil, nil, nil, err
diff --git a/cmd/gorelease/gorelease_test.go b/cmd/gorelease/gorelease_test.go
index 216c747..47d0892 100644
--- a/cmd/gorelease/gorelease_test.go
+++ b/cmd/gorelease/gorelease_test.go
@@ -9,7 +9,6 @@
 	"context"
 	"flag"
 	"fmt"
-	"io/ioutil"
 	"os"
 	"os/exec"
 	"path/filepath"
@@ -61,7 +60,7 @@
 	}
 	env = append(env, fmt.Sprintf("GOPROXY=%s", proxyURL))
 
-	cacheDir, err := ioutil.TempDir("", "gorelease_test-gocache")
+	cacheDir, err := os.MkdirTemp("", "gorelease_test-gocache")
 	if err != nil {
 		return nil, nil, err
 	}
@@ -267,7 +266,7 @@
 
 	wantFile.Data = want
 	data := txtar.Format(&t.Archive)
-	return ioutil.WriteFile(t.testPath, data, 0666)
+	return os.WriteFile(t.testPath, data, 0666)
 }
 
 func TestRelease(t *testing.T) {
@@ -303,7 +302,7 @@
 func TestRelease_gitRepo_uncommittedChanges(t *testing.T) {
 	ctx := context.Background()
 	buf := &bytes.Buffer{}
-	releaseDir, err := ioutil.TempDir("", "")
+	releaseDir, err := os.MkdirTemp("", "")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -314,7 +313,7 @@
 	// Create an uncommitted change.
 	bContents := `package b
 const B = "b"`
-	if err := ioutil.WriteFile(filepath.Join(releaseDir, "b.go"), []byte(bContents), 0644); err != nil {
+	if err := os.WriteFile(filepath.Join(releaseDir, "b.go"), []byte(bContents), 0644); err != nil {
 		t.Fatal(err)
 	}
 
@@ -347,7 +346,7 @@
 
 		// Extract the files in the release version. They may be part of the
 		// test archive or in testdata/mod.
-		testDir, err := ioutil.TempDir("", "")
+		testDir, err := os.MkdirTemp("", "")
 		if err != nil {
 			t.Fatal(err)
 		}
@@ -447,7 +446,7 @@
 		t.Fatal(err)
 	}
 
-	if err := ioutil.WriteFile(filepath.Join(dir, ".hg", "branch"), []byte("default"), 0777); err != nil {
+	if err := os.WriteFile(filepath.Join(dir, ".hg", "branch"), []byte("default"), 0777); err != nil {
 		t.Fatal(err)
 	}
 }
@@ -488,7 +487,7 @@
 
 	aContents := `package a
 const A = "a"`
-	if err := ioutil.WriteFile(filepath.Join(dir, "a.go"), []byte(aContents), 0644); err != nil {
+	if err := os.WriteFile(filepath.Join(dir, "a.go"), []byte(aContents), 0644); err != nil {
 		t.Fatal(err)
 	}
 
diff --git a/cmd/gorelease/proxy_test.go b/cmd/gorelease/proxy_test.go
index d91d983..d5fefd9 100644
--- a/cmd/gorelease/proxy_test.go
+++ b/cmd/gorelease/proxy_test.go
@@ -8,7 +8,6 @@
 	"bytes"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"os"
 	"path/filepath"
 	"sort"
@@ -30,7 +29,7 @@
 // versions is non-empty, only those modules in mod/ that match an entry in
 // proxyVersions will be included.
 func buildProxyDir(proxyVersions map[module.Version]bool, tests []*test) (proxyDir, proxyURL string, err error) {
-	proxyDir, err = ioutil.TempDir("", "gorelease-proxy")
+	proxyDir, err = os.MkdirTemp("", "gorelease-proxy")
 	if err != nil {
 		return "", "", err
 	}
@@ -101,7 +100,7 @@
 					haveMod = true
 				}
 				outPath := filepath.Join(modDir, version+af.Name)
-				if err := ioutil.WriteFile(outPath, af.Data, 0666); err != nil {
+				if err := os.WriteFile(outPath, af.Data, 0666); err != nil {
 					return "", "", err
 				}
 				continue
@@ -119,13 +118,13 @@
 		if !haveInfo {
 			outPath := filepath.Join(modDir, version+".info")
 			outContent := fmt.Sprintf(`{"Version":"%s"}`, version)
-			if err := ioutil.WriteFile(outPath, []byte(outContent), 0666); err != nil {
+			if err := os.WriteFile(outPath, []byte(outContent), 0666); err != nil {
 				return "", "", err
 			}
 		}
 		if !haveMod && goMod.Name != "" {
 			outPath := filepath.Join(modDir, version+".mod")
-			if err := ioutil.WriteFile(outPath, goMod.Data, 0666); err != nil {
+			if err := os.WriteFile(outPath, goMod.Data, 0666); err != nil {
 				return "", "", err
 			}
 		}
@@ -155,7 +154,7 @@
 		for _, v := range versions {
 			fmt.Fprintln(buf, v)
 		}
-		if err := ioutil.WriteFile(outPath, buf.Bytes(), 0666); err != nil {
+		if err := os.WriteFile(outPath, buf.Bytes(), 0666); err != nil {
 			return "", "", err
 		}
 		buf.Reset()
@@ -179,7 +178,7 @@
 func (f txtarFile) Path() string                { return f.f.Name }
 func (f txtarFile) Lstat() (os.FileInfo, error) { return txtarFileInfo{f.f}, nil }
 func (f txtarFile) Open() (io.ReadCloser, error) {
-	return ioutil.NopCloser(bytes.NewReader(f.f.Data)), nil
+	return io.NopCloser(bytes.NewReader(f.f.Data)), nil
 }
 
 type txtarFileInfo struct {
@@ -199,7 +198,7 @@
 		if err := os.MkdirAll(filepath.Dir(outPath), 0777); err != nil {
 			return err
 		}
-		if err := ioutil.WriteFile(outPath, f.Data, 0666); err != nil {
+		if err := os.WriteFile(outPath, f.Data, 0666); err != nil {
 			return err
 		}
 	}
diff --git a/cmd/macos-roots-test/root_darwin.go b/cmd/macos-roots-test/root_darwin.go
index b5bf0f7..46f8c39 100644
--- a/cmd/macos-roots-test/root_darwin.go
+++ b/cmd/macos-roots-test/root_darwin.go
@@ -9,7 +9,6 @@
 	"crypto/x509"
 	"encoding/pem"
 	"fmt"
-	"io/ioutil"
 	"os"
 	"os/exec"
 	"os/user"
@@ -142,7 +141,7 @@
 		Type: "CERTIFICATE", Bytes: cert.Raw,
 	})
 
-	f, err := ioutil.TempFile("", "cert")
+	f, err := os.CreateTemp("", "cert")
 	if err != nil {
 		fmt.Fprintf(os.Stderr, "can't create temporary file for cert: %v", err)
 		return false
diff --git a/cmd/txtar/txtar.go b/cmd/txtar/txtar.go
index 9beb163..85219e5 100644
--- a/cmd/txtar/txtar.go
+++ b/cmd/txtar/txtar.go
@@ -34,7 +34,7 @@
 	"bytes"
 	"flag"
 	"fmt"
-	"io/ioutil"
+	"io"
 	"os"
 	"path"
 	"path/filepath"
@@ -79,7 +79,7 @@
 }
 
 func extract() (err error) {
-	b, err := ioutil.ReadAll(os.Stdin)
+	b, err := io.ReadAll(os.Stdin)
 	if err != nil {
 		return err
 	}
@@ -114,7 +114,7 @@
 		if err := os.MkdirAll(filepath.Dir(fileName), 0777); err != nil {
 			return err
 		}
-		if err := ioutil.WriteFile(fileName, f.Data, 0666); err != nil {
+		if err := os.WriteFile(fileName, f.Data, 0666); err != nil {
 			return err
 		}
 	}
@@ -143,7 +143,7 @@
 			}
 			name := filepath.ToSlash(filepath.Join(p, suffix))
 
-			data, err := ioutil.ReadFile(fileName)
+			data, err := os.ReadFile(fileName)
 			if err != nil {
 				return err
 			}
@@ -172,7 +172,7 @@
 	timer := time.AfterFunc(200*time.Millisecond, func() {
 		fmt.Fprintln(os.Stderr, "Enter comment:")
 	})
-	comment, err := ioutil.ReadAll(os.Stdin)
+	comment, err := io.ReadAll(os.Stdin)
 	timer.Stop()
 	if err != nil {
 		return fmt.Errorf("reading comment from %s: %v", os.Stdin.Name(), err)
diff --git a/cmd/txtar/txtar_test.go b/cmd/txtar/txtar_test.go
index ea9f2bf..2242240 100644
--- a/cmd/txtar/txtar_test.go
+++ b/cmd/txtar/txtar_test.go
@@ -6,7 +6,6 @@
 
 import (
 	"fmt"
-	"io/ioutil"
 	"os"
 	"os/exec"
 	"path/filepath"
@@ -41,7 +40,7 @@
 	defer os.Unsetenv("SPECIAL_LOCATION")
 
 	// Expand the testdata archive into a temporary directory.
-	parentDir, err := ioutil.TempDir("", "txtar")
+	parentDir, err := os.MkdirTemp("", "txtar")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -68,7 +67,7 @@
 
 func TestUnsafePaths(t *testing.T) {
 	// Set up temporary directories for test archives.
-	parentDir, err := ioutil.TempDir("", "txtar")
+	parentDir, err := os.MkdirTemp("", "txtar")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -153,7 +152,7 @@
 	}
 
 	txtarBin.once.Do(func() {
-		exe, err := ioutil.TempFile("", "txtar-*.exe")
+		exe, err := os.CreateTemp("", "txtar-*.exe")
 		if err != nil {
 			txtarBin.err = err
 			return
diff --git a/ebnflint/ebnflint.go b/ebnflint/ebnflint.go
index bf8ad54..966dadf 100644
--- a/ebnflint/ebnflint.go
+++ b/ebnflint/ebnflint.go
@@ -11,7 +11,6 @@
 	"go/scanner"
 	"go/token"
 	"io"
-	"io/ioutil"
 	"os"
 	"path/filepath"
 
@@ -105,7 +104,7 @@
 		r = f
 	}
 
-	src, err := ioutil.ReadAll(r)
+	src, err := io.ReadAll(r)
 	if err != nil {
 		return err
 	}
diff --git a/event/adapter/stdlib/bench_test.go b/event/adapter/stdlib/bench_test.go
index 35cdd29..da5ddd1 100644
--- a/event/adapter/stdlib/bench_test.go
+++ b/event/adapter/stdlib/bench_test.go
@@ -8,7 +8,6 @@
 	"context"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"log"
 	"testing"
 
@@ -94,7 +93,7 @@
 }
 
 func BenchmarkStdlibLogfDiscard(b *testing.B) {
-	eventtest.RunBenchmark(b, stdlibLogger(ioutil.Discard), stdlibLog)
+	eventtest.RunBenchmark(b, stdlibLogger(io.Discard), stdlibLog)
 }
 
 func BenchmarkStdlibPrintfDiscard(b *testing.B) {
diff --git a/event/alloc_test.go b/event/alloc_test.go
index 5144645..533ef9c 100644
--- a/event/alloc_test.go
+++ b/event/alloc_test.go
@@ -9,7 +9,7 @@
 
 import (
 	"context"
-	"io/ioutil"
+	"io"
 	"testing"
 
 	"golang.org/x/exp/event"
@@ -21,7 +21,7 @@
 	anInt := event.Int64("int", 4)
 	aString := event.String("string", "value")
 
-	e := event.NewExporter(logfmt.NewHandler(ioutil.Discard), &event.ExporterOptions{EnableNamespaces: true})
+	e := event.NewExporter(logfmt.NewHandler(io.Discard), &event.ExporterOptions{EnableNamespaces: true})
 	ctx := event.WithExporter(context.Background(), e)
 	allocs := int(testing.AllocsPerRun(5, func() {
 		event.Log(ctx, "message", aString, anInt)
diff --git a/mmap/mmap_test.go b/mmap/mmap_test.go
index 797fc5f..0716cc4 100644
--- a/mmap/mmap_test.go
+++ b/mmap/mmap_test.go
@@ -7,7 +7,7 @@
 import (
 	"bytes"
 	"io"
-	"io/ioutil"
+	"os"
 	"testing"
 )
 
@@ -21,9 +21,9 @@
 	if _, err := r.ReadAt(got, 0); err != nil && err != io.EOF {
 		t.Fatalf("ReadAt: %v", err)
 	}
-	want, err := ioutil.ReadFile(filename)
+	want, err := os.ReadFile(filename)
 	if err != nil {
-		t.Fatalf("ioutil.ReadFile: %v", err)
+		t.Fatalf("os.ReadFile: %v", err)
 	}
 	if len(got) != len(want) {
 		t.Fatalf("got %d bytes, want %d", len(got), len(want))
diff --git a/shiny/driver/internal/x11key/gen.go b/shiny/driver/internal/x11key/gen.go
index 4af0660..3ce4f1e 100644
--- a/shiny/driver/internal/x11key/gen.go
+++ b/shiny/driver/internal/x11key/gen.go
@@ -13,7 +13,6 @@
 	"bytes"
 	"fmt"
 	"go/format"
-	"io/ioutil"
 	"log"
 	"os"
 	"regexp"
@@ -68,7 +67,7 @@
 		log.Fatalf("formatting output: %v", err)
 	}
 
-	err = ioutil.WriteFile("table.go", fmted, 0644)
+	err = os.WriteFile("table.go", fmted, 0644)
 	if err != nil {
 		log.Fatalf("writing table.go: %v", err)
 	}
diff --git a/shiny/iconvg/decode_test.go b/shiny/iconvg/decode_test.go
index 82356f0..33b0b7d 100644
--- a/shiny/iconvg/decode_test.go
+++ b/shiny/iconvg/decode_test.go
@@ -11,7 +11,6 @@
 	"image/color"
 	"image/draw"
 	"image/png"
-	"io/ioutil"
 	"os"
 	"path/filepath"
 	"runtime"
@@ -147,7 +146,7 @@
 
 func TestDisassembly(t *testing.T) {
 	for _, tc := range testdataTestCases {
-		ivgData, err := ioutil.ReadFile(filepath.FromSlash(tc.filename) + ".ivg")
+		ivgData, err := os.ReadFile(filepath.FromSlash(tc.filename) + ".ivg")
 		if err != nil {
 			t.Errorf("%s: ReadFile: %v", tc.filename, err)
 			continue
@@ -159,12 +158,12 @@
 		}
 		wantFilename := filepath.FromSlash(tc.filename) + ".ivg.disassembly"
 		if *updateFlag {
-			if err := ioutil.WriteFile(filepath.FromSlash(wantFilename), got, 0666); err != nil {
+			if err := os.WriteFile(filepath.FromSlash(wantFilename), got, 0666); err != nil {
 				t.Errorf("%s: WriteFile: %v", tc.filename, err)
 			}
 			continue
 		}
-		want, err := ioutil.ReadFile(wantFilename)
+		want, err := os.ReadFile(wantFilename)
 		if err != nil {
 			t.Errorf("%s: ReadFile: %v", tc.filename, err)
 			continue
@@ -180,7 +179,7 @@
 // so check that we get the original bytes after a decode + encode round-trip.
 func TestDecodeEncodeRoundTrip(t *testing.T) {
 	for _, tc := range testdataTestCases {
-		ivgData, err := ioutil.ReadFile(filepath.FromSlash(tc.filename) + ".ivg")
+		ivgData, err := os.ReadFile(filepath.FromSlash(tc.filename) + ".ivg")
 		if err != nil {
 			t.Errorf("%s: ReadFile: %v", tc.filename, err)
 			continue
@@ -226,7 +225,7 @@
 
 func TestDecodeAndRasterize(t *testing.T) {
 	for _, tc := range testdataTestCases {
-		ivgData, err := ioutil.ReadFile(filepath.FromSlash(tc.filename) + ".ivg")
+		ivgData, err := os.ReadFile(filepath.FromSlash(tc.filename) + ".ivg")
 		if err != nil {
 			t.Errorf("%s: ReadFile: %v", tc.filename, err)
 			continue
diff --git a/shiny/iconvg/encode_test.go b/shiny/iconvg/encode_test.go
index 0f41f52..57aa451 100644
--- a/shiny/iconvg/encode_test.go
+++ b/shiny/iconvg/encode_test.go
@@ -8,8 +8,8 @@
 	"bytes"
 	"flag"
 	"image/color"
-	"io/ioutil"
 	"math"
+	"os"
 	"path/filepath"
 	"runtime"
 	"strconv"
@@ -28,12 +28,12 @@
 		t.Fatalf("encoding: %v", err)
 	}
 	if *updateFlag {
-		if err := ioutil.WriteFile(filepath.FromSlash(wantFilename), got, 0666); err != nil {
+		if err := os.WriteFile(filepath.FromSlash(wantFilename), got, 0666); err != nil {
 			t.Fatalf("WriteFile: %v", err)
 		}
 		return
 	}
-	want, err := ioutil.ReadFile(filepath.FromSlash(wantFilename))
+	want, err := os.ReadFile(filepath.FromSlash(wantFilename))
 	if err != nil {
 		t.Fatalf("ReadFile: %v", err)
 	}
diff --git a/shiny/iconvg/example_test.go b/shiny/iconvg/example_test.go
index 879a1d0..7796625 100644
--- a/shiny/iconvg/example_test.go
+++ b/shiny/iconvg/example_test.go
@@ -7,7 +7,6 @@
 import (
 	"image"
 	"image/draw"
-	"io/ioutil"
 	"log"
 	"os"
 	"path/filepath"
@@ -16,7 +15,7 @@
 )
 
 func Example() {
-	ivgData, err := ioutil.ReadFile(filepath.FromSlash("testdata/action-info.lores.ivg"))
+	ivgData, err := os.ReadFile(filepath.FromSlash("testdata/action-info.lores.ivg"))
 	if err != nil {
 		log.Fatal(err)
 	}
diff --git a/shiny/iconvg/upgrade_test.go b/shiny/iconvg/upgrade_test.go
index 00a1968..0b4b175 100644
--- a/shiny/iconvg/upgrade_test.go
+++ b/shiny/iconvg/upgrade_test.go
@@ -5,14 +5,14 @@
 package iconvg
 
 import (
-	"io/ioutil"
+	"os"
 	"path/filepath"
 	"testing"
 )
 
 func TestUpgradeToFileFormatVersion1(t *testing.T) {
 	for _, tc := range testdataTestCases {
-		original, err := ioutil.ReadFile(filepath.FromSlash(tc.filename) + ".ivg")
+		original, err := os.ReadFile(filepath.FromSlash(tc.filename) + ".ivg")
 		if err != nil {
 			t.Errorf("%s: ReadFile: %v", tc.filename, err)
 			continue
diff --git a/shiny/materialdesign/colornames/gen.go b/shiny/materialdesign/colornames/gen.go
index 3969d8b..f663952 100644
--- a/shiny/materialdesign/colornames/gen.go
+++ b/shiny/materialdesign/colornames/gen.go
@@ -15,7 +15,6 @@
 	"go/format"
 	"image/color"
 	"io"
-	"io/ioutil"
 	"log"
 	"net/http"
 	"strings"
@@ -174,7 +173,7 @@
 		log.Fatalf("Error while formatting code: %s\n", err)
 	}
 
-	if err := ioutil.WriteFile("table.go", fmted, 0644); err != nil {
+	if err := os.WriteFile("table.go", fmted, 0644); err != nil {
 		log.Fatalf("Error writing table.go: %s\n", err)
 	}
 }
diff --git a/shiny/materialdesign/icons/gen.go b/shiny/materialdesign/icons/gen.go
index 473d2a7..2e95bfc 100644
--- a/shiny/materialdesign/icons/gen.go
+++ b/shiny/materialdesign/icons/gen.go
@@ -15,7 +15,6 @@
 	"fmt"
 	"go/format"
 	"io"
-	"io/ioutil"
 	"log"
 	"os"
 	"path"
@@ -169,7 +168,7 @@
 	if err != nil {
 		log.Fatalf("gofmt failed: %v\n\nGenerated code:\n%s", err, raw)
 	}
-	if err := ioutil.WriteFile("data.go", formatted, 0644); err != nil {
+	if err := os.WriteFile("data.go", formatted, 0644); err != nil {
 		log.Fatalf("WriteFile failed: %s\n", err)
 	}
 
@@ -187,7 +186,7 @@
 		if err != nil {
 			log.Fatalf("gofmt failed: %v\n\nGenerated code:\n%s", err, raw)
 		}
-		if err := ioutil.WriteFile("data_test.go", formatted, 0644); err != nil {
+		if err := os.WriteFile("data_test.go", formatted, 0644); err != nil {
 			log.Fatalf("WriteFile failed: %s\n", err)
 		}
 	}
@@ -329,7 +328,7 @@
 
 func genFile(fqSVGDirName, dirName, baseName, fileName string, size float32) error {
 	fqFileName := filepath.Join(fqSVGDirName, fileName)
-	svgData, err := ioutil.ReadFile(fqFileName)
+	svgData, err := os.ReadFile(fqFileName)
 	if err != nil {
 		return err
 	}
diff --git a/shiny/text/text_test.go b/shiny/text/text_test.go
index a2eedb9..7c93212 100644
--- a/shiny/text/text_test.go
+++ b/shiny/text/text_test.go
@@ -9,7 +9,6 @@
 	"fmt"
 	"image"
 	"io"
-	"io/ioutil"
 	"math/rand"
 	"reflect"
 	"sort"
@@ -207,7 +206,7 @@
 func testRead(f *Frame, want string) error {
 	c := f.NewCaret()
 	defer c.Close()
-	asBytes, err := ioutil.ReadAll(c)
+	asBytes, err := io.ReadAll(c)
 	if err != nil {
 		return fmt.Errorf("ReadAll: %v", err)
 	}
diff --git a/shootout/k-nucleotide-parallel.go b/shootout/k-nucleotide-parallel.go
index 8b25419..75e2c8f 100644
--- a/shootout/k-nucleotide-parallel.go
+++ b/shootout/k-nucleotide-parallel.go
@@ -42,7 +42,7 @@
 	"bufio"
 	"bytes"
 	"fmt"
-	"io/ioutil"
+	"io"
 	"os"
 	"runtime"
 	"sort"
@@ -114,7 +114,7 @@
 			break
 		}
 	}
-	data, err := ioutil.ReadAll(in)
+	data, err := io.ReadAll(in)
 	if err != nil {
 		fmt.Fprintln(os.Stderr, "ReadAll err:", err)
 		os.Exit(2)
diff --git a/shootout/k-nucleotide.go b/shootout/k-nucleotide.go
index efc8d95..6fc535d 100644
--- a/shootout/k-nucleotide.go
+++ b/shootout/k-nucleotide.go
@@ -42,7 +42,7 @@
 	"bufio"
 	"bytes"
 	"fmt"
-	"io/ioutil"
+	"io"
 	"os"
 	"sort"
 )
@@ -115,7 +115,7 @@
 			break
 		}
 	}
-	data, err := ioutil.ReadAll(in)
+	data, err := io.ReadAll(in)
 	if err != nil {
 		fmt.Fprintln(os.Stderr, "ReadAll err:", err)
 		os.Exit(2)
diff --git a/shootout/regex-dna-parallel.go b/shootout/regex-dna-parallel.go
index 68ccd76..49bb559 100644
--- a/shootout/regex-dna-parallel.go
+++ b/shootout/regex-dna-parallel.go
@@ -40,7 +40,7 @@
 
 import (
 	"fmt"
-	"io/ioutil"
+	"io"
 	"os"
 	"regexp"
 	"runtime"
@@ -92,7 +92,7 @@
 
 func main() {
 	runtime.GOMAXPROCS(4)
-	bytes, err := ioutil.ReadAll(os.Stdin)
+	bytes, err := io.ReadAll(os.Stdin)
 	if err != nil {
 		fmt.Fprintf(os.Stderr, "can't read input: %s\n", err)
 		os.Exit(2)
diff --git a/shootout/regex-dna.go b/shootout/regex-dna.go
index 85e1939..2f44137 100644
--- a/shootout/regex-dna.go
+++ b/shootout/regex-dna.go
@@ -40,7 +40,7 @@
 
 import (
 	"fmt"
-	"io/ioutil"
+	"io"
 	"os"
 	"regexp"
 )
@@ -90,7 +90,7 @@
 }
 
 func main() {
-	bytes, err := ioutil.ReadAll(os.Stdin)
+	bytes, err := io.ReadAll(os.Stdin)
 	if err != nil {
 		fmt.Fprintf(os.Stderr, "can't read input: %s\n", err)
 		os.Exit(2)
diff --git a/sumdb/gosumcheck/main.go b/sumdb/gosumcheck/main.go
index cd7aef2..ddd7400 100644
--- a/sumdb/gosumcheck/main.go
+++ b/sumdb/gosumcheck/main.go
@@ -34,7 +34,6 @@
 	"flag"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"log"
 	"net/http"
 	"os"
@@ -84,7 +83,7 @@
 	conn.SetGONOSUMDB(env)
 
 	for _, arg := range flag.Args() {
-		data, err := ioutil.ReadFile(arg)
+		data, err := os.ReadFile(arg)
 		if err != nil {
 			log.Fatal(err)
 		}
@@ -201,7 +200,7 @@
 	if resp.StatusCode != 200 {
 		return nil, fmt.Errorf("GET %v: %v", target, resp.Status)
 	}
-	data, err := ioutil.ReadAll(io.LimitReader(resp.Body, 1<<20))
+	data, err := io.ReadAll(io.LimitReader(resp.Body, 1<<20))
 	if err != nil {
 		return nil, err
 	}
diff --git a/sumdb/internal/tlog/ct_test.go b/sumdb/internal/tlog/ct_test.go
index c2d9aeb..f8c364b 100644
--- a/sumdb/internal/tlog/ct_test.go
+++ b/sumdb/internal/tlog/ct_test.go
@@ -7,7 +7,7 @@
 import (
 	"encoding/json"
 	"fmt"
-	"io/ioutil"
+	"io"
 	"net/http"
 	"net/url"
 	"os"
@@ -80,7 +80,7 @@
 		t.Fatal(err)
 	}
 	defer resp.Body.Close()
-	data, err := ioutil.ReadAll(resp.Body)
+	data, err := io.ReadAll(resp.Body)
 	if err != nil {
 		t.Fatal(err)
 	}