back/Java

KH 33일차(IO Stream)

devel0per 2022. 8. 17. 21:27

데이터 입출력

: 데이터 입출력은 외부로부터 데이터를 입력받아 특정 장치에 기록하는 작업이다.

  키보드로부터 입력 받아서 화면에 출력하는 작업, 파일로부터 데이터를 읽어서 다시 파일에 쓰는 작업,

  네트워크를 통해 데이터를 송수신하는 작업등이 이에 해당됩니다.

 

Java는 입출력을 Stream의 개념으로 처리한다.

: 한 쪽에서 보내준 입력데이터를 다른 쪽으로 출력하는 데이터의 흐름을 Stream이라고 한다.

  데이터를 입력받을 때 inputStream, 데이터를 출력할 때 outputStream을 사용한다.

 

InputStream

메소드 설명
int available() 현재 읽을 수 있는 바이트 수를 반환한다
void close() 현재 열려있는 InputStream을 닫는다
void mark(int readlimit) InputStream에서 현재의 위치를 표시해준다
boolean markSupported() 해당 InputStream에서 mark()로 지정된 지점이 있는지에 대한 여부를 확인한다.
abstract int read() InputStream에서 한 바이트를 읽어서 int값으로 반환한다.
int read(byte[] b) byte[] b 만큼의 데이터를 읽어서 b에 저장하고 읽은 바이트 수를 반환한다.
int read(byte[] b, int off, int len) len만큼 읽어서 byte[] b의 off위치에 저장하고 읽은 바이트 수를 반환한다.
void reset() mark()를 마지막으로 호출한 위치로 이동
long skip(long n) InputStream에서 n바이트만큼 데이터를 스킵하고 바이트 수를 반환한다.

 

OutputStream

메소드 설명
void close() OutputStream을 닫는다
void flush() 버퍼에 남아있는 출력 스트림을 출력한다.
void write(byte[] b) 버퍼의 내용을 출력한다.
void write(byte[]b, int off, int len) b배열 안에 있는 시작 off부터 len만큼 출력한다.
abstract void write(int b) 정수 b의 하위 1바이트를 출력한다

 

Java의 입출력은 java.io 패키지를 이용합니다.

: Stream은 문자와 바이트 스트림으로 구성되어 있다.

  문자 스트림은 16비트 문자열을 읽거나 쓸 때 사용한다. 읽을 때는 Reader, 쓸때는 Writer 클래스의 하위 클래스를 사용한다.

  바이트 스트림은 데이터(그림파일, 동영상, 음악파일, 응용 프로그램 파일) 등을 읽을 때 InputStream 클래스의 하위 클래스를 쓸때는        outputStream의 하위 클래스를 사용한다.

 

 

Java.io 패키지의 주요 클래스 설명
File 파일 시스템의 파일 정보를 얻기 위한 클래스
Console 콘솔로부터 문자를 입출력하기 위한 클래스
InputStream / OutputStream 바이트 단위 입출력을 위한 최상위 입출력 스트림 클래스
FileInputStream / FileOutputStream 바이트 단위 입출력을 위한 하위 스트림 클래스
DataInputStream / DataOutputStream
ObjectInputStream / ObjectOutputStream
PrintStream
BufferedInputStream / BufferedOutputStream
Reader / Writer 문자 단위 입출력을 위한 최상위 입출력 스트림 클래스
FileReader / FileWriter 문자 단위 입출력을 위한 하위 스트림 클래스

InputStreamReader / OutputStreamWriter
PrinterWriter
BufferedReader / BufferedWriter

(1) File 패키지를 이용하여 image 파일에 있는 파일 목록 출력하기.

 

☆ 입력코드

import java.io.File;

public class Dir {
	public static void main(String[] args) {
		
		File dir = new File("image");
		
		String[] strs = dir.list();
		
		for(int i = 0; i < strs.length; i++) {
			int str2 = strs[i].lastIndexOf(".");
			
			String str3 = strs[i].substring(str2 + 1);
			
			if(str3.equals("gif")) {
				System.out.println(strs[i]);
			}
		}
		
		for(int i = 0; i < strs.length; i++) {
			System.out.println("현재 디렉토리 화일 : " + strs[i]);
		}
	}
}

★ 실행결과


(2) File 패키지 속에 존재하는 length, canRead, getParent, isHidden, hashCode 메소드의 사용.

 

☆ 실행코드

package ja_0817;

import java.io.File;

public class JDir {
	public static void main(String[] args) {
		
		if(args.length != 1) {
			System.out.println("사용법 : java JDIr c:\\korea.txt");
			System.exit(0);
		}
		
		// args에 들어있는 것을 file로 지정.
		File file = new File(args[0]);
		
		if(!file.exists()) {
			System.out.println(args[0] + " 화일이 존재하지 않습니다.");
			System.exit(0);
		}
		
		System.out.println("절대 경로 : " + file.getAbsolutePath());
	
	
	if(file.isDirectory()) {
		File[] list = file.listFiles();
		
		System.out.println(args[0] + " 디렉토리 화일 목록 출력");
		
		for(int i = 0; i < list.length; i++) {
			if(list[i].isFile()) {
				System.out.println(list[i].getName() + "\t :" + list[i].length());
				System.out.println();
			}else {
				System.out.println(list[i].getName() + "\t [디렉토리]");
				System.out.println();
			}
		}	
	}else {
		System.out.println(args[0] + " 파일 상세 정보");
		System.out.println("화일 크기 : " + file.length());
		System.out.println("읽기 속성 : " + file.canRead());
		System.out.println("파일 경로 : " + file.getParent());
		System.out.println("숨김 속성 : " + file.isHidden());
		System.out.println("해쉬 코드 : " + file.hashCode());
		}
	}
}

★ 실행결과


(3) FileWriter을 통해 파일 생성

 

☆ 실행코드

public class FileWrite_1 {
	public static void main(String[] args) throws Exception{
		
		String file, str;
		
		Date date = new Date();
		
		str = "File write Time \n" + date + "\n" + "ㅋㅋ ㅎㅎ ㅋㅋ \n";
		
		BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
		
		System.out.print("write file");
		file = read.readLine();
		
		System.out.println("저장할 문자열을 입력 ^^^^");
		str += read.readLine();
		
		char[] ch_str = new char[str.length()];
		
		//배열에다가 문자열 옮기기.
		str.getChars(0, str.length(), ch_str, 0);
		
		FileWriter fww = new FileWriter(file);
		
		fww.write(ch_str);
		fww.close();
		
		System.out.println(file + " 파일을 성공적으로 저장하였습니다.");
		
	}

}

★ 실행결과

BufferedReader 을 통해 입력받은 문자열이 file 변수에 저장되고 파일 속 내용이 str에 저장되어 FileWriter을 통해서 파일을 생성할 수 있다.

 

(4) FileReader을 통해 파일 읽기.

 

☆ 실행코드

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStreamReader;

public class FileReader_1 {
	public static void main(String[] args) throws Exception{
		
		int i = 0;
		
		String file;
		
		BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
		
		System.out.print("읽어올 화일 이름을 입력하세요!");
		file = read.readLine();
		
		System.out.println(file + " 문서 내용 **********");
		
		FileReader frr = new FileReader(file);
		
		// 파일이 없을 때 까지.
		while((i = frr.read()) != -1) {
			System.out.print((char) i);
		}
		
		frr.close();	
	}
}

★ 실행결과