package ioutil
import "io/ioutil"
ioutil 包实现了一些 I/O 工具函数。
已弃用:自 Go 1.16 起,相同功能现已由 io 包或 os 包提供, 新代码中应优先使用这些包的实现。 详情请参阅具体函数的文档。
Index
- Variables
- func NopCloser(r io.Reader) io.ReadCloser
- func ReadAll(r io.Reader) ([]byte, error)
- func ReadDir(dirname string) ([]fs.FileInfo, error)
- func ReadFile(filename string) ([]byte, error)
- func TempDir(dir, pattern string) (name string, err error)
- func TempFile(dir, pattern string) (f *os.File, err error)
- func WriteFile(filename string, data []byte, perm fs.FileMode) error
Examples
Variables
var Discard io.Writer = io.Discard
Discard 是一个 io.Writer,所有对它的 Write 调用都会成功执行,且不做任何实际操作。
已弃用:自 Go 1.16 起,该变量仅为 io.Discard。
Functions
func NopCloser
func NopCloser(r io.Reader) io.ReadCloser
NopCloser 返回一个包装了指定 Reader r 的 ReadCloser,其 Close 方法为空操作。
已弃用:自 Go 1.16 起,该函数仅直接调用 io.NopCloser。
func ReadAll
func ReadAll(r io.Reader) ([]byte, error)
ReadAll 从 r 中读取数据直至发生错误或 EOF,并返回读取到的数据。 调用成功时返回 err == nil,而非 err == EOF。由于 ReadAll 被定义为从数据源读取直至 EOF, 因此不会将 Read 操作返回的 EOF 视为需要上报的错误。
已弃用:自 Go 1.16 起,该函数仅直接调用 io.ReadAll。
Output:Example
package main
import (
"fmt"
"io/ioutil"
"log"
"strings"
)
func main() {
r := strings.NewReader("Go is a general-purpose language designed with systems programming in mind.")
b, err := ioutil.ReadAll(r)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s", b)
}
Go is a general-purpose language designed with systems programming in mind.
func ReadDir
func ReadDir(dirname string) ([]fs.FileInfo, error)
ReadDir 读取指定目录名的目录,并返回目录内容的 fs.FileInfo 列表, 列表按文件名排序。若读取目录时发生错误, ReadDir 会返回空的目录条目和对应的错误。
已弃用:自 Go 1.16 起,os.ReadDir 是更高效、更规范的选择: 它返回 fs.DirEntry 列表而非 fs.FileInfo, 且在目录读取中途发生错误时,会返回已读取的部分结果。
若你仍需获取 fs.FileInfo 列表,可通过以下方式实现:
entries, err := os.ReadDir(dirname)
if err != nil { ... }
infos := make([]fs.FileInfo, 0, len(entries))
for _, entry := range entries {
info, err := entry.Info()
if err != nil { ... }
infos = append(infos, info)
}
Example
package main import ( "fmt" "io/ioutil" "log" ) func main() { files, err := ioutil.ReadDir(".") if err != nil { log.Fatal(err) } for _, file := range files { fmt.Println(file.Name()) } }
func ReadFile
func ReadFile(filename string) ([]byte, error)
ReadFile 读取指定文件名的文件并返回文件内容。 调用成功时返回 err == nil,而非 err == EOF。由于 ReadFile 会读取整个文件, 因此不会将 Read 操作返回的 EOF 视为需要上报的错误。
已弃用:自 Go 1.16 起,该函数仅直接调用 os.ReadFile。
Output:Example
package main
import (
"fmt"
"io/ioutil"
"log"
)
func main() {
content, err := ioutil.ReadFile("testdata/hello")
if err != nil {
log.Fatal(err)
}
fmt.Printf("File contents: %s", content)
}
File contents: Hello, Gophers!
func TempDir
func TempDir(dir, pattern string) (name string, err error)
TempDir 在目录 dir 中创建一个新的临时目录。 目录名基于 pattern 生成,并在末尾追加一个随机字符串。 若 pattern 包含 "*",随机字符串会替换最后一个 "*"。 TempDir 返回新目录的名称。 若 dir 为空字符串,TempDir 会使用系统默认的临时文件目录 (详见 os.TempDir)。 多个程序同时调用 TempDir 不会生成重复的目录。 调用者需自行负责在不再使用时删除该目录。
已弃用:自 Go 1.17 起,该函数仅直接调用 os.MkdirTemp。
Example
package main
import (
"io/ioutil"
"log"
"os"
"path/filepath"
)
func main() {
content := []byte("temporary file's content")
dir, err := ioutil.TempDir("", "example")
if err != nil {
log.Fatal(err)
}
defer os.RemoveAll(dir) // clean up
tmpfn := filepath.Join(dir, "tmpfile")
if err := ioutil.WriteFile(tmpfn, content, 0666); err != nil {
log.Fatal(err)
}
}
Example (Suffix)
package main
import (
"io/ioutil"
"log"
"os"
"path/filepath"
)
func main() {
parentDir := os.TempDir()
logsDir, err := ioutil.TempDir(parentDir, "*-logs")
if err != nil {
log.Fatal(err)
}
defer os.RemoveAll(logsDir) // clean up
// Logs can be cleaned out earlier if needed by searching
// for all directories whose suffix ends in *-logs.
globPattern := filepath.Join(parentDir, "*-logs")
matches, err := filepath.Glob(globPattern)
if err != nil {
log.Fatalf("Failed to match %q: %v", globPattern, err)
}
for _, match := range matches {
if err := os.RemoveAll(match); err != nil {
log.Printf("Failed to remove %q: %v", match, err)
}
}
}
func TempFile
func TempFile(dir, pattern string) (f *os.File, err error)
TempFile 在目录 dir 中创建一个新的临时文件, 以读写模式打开该文件,并返回生成的 *os.File。 文件名基于 pattern 生成,并在末尾追加一个随机字符串。 若 pattern 包含 "*",随机字符串会替换最后一个 "*"。 若 dir 为空字符串,TempFile 会使用系统默认的临时文件目录 (详见 os.TempDir)。 多个程序同时调用 TempFile 不会生成重复的文件。 调用者可通过 f.Name() 获取文件的路径名。 调用者需自行负责在不再使用时删除该文件。
已弃用:自 Go 1.17 起,该函数仅直接调用 os.CreateTemp。
Example
package main
import (
"io/ioutil"
"log"
"os"
)
func main() {
content := []byte("temporary file's content")
tmpfile, err := ioutil.TempFile("", "example")
if err != nil {
log.Fatal(err)
}
defer os.Remove(tmpfile.Name()) // clean up
if _, err := tmpfile.Write(content); err != nil {
log.Fatal(err)
}
if err := tmpfile.Close(); err != nil {
log.Fatal(err)
}
}
Example (Suffix)
package main
import (
"io/ioutil"
"log"
"os"
)
func main() {
content := []byte("temporary file's content")
tmpfile, err := ioutil.TempFile("", "example.*.txt")
if err != nil {
log.Fatal(err)
}
defer os.Remove(tmpfile.Name()) // clean up
if _, err := tmpfile.Write(content); err != nil {
tmpfile.Close()
log.Fatal(err)
}
if err := tmpfile.Close(); err != nil {
log.Fatal(err)
}
}
func WriteFile
func WriteFile(filename string, data []byte, perm fs.FileMode) error
WriteFile 将数据写入指定文件名的文件。 若文件不存在,WriteFile 会以权限 perm(应用 umask 之前)创建文件; 否则 WriteFile 会在写入前截断文件,且不修改文件原有权限。
已弃用:自 Go 1.16 起,该函数仅直接调用 os.WriteFile。
Example
package main
import (
"io/ioutil"
"log"
)
func main() {
message := []byte("Hello, Gophers!")
err := ioutil.WriteFile("hello", message, 0644)
if err != nil {
log.Fatal(err)
}
}