728x90
스트림
- 데이터 생산자 또는 데이터 소비자와 프로그램 사이 데이터 흐름
- 순서가 있는 일련의 데이터흐름으로 정해진 방향으로 전달되고 순차적으로 접근할수있다.
java.io 패키지의 스트림 클래스
처리단위 | 처리방향 | 입력스트림 | 출력스트림 |
기본스트림 | 바이트스트림 | InputStream, FileInputStream, ByteArrayInputStream |
OutputStream, FileOutputStream, ByteArrayOutputStream |
문자스트림 | Reader, FileReader, CharArrayReader, StringReader |
Writer, FileWriter, CharArrayWriter, StringWriter |
|
보조스트림 | 바이트스트림 | BufferedInputStream, DataInputStream, ObjectInputStram |
BufferedOutputStream, PrintStream, DataOutputStream, ObjectOutputStream |
문자스트림 | BufferedReader | BufferedWriter, PrintWriter |
|
기타 | InputStreamReader | OutputStreamWriter |
입력스트림과 출력스트림
- 프로그램은 입력스트림으로부터 데이터를 읽을수있음
- 프로그램은 출력스트림으로 데이터를 쓸 수 있음
- 입출력스트림을 사용할때는 IOException 예외처리를 해줘야함
바이트스트림과 문자스트림
- 바이트스트림 : byte단위로 데이터다룸
- 관련클래스 : xxxInputStream, xxxOutputStream
- 캐릭터스트림 : char단위로 데이터를 다룸
- 관련클래스 : xxxReader, xxxWriter
기본스트림과 보조스트림
- 기본스트림 : 입출력 기능을 제공하는 스트림
- 보조스트림: 자체적으로 입출력 기능을 수행할수없음. 기본스트림과 함께 사용되어 보조기능을 제공하는 스트림
inputStream 클래스
바이트단위 입력스트림클래스중 최상위 추상클래스. 이것의 하위클래스는 xxxInputStream
메소드 | 설명 |
abstract int read() | 입력스트림으로부터 1바이트 읽어 정수로 리턴함 |
int read(byte[] b) | 입력스트림으로부터 읽어서 byte 배열에 저장하고, 읽어드린 바이트 개수를 리턴함 |
int read(byte[] b, int off, int len) | len 바이트를 읽어서 바이트 배열의 off 위치부터 저장함 |
int available() | 다음 read() 할때, 블로킹 없이 입력스트림에서 읽을 수 있는 바이트 단위의 데이터 길이 |
long skip(long n) | 입력스트림에서 n 바이트를 건너 뜀 |
void mark(int readlimit) | 입력스트림에서 현재 위치를 표시함 |
void reset() | mark()에서 표시된 위치로 스트림의 현재 위치를 이동 |
outputStream 클래스
바이트단위 출력스트림클래스중 최상위 추상클래스. 이것의 하위클래스는 xxxOutputStream
메소드 | 설명 |
abstract int read() | 1바이트 데이터를 출력스트림에 씀 |
void write(byte[] b) | byte형 배열 b의 모든 바이트를 출력스트림에 씀 |
void write(byte[] b, int off, int len) | byte형 배열 b의 off위치부터 len 바이트를 출력스트림에 씀 |
void close() | 출력스트림을 닫고 자원을 돌려줌 |
void flush() | 출력스트림에 남아있는 모든 데이터를 최종 목적지로 보냄 |
Reader클래스
입력용 캐릭터 단위 스트림클래스 중 최상위 추상클래스. 이것의 하위클래스는 xxxReader
메소드 | 설명 |
int read() | 입력스트림에서 1개 문자(2바이트)를 읽어 리턴함 |
int read(char[] cbuf) | 입력스트림에서 문자들을 읽어 char형 배열 cbuf에 저장하고, 읽어들인 문자의 갯수를 리턴함 |
boolean ready() | 입력스트림에 입력데이터가 준비되었으면 true를 리턴함 |
abstract void close() | 입력 스트림을 닫고 자원을 반환함 |
Writer클래스
출력용 캐릭터 단위 스트림클래스 중 최상위 추상클래스. 이것의 하위클래스는 xxxWriter
메소드 | 설명 |
void wirte(int c) | 1개의 문자(2바이트)를 출력스트림에 씀 |
void wirte(char[] cbuf) | char형 배열 cbuf의 모든 문자를 출력스트림에 씀 |
void wirte(String str) | 문자 str을 출력스트림에 씀 |
void wirte(String str, int off, int len) | 문자열 str에서 off위치부터 len개의 문자를 출력스트림에 씀 |
abstract void close() | 출력스트림을 닫고 자원을 반환함 |
void flush() | 출력스트림에 남아있는 모든 데이터를 최종 목적지로 보냄 |
📌 프로그램에서 스트림사용하기
- 프로그램에서 어떤 스트림클래스를 사용할것인가?
- 입력스트림? 출력스트림?
- 데이터 생산자와 소비자를 결정
- 기본스트림을 반드시 사용해야함
- 문자단위? 바이트단위?
- 보조스트림이 필요한가?
- 필요하다면 기본스트림 객체를 먼저생성하고
- 기본스트림을 감싸 보조스트림객체를 생성함
파일입출력
File 클래스
- 파일이나 디렉터리를 표현
- 상대 또는 절대 경로를 가짐
- 파일이나 디렉터리 정보 조회 또는 조작기능을 제공
- 이름과 경로의 조회
- 파일과 디렉토리의 생성과 삭제
- 입출력 메소드는 제공하지 않음
생성자
- File(String pathname)
- pathname은 상대 또는 절대 경로로 표현될수있음
File myFile1 = new File("D:\\eclipse\\workspace\\Test\\src");
File myFile2 = new File("notepad.exe");
주요메소드
메소드 | 설명 |
boolean exists() | File 객체로 표현된 것이 실제 파일 또는 디렉터리로 존재하는가 |
boolean isDirectory() | File 객체에 지정된 경로가 디렉터리인가 |
boolean isFile() | File 객체에 지정된 경로가 파일인가 |
String getName() | 파일 또는 디렉터리의 이름을 리턴함 |
String getPath() | 경로 전체를 리턴함 |
long length() | 파일인 경우, 크기를 바이트 단위로 리턴함 |
boolean createNewFile() | File 객체에 지정된 파일을 생성함 |
boolean delete() | File 객체에 지정된 파일이나 디렉터리를 삭제함 |
boolean mkdir() | File 객체에 지정된 것을 디렉터리로 만듦. 맨 마지막 디렉터리만 생성할 수 있음. |
boolean mkdirs() | 위와같으나 지정된 경로상의 모든 필요한 디렉터리를 생성 |
String[] list() | File 객체에 지정된 디렉터리 안에 포함된 파일과 디렉터리의 이름을 문자열 배열로 리턴함 |
File[] listFiles() | 위와 같으나 File 객체의 배열로 리턴함 |
String getParent() | 상위 디렉터리 이름을 문자열로 리턴함 |
File getParentFile() | 상위 디렉터리를 File 객체로 리턴함 |
static File[] listRoots( ) | 파일 시스템에 존재하는 루트 디렉터리를 File 객체의 배열로 리턴함 |
File 클래스 예제
디렉터리 내용을 보여주는 File 클래스 예제
import java.io.*;
public class Main {
public static void main(String args[]) {
File file = new File("c:\\windows");
File files[] = file.listFiles();
int i = 0;
while (i < files.length) {
System.out.print(files[i].getPath());
System.out.println("\t" + files[i].length());
i++;
}
}
}
//아래는 결과 예시
c: \windows\ addins 0
c: \windows\ AgSetup.logs 90624
c: \windows\ AhnInst.log 2328622
RandomAccessFile 클래스
- 파일의 임의 위치에서 읽기 또는 쓰기 연산을 지원
- 파일을 오픈하고 위치를 지정하고 읽기 또는 쓰기를 함
- 읽고 쓰는 위치는 파일 포인터가 가리킴
- 파일포인터가 가리키는 위치부터 바이트단위로 읽거나 쓸수있음
- byte단위로 읽고쓰며 읽거나 쓸 때 파일 포인터가 이동됨
- 랜덤 엑세스 파일을 커다란 byte배열로 볼수있음
생성자
- RandomAccessFile(File file, String mode),
- RandomAccessFile(String name, String mode)
- mode는 읽기 전용의 r 또는 읽기/쓰기 겸용의 w
메소드 | 설명 |
int read() | 파일로부터 1바이트를 읽어 리함 |
int read(byte[] b) | 파일로부터 읽어 byte 배열에 저장함 |
int read(byte[] b, int off, int len) | 파일로부터 최대 len 바이트를 읽어 nyte형 배열의 off위치부터 저장함 |
void seek(long pos) | pos에 지정된 위치로 파일 포인터를 이동함 |
void write(byte[] b) | byte배열의 내용을 파일에 씀 |
void write(byte[] b, int off, int len) | byte배열에서 off위치부터 len 바이트를 파일에 씀 |
RandomAccessFile 클래스 예제
기록했던 바이트값들을 역순으로 출력하는 예제
import java.io.*;
public class Main {
public static void main(String args[]) {
try (RandomAccessFile raf = new RandomAccessFile("c:\\java\\test.txt", "rw")) {
for (int i = 0; i < 10; i++)
raf.write(i);
for (int i = 9; i >= 0; i--) {
raf.seek(i);
System.out.print(raf.read());
}
raf.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
//아래는 결과 예시
9876543210
FileInputStream 과 FileOutputStream 클래스
- 파일로부터 데이터를 읽기/쓰기 위한 입력/출력용 기본스트림
- 바이트단위의 입력/출력을 처리하므로 이미지나 오디오파일과 같은 이진파일을 다룰 때 유용
FileInputStream 클래스 생성자
기존의 파일과 연결된 입력스트림 객체를 생성
- FileInputStream(File file)
- FileInputStream(String name)
FileOutputStream 클래스 생성자
기존파일(없다면 생성) 과 연결된 출력스트림 객체를 생성
- FileOutputStream( String name)
- FileOutputStream( File file , boolean append)
FileInputStream , FileOutputStream 클래스 예제
inFile을 읽어서 outFile로 복사하는 예제
import java.io.*;
public class Main {
public static void main(String args[]). {
File inFile = new File("c:\\Java\\Main.java");
File outFile = new File("c:\\Java\\FileTemp.java");
try (InputStream is = new FileInputStream(inFile);
OutputStream os = new FileOutputStream(outFile)) {
int nData;
nData = is.read();
while (nData != -1) {
os.write(nData);
nData = is.read();
} catch
} catch (Exception e) {
System.out.println(è);
}
}
}
FileReader와 FileWriter클래스
- 텍스트파일을 읽거나 쓰는데 사용되는 기본스트림
- 문자단위로 입력 또는 출력을 처리
FileReader 클래스의 생성자
- FileReader(File file)
- FileReader(String fileName)
FileWriter 클래스의 생성자
- FileWriter(File file)
- FileWriter(String fileName)
- FileWriter(File file, boolean append)
콘솔입출력
Console 클래스
- 콘솔입출력을제공하는 클래스
- System.console()을 사용하여 콘솔객체를 생성
메소드 | 설명 |
String readLine() | 콘솔에서 한 라인을 읽음 |
char[ ] readPassword() | 콘솔에서 비밀번호를 읽음. 비밀번호를 입력할 때 화면에 보이지 않음 |
PrintWriter writer() | 콘솔과 연결된 PrintWiter 객체를 리턴함 |
Reader reader() | 콘솔과 연결된 Reader 객체를 리턴함 |
import java.io.*;
public class Main {
public static void main(String args[]) {
String name;
char[] pw;
Console con = System.console();
System.out.print("name");
name = con.readLine();
System.out.print("password: ");
pw = con.readPassword();
con.printf("name: %s\n", name);
con.printf("password: %s\n", new String(pw));
}
}
//아래는 결과 예시
name : kdhong
password :
name : kdhong
password : qwe1@3$
보조스트림
- 기본스트림의 성능이나 편의성을 높이는 보조기능을 제공하는 스트림
- 입출력기능은 기본스트림을 이용해야함
- 기본스트림객체를 먼저 생성하고 그것을 보조스트림객체를 생성할때, 생성자의 인자로 이용함
보조스트림 종류
- 버퍼링 기능의 제공
- BufferedInputStream, BufferedOutputStream
- BufferedReader, BufferedWriter
- Java의 기본 자료형을 그대로 읽기/쓰기 위한 기능의 제공
- DataInputStream, DataOutputStream
- 다양한 출력 형식의 제공
- PrintStream, PrintWriter
- 텍스트 파일을 라인 단위로 읽거나 라인 번호를 관리하는 메소드 제공
- LineNumberReader
- 바이트 스트림과 캐릭터 스트림의 호환
- InputStreamReader, OutputStreamWriter
LineNumberReader
- 텍스트 파일을 라인 단위로 읽어 들이는 메소드를 제공
- BufferedReader의 서브 클래스
- 주요 메소드
- int (read), String readLine(), int getLineNumber(), long skip(long)
import java.io.*;
public class Main {
public static void main(String args[]) {
try (FileReader fr = new FileReader(new File("c:\\Java\\Main.java"));
LineNumberReader rd = new LineNumberReader(fr)) {
String line;
while ((line = rd.readLine()) != null) {
System.out.println(line);
} catch (Exception e) {
System.out.println(e);
}
}
}
InputStreamReader
- 바이트 입력 스트림을 캐릭터 입력 스트림으로 변환해 주는 클래스
- 바이트 단위로 읽히는 스트림을 문자 단위로 읽을 수 있게 함
- 특정 문자인코딩을 사용하여 변환할 수 있음
- 생성자
- InputStreamReader(InputStream in , Charset cs)
- 주요 메소드
- int read(), int read(char[] cbuf, int offset, int length)
try (InputStreamReader is = new InputStreamReader(System.in, "euc-kr")) {
while ((i = isr.read()) != '끝') {
System.out.print((char) i);
}
} catch (Exception e) {
System.out.println(e);
}
//아래는 결과 예시
abc
abc
한국
한국
땅끝
땅
728x90
'STUDY > JAVA' 카테고리의 다른 글
[JAVA] jdk 2개 이상 설정 방법 (java 버전 여러개 사용하기) (0) | 2024.10.11 |
---|---|
[JAVA] 자바 쉘 스크립트 실행 방법 (0) | 2024.08.13 |
[JAVA] 자바 파일 권한 변경 방법 (0) | 2024.07.30 |
[Java] 기본형 매개변수, 참조형 매개변수, 참조형 반환값 (1) | 2024.06.10 |
[JAVA] 자바 타이머 Timer, TimerTask (0) | 2024.06.10 |