재밌고 어려운 IT를 이해해보자~!
파일 입출력 본문
파일 입출력 스트림을 통해서 파일을 생성하고 읽고 쓸 수 있다.
FileInputStream과 FileOutputStream은
OutputStreamWriter, InputStreamReader을 통해 보조받을 수 있다. (인코딩 같은것)
BufferedInputStream, BufferedOutputStream을 쓰면
버퍼에 저장해서 한번에 옮기는식으로 하기때문에 시간이 훨씬 단축한다!
바이트단위로 파일 생성 후 쓰기 (FileOutputStream)
package study.io.bytes;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutTest {
public static void main(String[] args) {
FileOutputStream out = null;
try {
//이어쓰기(true)는 기존파일이 있다면, 이어쓰기 없다면 새로생성
//이어쓰기(false)는 기존파일이 있다면,덮어쓰기 없다면 새로 생성
out = new FileOutputStream("write.txt", false);
//write(int val)은 단일 값만 가능
out.write(97); // 아스키
out.write('B');
out.write('C');
out.write('\n');
String str = "문장을 출력합니다.";
byte[] strArray = str.getBytes();
out.write(strArray);
System.out.println("파일생성 완료");
}catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(out != null) {
out.close();
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
}
파일 읽기 (FIleInputStream)
package study.io.input;
import java.io.FileInputStream;
import java.io.IOException;
//절대경로와 상대경로
//절대경로는 물리적인 경로이다. c://program//Java// ...etc
//상대경로는 내위치를 기준으로 지정하는 경로이다.
public class FileReadExam {
public static void main(String[] args) {
// TODO Auto-generated method stub
//IO는 파일이 없을수도있고 없을수도있다 checked exception이 된다. 직접 체크해줘야한다?
FileInputStream in = null;
try {
//try catch 안에 선언되면 finally는 모른다.
// FileInputStream in = new FileInputStream("text.txt");
in = new FileInputStream("text.txt");
//파일이 끝이면 -1을 뱉는다.
//read() 메서드가 int단위로 리턴하기때문에 int로 선언
int read = 0;
while((read = in.read()) != -1) {
//read = in.read();
//아스키코드표에 의해서 문자--> 숫자로 표기하여 리턴
System.out.print((char)read); //ln을 쓰면 줄바꿈까지 읽어서 안된다.
}
}catch (IOException e) {
e.printStackTrace();
}finally {
if( in != null) {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //close 자체가 IOException을 받는 애이다.
}
}
}
}
바이트배열 buffer를 사용해 읽기
package study.io.input;
import java.io.FileInputStream;
import java.io.IOException;
//절대경로와 상대경로
//절대경로는 물리적인 경로이다. c://program//Java// ...etc
//상대경로는 내위치를 기준으로 지정하는 경로이다.
public class FileReadExam02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//IO는 파일이 없을수도있고 없을수도있다 checked exception이 된다. 직접 체크해줘야한다?
FileInputStream in = null;
try {
//try catch 안에 선언되면 finally는 모른다.
// FileInputStream in = new FileInputStream("text.txt");
in = new FileInputStream("text.txt");
//파일이 끝이면 -1을 뱉는다.
//read() 메서드가 int단위로 리턴하기때문에 int로 선언
int read = 0;
byte[] buffer = new byte[50];
//read(byte[] arr)은 리턴으로 읽은 개수
//한글이 깨지지 않을려면 바이트배열로 읽어오는게 좋다.
while((read = in.read(buffer)) != -1) {
System.out.write(buffer,0,read);//write라는 메서드는 바이트배열을 출력해줄 수 있다.
System.out.print(new String(buffer,0,read));//read 대신 buffer.length를 사용하면
//딱 맞아 떨어지지 않아 버퍼에 남아있는것들이 그대로 같이 출력되어 이상하게 된다.
//read = in.read();
//아스키코드표에 의해서 문자--> 숫자로 표기하여 리턴
//System.out.print((char)read); //ln을 쓰면 줄바꿈까지 읽어서 안된다.
}
}catch (IOException e) {
e.printStackTrace();
}finally {
if( in != null) {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //close 자체가 IOException을 받는 애이다.
}
}
}
}
바이트단위가 아닌 캐릭터단위로 읽고 쓰는 방법으로는
FileReader, FireWriter가 있다. 이밥법을 쓰면 한글이 깨지지 않는다.
'교육전 개인공부' 카테고리의 다른 글
MVC Pattern Self Practice (1) | 2023.12.18 |
---|---|
리스트로 수정해보는 로또 (1) | 2023.10.29 |
쓰레드 (0) | 2023.10.26 |
정렬, 비교, 람다 (0) | 2023.10.25 |
컬렉션 프레임워크 (2) | 2023.10.23 |
Comments