[Go] 파일 입출력

파일 입출력 같은 시스템에 접근하는 기능들은 os 패키지에 들어가있다.

때문에 먼저 패키지 import를 한다.

import (
	"fmt"
	"os"
)

- 생성

파일을 생성하려면 os.Create 함수에 파일명을 입력해주면 된다. 그러면 파일 객체와 성공여부가 반환된다.
만약 기존에 있는 파일을 열고싶다면 Create 대신에 Open을 사용하면 된다.

    //파일 만들기
    file, err := os.Create("text.txt")

	if err != nil {
		panic("파일 생성 실패")
	}


- 쓰기

그리고 파일 객체의 Write에 텍스트를 바이트 슬라이스를 변환해 넘겨주면 바이트가 버퍼로 넘어간다. 바로 써지는 건 아니다.

    //쓰기
	len, err := file.Write([]byte("안녕하시오"))
	if err != nil {
		panic("파일 쓰기 실패")
	}
	fmt.Printf("쓰기 성공한 길이 %d\n", len)

근데 단순히 문자열만 보낼거라면 저렇게 일일히 바이트 슬라이스로 바꾸는건 꽤나 귀찮은 일이다.
그럼 WriteString을 쓰면 된다.
위아래 코드는 같은 동작을 한다.

    //쓰기
	len, err := file.WriteString("안녕하시오")
	if err != nil {
		panic("파일 쓰기 실패")
	}
	fmt.Printf("쓰기 성공한 길이 %d\n", len)


- 닫기

닫아야 수정한 내용이 파일에 반영된다.

    //닫기
	err = file.Close()
	if err != nil {
		panic("파일 닫기 실패")
	}


package main

import (
	"fmt"
	"os"
)

func main() {
	//파일 만들기
	file, err := os.Create("text.txt")

	if err != nil {
		panic("파일 생성 실패")
	}

	//쓰기
	len, err := file.WriteString("안녕하시오")
	if err != nil {
		panic("파일 쓰기 실패")
	}
	fmt.Printf("쓰기 성공한 길이 %d\n", len)

	//닫기
	err = file.Close()
	if err != nil {
		panic("파일 닫기 실패")
	}
}

여튼 이렇게 하면 대충 이렇게 뜰 것이다.

다섯글자인데 15가 나오는건 utf-8에서 한글을 글자당 3바이트로 쪼개기 때문이다.

텍스트파일을 열어도 잘 보인다.


이제 저걸 코드로 다시 읽어보자

- 열기

아까랑 똑같다. 그냥 Open에 파일명 넣어주면 파일 객체를 생성해준다.

    //파일 열기
	file, openError := os.Open("text.txt")

	if openError != nil {
		panic("파일 생성 실패")
	}

- 읽기

이건 좀 귀찮다. 값을 받아올 슬라이스를 생성해주고 Read 함수의 파라미터로 넘겨야 한다. 그럼 슬라이스에 값이 들어올 것이다.

    //읽기
	bytes := make([]byte, 100, 100) //슬라이스를 길이 100짜리로 생성
	len, readError := file.Read(bytes)
	if readError != nil {
		panic("파일 읽기 실패")
	}
	fmt.Printf("읽기 성공한 개수: %d\n", len)
	fmt.Printf("텍스트: %s", string(bytes))

이건 WriteString같은 버전은 없다.


여튼 이러면

package main

import (
	"fmt"
	"os"
)

func main() {
	//파일 열기
	file, openError := os.Open("text.txt")

	if openError != nil {
		panic("파일 생성 실패")
	}

	//읽기
	bytes := make([]byte, 100, 100) //슬라이스를 길이 100짜리로 생성
	len, readError := file.Read(bytes)
	if readError != nil {
		panic("파일 읽기 실패")
	}
	fmt.Printf("읽기 성공한 개수: %d\n", len)
	fmt.Printf("텍스트: %s", string(bytes))

	file.Close()
}

잘 읽어올 것이다.

더 많은 기능들을 알아보고 싶다면 아래 Doc을 참고하길 바란다.
https://golang.org/pkg/os/

근데 이 기능만으론 좀 단출하고 불편하다고 느낄 수도 있다.
그런 사람들을 위한 파일처리 전용 패키지 ioutil이 존대한다.
https://golang.org/pkg/io/ioutil/

여기서는 Open이나 Close 필요없이 바로바로 파일을 쓰거나 읽어올 수 있다,
이렇게

package main

import (
	"fmt"
	"io/ioutil"
	"os"
)

func main() {
	//파일 쓰기
	ioutil.WriteFile("boom.txt",
		[]byte("김수한무 거북이와 두루미"), os.ModeDir)

	//파일 읽기
	text, _ := ioutil.ReadFile("boom.txt")
	fmt.Printf("%s", string(text))
}

잘 돌아간다.