Fairy ' s
[JAVA] 입출력스트림 본문
입출력 스트림
- 컴퓨터의 키보드, 파일, 네트워크 등으로 입력된 것이 컴퓨터의 메모리에 저장되면 콘솔, 파일, 네트워크 등을 통해 출력된다.
- 데이터들은 2진수로 이루어진 바이트로 전달되고, 이러한 입출력을 자바에서 실행시키기 위해 Stream이 사용된다.
- Stream 종류
InputStream / OutputStream - 바이트 단위 입출력, 최상위 입출력 클래스
InputStreamReader / OutputStreamWriter - 문자 단위 입출력, 하위 스트림 클래스
BufferedReader / BufferedWriter - 바이트 단위 입출력, 하위 스트림 클래스
FileInputStream / FileOutputStream - 바이트 단위 입출력, 스트림 클래스
FileReader / FileWriter - 문자 단위 입출력, 하위 스트림 클래스
예제1 / Input, Reader
// 1 byte 처리 (영어 대소문자, 숫자, 특수문자 / 문자열 X)
InputStream is = System.in;
// 2 byte 처리 (InputStream + 한글 / 문자열 X)
InputStreamReader isr = new InputStreamReader(is);
// 기능이 향상된 Reader (InputStreamReader + 문자열 O)
BufferedReader br = new BufferedReader(isr);
try {
System.out.println("문자열 한줄 입력:");
String line = br.readLine();
System.out.println("입력한 문자열:"+line);
} catch (IOException e) {
e.printStackTrace();
}
- InputStream은1byte 단위 처리 스트림으로 영어 대소문자, 숫자, 특수문자를 처리할 수 있고 한글은 처리할 수 없다.
- InputStreamReader는 향상된 처리 스트림으로 2 byte 가능, 한글도 처리가 가능하다.
- BufferdReader는 문자열을 처리할 수 있다.
예제 2 / Output, Writer
// System 클래스의 out 이라는 static 필드에는 콘솔창에 출력할수 있는
// PrintStream 객체의 참조값이 들어 있다.
PrintStream ps=System.out;
// 1byte 처리
OutputStream os=ps;
// 2byte 처리
OutputStreamWriter osw=new OutputStreamWriter(os);
BufferedWriter bw=new BufferedWriter(osw);
try {
bw.write("하나\n");
bw.write("두울");
bw.newLine();
bw.write("세엣");
bw.flush();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
- .write() 를 통해 전달된 아스키코드의 문자열을 출력
- OutputStreamWriter는 2byte 처리 가능, 한글도 처리가 가능하다.
- .newLine() 는 개행 기호를 출력해주는 메서드이다. == \n
- .flush() 는 버퍼에 잔류하는 모든 바이트를 출력하는 메서드이다.
- .close() 는 사용한 시스템 자원을 반납하고 출력 스트림을 닫는 메서드이다.
예제 3 - 1 / File
// new File("새로 만들거나 제어하고 싶은 파일이나 폴더의 경로")
File f = new File("c:/");
String[] names = f.list();
// 배열에 있는 내용을 반복문 돌면서 콘솔창에 모두 출력할 수 있을까요?
for(int i=0;i<names.length;i++) {
String tmp = names[i];
System.out.println(tmp);
}
System.out.println("확장 for 문을 이용하면");
for(String tmp:names) {
System.out.println(tmp);
}
- new File("c:/")를 통해 c 드라이브를 참조값으로 받고 .list를 이용해 파일 이름 정보를 names 배열에 넣음
예제 3 - 2 / File
File cDrive = new File("c:/");
// c 드라이브에 각각의 폴더나 파일을 제어 할 수 있는 객체의 참조값을 배열로 얻어내기
File[] files = cDrive.listFiles();
for(File tmp:files) {
// 만일 디렉토리라면
if(tmp.isDirectory()) {
System.out.println("<DIR>\t"+tmp.getName());
}
else {
System.out.println(" \t"+tmp.getName());
}
}
- new File("c:/") 를 사용하여 c드라이브를 참조값으로 받고 .listFiles() 를 사용하여 c드라이브에 폴더나 파일을 제어할 수 있는 객체의 참조값을 배열로 얻어낸다.
- 만약 디렉토리이면 앞에 <DIR>을 출력하고, 폴더 또는 파일의 이름을 .getName()을 사용하여 출력
예제 4 / FileWriter
// 문자열을 저장할 파일을 만들기 위한 File 객체
File memoFile=new File("c:/developer/myFolder/memo.txt");
try {
// 파일이 이미 만들어 졌는지 여부
boolean isExist=memoFile.exists();
if(!isExist) {
// 파일을 만들어준다.
memoFile.createNewFile();
System.out.println("memo.txt 파일을 만들었습니다.");
}
// 파일에 문자열을 출력할 수 있는 객체 생성
FileWriter fw = new FileWriter(memoFile);
fw.write("이00\n");
fw.write("\t김00\n");
fw.write("\t\t박00");
fw.flush();//방출하기
fw.close();//닫아주기(마무리)
System.out.println("파일에 문자열을 저장했습니다.");
}catch(IOException ie) {
ie.printStackTrace();
}
}
- memoFile = new File(" ") 에 입력되어 있는 경로에 memo.txt 폴더를 만드는데, memoFile.exists() 를 사용하여 파일이 이미 만들어 졌는지 학인하고 없으면 .createNewFile() 을 사용하여 파일을 만들어 준다.
- FileWriter 파일에 문자열을 출력할 수 있는 객체를 생성하고 .write()를 사용하여 파일에 문자열을 출력한다.
- 출력 후 flush를 사용하여 문자열을 방출하고 close를 사용하여 파일을 닫는다.
예제 5 / FileReader
File memoFile = new File("c:/developer/myFolder/memo.txt");
try {
if(!memoFile.exists()) {
System.out.println("파일이 존재하지 않습니다.");
return; //메소드 끝내기
}
//파일에서 문자열을 읽어들일 객체
FileReader fr = new FileReader(memoFile);
//무한 루프 돌면서
while(true) {
//글자의 코드값을 하나씩 읽어온다.
int code = fr.read();
//더이상 읽을게 없다면 반복문 탈출
if(code==-1) break;
//코드값에 해당하는 char 값 얻어내기
char ch = (char) code;
//콘솔에 한글자씩 출력하기
System.out.print((char)code);
}
}catch(IOException ie) {
ie.printStackTrace();
}
- exists() 를 사용하여 파일의 존재 여부를 확인 후 존재하지 않으면 메소드를 끝낸다.
- while 문을 돌면서 .read()f 로 글자의 코드 값을 하나씩 읽어오고, code == -1이면 파일의 끝에 도달했다는 뜻이므로 반복문을 탈출한다.
- 코드는 char로 캐스팅하여 콘솔에 한 글자씩 출력한다.
예제 6 / Buffer
// 필요한 객체의 참조값을 담을 지역 변수를 미리 만든다.
FileInputStream fis=null;
FileOutputStream fos=null;
try {
fis=new FileInputStream("c:/developer/myFolder/kim1.png");
fos=new FileOutputStream("c:/developer/myFolder/kimgura.png");
// byte 알갱이를 담을 배열 객체를 미리 생성한다.
byte[] buffer=new byte[1024]; //한번에 1kilo byte 씩 읽어낼수 있다.
while(true) {
/*
* .read() 메소드를 호출하면서 byte[] 객체의 참조값을 전달하면
* 메소드안에서 읽은 byte 데이터가 배열에 자동 저장된다.
* 또한 읽은 바이트의 갯수를 메소드가 리턴해준다.
*/
int readedByte=fis.read(buffer);
//탈출조건???
if(readedByte == -1)break;
//읽은 만큼 파일에 출력하기
// .write(배열, 시작 인덱스, 출력할 총 갯수)
fos.write(buffer, 0, readedByte);
}
System.out.println("파일을 복사 했습니다.");
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(fis!=null)fis.close();
if(fos!=null)fos.close();
}catch(Exception e) {
}
}
- buffer는 한번에 원하는 바이트만큼씩 읽어낼 수 있고, 보통 1024 만큼 읽어준다.
- byte[] buffer = new byte[1024]를 사용하여 버퍼를 만든다.
- while문을 돌며 .read(buffer)을 사용하여 읽은 메시지가 버퍼에 저장된다.
- 반환 값은 무한루프가 n만큼 돈다면 1 ~ n - 1 까지는 버퍼의 크기를 반환하지만 마지막은 1024보다 같거나 작은 남은 수를 반환한다.
- if(readedByte == -1) break 를 통해 파일의 끝에 도달했다면 멈춰준다,
- fos.write(buffer, 0, readedByte) 를 사용하여 버퍼에 있는 내용을 0부터 위에서 read(buffer)의 반환값인 읽은 크기만큼의 길이를 파일에 적어준다.
'Study > JAVA' 카테고리의 다른 글
[JAVA] Thread ? (0) | 2023.01.12 |
---|---|
[JAVA] Exception / try ~ catch (0) | 2023.01.11 |
[JAVA] Wrapper Class ? (0) | 2023.01.11 |
[JAVA] Generics Class ? (0) | 2023.01.10 |
[JAVA] ArrayList ? (0) | 2023.01.10 |
Comments