os io
判斷文件是否存在
func fileExist(filePath string) (bool, error) {_, err := os.Stat(filePath)if err == nil {return true, nil}if os.IsNotExist(err) {return false, nil}return false, &CheckFileExistError{filePath}
}
讀取文件內容
func readFileContext(file *os.File) (string, error) {if file == nil {return "", nil}var buf [1024]bytevar content []bytefor {n, err := file.Read(buf[:])if err == io.EOF {//結尾break} else if err != nil {log.Println("Read file error", file.Name())return "", err}content = append(content, buf[:n]...)}return string(content), nil
}
創建文件&寫入文件內容
// 如果不存在 則創建
if !exist {log.Println("create file:", filePath)newFile, err := os.Create(filePath)if err != nil {log.Panicln(err.Error())}// 寫入文件newFile.WriteString("Hello word !!!\n")newFile.Write([]byte("happy every day\n"))newFile.Close()
}
打開文件
// 打開這個文件
file1, err := os.Open(filePath)
if err != nil {log.Panicln(err.Error())
}
關閉和刪除文件
// 刪除前關閉文件,否則報錯
file1.Close()// 刪除文件
stat1, _ := file1.Stat()
if stat1 != nil {log.Println("file is not closed")
}
err = os.Remove(filePath)
if err != nil {log.Println("remove file error", filePath, err.Error())
}
log.Println("remove file success", filePath)
copy文件
func copyFile(filePath1 string, filePath2 string) error {exist, err := fileExist(filePath1)if err != nil {return err}if !exist {log.Println("file1 must exist ")return nil}file1, err := os.Open(filePath1)if err != nil {log.Println("open file1 error")return err}defer file1.Close()// 如果存在則刪除exist, err = fileExist(filePath2)if err != nil {return err}if exist {os.Remove(filePath2)}file2, err := os.Create(filePath2)if err != nil {log.Println("create file2 error")return err}defer file2.Close()var buffer [1024]bytefor {n, err := file1.Read(buffer[:])if err == io.EOF {log.Println("copy complete")break}if err != nil {log.Println("copy error")return err}file2.Write(buffer[:n])}return nil
}
綜合示例
package mainimport ("io""log""os"
)type CheckFileExistError struct {FilePath string
}func (err CheckFileExistError) Error() string {return "Check File[" + err.FilePath + "] Exist Error"
}func fileExist(filePath string) (bool, error) {_, err := os.Stat(filePath)if err == nil {return true, nil}if os.IsNotExist(err) {return false, nil}return false, &CheckFileExistError{filePath}
}func readFileContext(file *os.File) (string, error) {if file == nil {return "", nil}var buf [1024]bytevar content []bytefor {n, err := file.Read(buf[:])if err == io.EOF {//結尾break} else if err != nil {log.Println("Read file error", file.Name())return "", err}content = append(content, buf[:n]...)}return string(content), nil
}func copyFile(filePath1 string, filePath2 string) error {exist, err := fileExist(filePath1)if err != nil {return err}if !exist {log.Println("file1 must exist ")return nil}file1, err := os.Open(filePath1)if err != nil {log.Println("open file1 error")return err}defer file1.Close()// 如果存在則刪除exist, err = fileExist(filePath2)if err != nil {return err}if exist {os.Remove(filePath2)}file2, err := os.Create(filePath2)if err != nil {log.Println("create file2 error")return err}defer file2.Close()var buffer [1024]bytefor {n, err := file1.Read(buffer[:])if err == io.EOF {log.Println("copy complete")break}if err != nil {log.Println("copy error")return err}file2.Write(buffer[:n])}return nil
}func main() {log.Println("main ...")filePath := "./test.txt"filePath2 := "./test2.txt"exist, err := fileExist(filePath)log.Println("file ", filePath, "exist:", exist)if err != nil {log.Println(err.Error())}// 如果不存在 則創建if !exist {log.Println("create file:", filePath)newFile, err := os.Create(filePath)if err != nil {log.Panicln(err.Error())}// 寫入文件newFile.WriteString("Hello word !!!\n")newFile.Write([]byte("happy every day\n"))newFile.Close()}// 打開這個文件file1, err := os.Open(filePath)if err != nil {log.Panicln(err.Error())}// 讀取文件原始內容context, err := readFileContext(file1)if err != nil {log.Panicln(err.Error())}log.Println("context:", context)// 刪除前關閉文件,否則報錯file1.Close()// copy文件copyFile(filePath, filePath2)// 刪除文件stat1, _ := file1.Stat()if stat1 != nil {log.Println("file is not closed")}err = os.Remove(filePath)if err != nil {log.Println("remove file error", filePath, err.Error())}log.Println("remove file success", filePath)log.Println("success ..")
}
bufio
bufio包實現了帶緩沖區的讀寫,是對文件讀寫的封裝
bufio緩沖寫數據
模式?????? 含義
os.O_WRONLY???? 只寫
os.O_CREATE????? 創建文件
os.O_RDONLY????? 只讀
os.O_RDWR?? 讀寫
os.O_TRUNC 清空
os.O_APPEND????? 追加
package mainimport ("bufio""io""log""os"
)// 寫文件
func write(filePath string) {// 參數2:打開模式,所有模式d都在上面// 參數3是權限控制// w寫 r讀 x執行 w 2 r 4 x 1file, err := os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY, 0666)if err != nil {return}defer file.Close()// 獲取writer對象writer := bufio.NewWriter(file)for i := 0; i < 10; i++ {writer.WriteString("hello\n")}// 刷新緩沖區,強制寫出writer.Flush()
}// 讀取文件
func read(filePath string) string {file, err := os.Open(filePath)if err != nil {return ""}defer file.Close()var content []bytereader := bufio.NewReader(file)for {line, _, err := reader.ReadLine()if err == io.EOF {break}if err != nil {return ""}content = append(content, []byte(string(line)+"\n")...)}return string(content)
}func main() {log.Println("main ...")filePath := "./test1.txt"write(filePath)content := read(filePath)log.Println(content)log.Println("success ..")
}
ioutil
package mainimport ("io/ioutil""log"
)func main() {log.Println("main ...")filePath := "./test1.txt"// 寫文件err := ioutil.WriteFile(filePath, []byte("hello word"), 0666)if err != nil {log.Println(err)return}// 讀取文件content, err := ioutil.ReadFile(filePath)if err != nil {log.Println(err)return}log.Println(string(content))log.Println("success ..")
}
控制臺輸入輸出
終端其實是一個文件,相關實例如下:
os.Stdin:標準輸入的文件實例,類型為*File
os.Stdout:標準輸出的文件實例,類型為*File
os.Stderr:標準錯誤輸出的文件實例,類型為*File
以文件的方式操作終端:
package mainimport ("log""os"
)func main() {log.Println("main ...")var buf [16]byte// 從控制臺讀取一行數據os.Stdin.Read(buf[:])log.Println("read context:", string(buf[:]))// 寫入到控制臺os.Stdout.WriteString("hello word\n")log.Println("success ..")
}