I/O
- java.io 패키지의 클래스
- 애플리케이션에서 리소스를 읽어오거나, 애플리케이션의 데이터를 목적지로 출력하는 작업을 수행하는 클래스
ByteStream
- 한 번 1byte씩 읽거나 쓰는 스트림
- InputStream과 OutputStream이 있다.
InputStream 클래스
- 스트림객체로 1byte씩 읽어오는 스트림이다.
InputStream의 주요 메소드
메소드 종류 | 메소드 수행내용 |
int read() | 한 바이트씩 읽어서 반환한다. 스트림의 끝에 도달하면 -1을 반환한다. |
int read(byte[] buf) | 지정된 byte[]배열에 한 바이트씩 저장한다. 반환되는 값은 배열에 저장된 데이터의 갯수다. 스트림의 끝에 도달하면 -1을 반환한다. |
void close() | 애플리케이션이 사용했던 시스템의 입출력 자원을 반환한다. |
InputStream의 주요 클래스
클래스 종류 | 클래스 내용 |
FileInputStream | 지정된 파일의 데이터를 1바이트씩 읽어온다. |
BufferedInputStream | 다른 InputStream과 연결해서 사용하는 보조스트림이다. 읽기 성능을 향상시킨다. |
DataInputStream | DataOutputStream으로 출력한 내용을 읽어오는 스트림이다. readInt(), readLong(), readDouble(), readUTF()와 같은 메소드를 사용해서 타입 그대로 읽어올 수 있다. |
ObjectInputStream | ObjectOutputStream으로 직렬화된 객체를 역직렬화해서 객체로 복원한다. readObject() 메소드를 사용해서 직렬화된 객체를 스트림으로 읽어서 역직렬화 시킨다. |
ByteArrayInputStream | Byte배열에서 읽어온다. |
PipedInputStream | 멀티스레드 환경에서 사용하는 스트림이다. |
InputStream 사용 예시
public class InputStreamApp1 {
public static void main(String[] args) throws Exception{
/*
* FileInputStream
* - 파일의 내용을 1byte씩 읽어오는 스트림객체다
*/
// src/io1/app1.txt을 읽어오는 FileInputStream 객체를 생성
FileInputStream in = new FileInputStream("src/io1/app1.txt");
// 스트림이 읽어오는 데이터를 1바이트씩 읽어오기
int value = 0;
while((value = in.read()) != -1) {
System.out.println((char)value);
}
in.close();
}
}
public class InputStreamApp2 {
public static void main(String[] args) throws Exception{
FileInputStream in = new FileInputStream("src/io1/app2.txt");
// 주석처리된 구문보다 배열[]을 사용하는 것이 더 빠르고 효율적이다
// int value = 0;
//
// while((value = in.read()) != -1) {
// System.out.print((char)value);
// }
//
// in.close();
byte[] buf = new byte[1024];
int len = 0;
while( (len = in.read(buf))!= -1) {
String text = new String(buf,0,len);
System.out.println(text);
}
in.close();
}
}
OutputStream 클래스
- 스트림객체로 1byte씩 출력하는 스트림이다.
OutputStream의 주요 메소드
메소드 종류 | 메소드 수행내용 |
void write(int data) | 한 바이트씩 출력한다. |
void write(byte[]) | 지정된 byte[]배열에 저장된 데이터를 출력한다. |
void write(byte[] buf, int offset, int length) | 지정된 byte[]배열에 저장된 데이터를 offset위치부터 lengh만큼 출력한다. |
void flush() | 스트림의 내부저장소가 채워지지 않아도 강제로 목적지로 출력시킨다. |
void close() | 애플리케이션이 사용했던 시스템의 입출력 자원을 반환한다. |
OutputStream의 주요 클래스
클래스 종류 | 클래스 내용 |
FileOutputStream | 파일로 1 byte씩 출력하는 스트림 |
BufferedOutputStream | 연결된 InputStream의 쓰기 성능을 향상시키는 스트림 |
DataOutputStream | 연결된 InputStream으로 값을 기본자료형이나 String형태로 출력하는 스트림이다. |
ObjectOutputStream | 객체를 직렬화해서 연결된 스트림으로 출력하는 스트림이다. |
ByteArrayOutputStream | 바이트배열에 출력한다. |
PipedOutputStream | 멀티스레드 환경에서 사용하는 스트림이다. |
PrintStream | 출력전용 스트림이다. |
OutputStream 사용 예시
public class OutputStreamApp1 {
public static void main(String[] args) throws Exception {
FileOutputStream out = new FileOutputStream("src/io1/app3.txt");
out.write(31);
out.write(32);
out.write(33);
out.write(34);
out.write(35);
out.write(36);
String str = "안녕하세요";
// 안 -> [1110xxxx] [10xxxxxx] [10xxxxxx]
// 녕 -> [1110xxxx] [10xxxxxx] [10xxxxxx]
// 하 -> [1110xxxx] [10xxxxxx] [10xxxxxx]
// 세 -> [1110xxxx] [10xxxxxx] [10xxxxxx]
// 요 -> [1110xxxx] [10xxxxxx] [10xxxxxx]
/*
* byte[] getBytes()
* - 문자열을 byte 배열로 변환해서 반환한다
* - 문자열을 분석해서 각 문자를 utf-8 형식의 byte 값으로 변환한 다음
* 배열에 담아서 반환한다.
*/
byte[] buf = str.getBytes();
out.write(buf,0,buf.length);
out.close();
}
}
FileInputStream과 FileOutputStream 으로 원본파일을 복사본으로 복사하는 예제
위 코드 1번 사진과 2번사진은 FileInputStream과 FileOutputStream 으로 파일을 읽어오고 생성하는 코드 사진,
3번 사진은 버퍼링 기능을 제공하는 BufferedInputStream과 BufferedOutputStream을 사용해서 파일을 읽어오고 생성하는 코드사진 이다
1번에서는 1byte씩을 읽고 내보내는 방식을 사용했고, 2번에서는 byte 배열을 사용해서 소요시간을 더 줄였다
3번 BufferedInputStream과 BufferedOutputStream 은 다른 스트림과 연결해서 읽기와 쓰기 성능을 향상 시키는 역할을 수행한다
public class App4 {
public static void main(String[] args) throws Exception{
String src = "C:\\Users\\ftisa\\Downloads\\live.mp4";
String dest = "C:\\Users\\ftisa\\Downloads\\live_backup_4.mp4";
// apache-commons-io 라이브러리를 사용해서 읽고 쓰기
FileInputStream in = new FileInputStream(src);
FileOutputStream out = new FileOutputStream(dest);
IOUtils.copy(in,out);
}
}
이 코드는 위에 사진 1~3번과 같이 파일을 읽고 사용해서 백업을 만드는 파일인데 appache-commons-io 라이브러리를 사용해서 입력과 출력을 한 코드이다
BufferedReader
- 다른 Reader와 연결해서 읽기 성능을 향상시키는 스트림
- 다른 텍스트를 한 줄씩 읽어오는 readLine() 메소드를 제공
- String readLine() 메소드는 텍스트 내용을 한 줄씩 읽어오는 스트림이고, 스트림의 끝을 만나면 null 을 반환한다 ( 다른 메소드들은 -1을 반환) , 텍스트를 읽어올 때 줄바꿈문자 바로 앞까지 읽는다는 특징을 갖고 있다
BufferedReader 예제
public static void main(String[] args) throws Exception{
String path = "src/io3/data.csv";
BufferedReader reader = new BufferedReader(new FileReader(path));
// BufferedReader의 readLine() 메소드로 읽어온 텍스트를 대입할 변수
String text = null;
// (text = reader.readLine()) != null 은
// reader.readLine()으로 읽어온 텍스트를 text 변수에 대입한다
// text 변수에 대입된 문자열이 null 아니면 while문의 블록내 수행문을 수행한다
while( (text = reader.readLine())!= null) {
// 읽어온 문자열을 분석해서 평균점수를 계산하고 출력하는 수행문
// text에 대입된 문자열은 "김유신,100,80,70"과 같은 형태다
// ","를 구분자로 문자열을 잘라서 배열로 반환받는다
String [] items = text.split(",");
// 배열에 저장된 값을 조회하고, 필요한 경우 값을 변환한다
String name = items[0];
int kor = Integer.parseInt(items[1]);
int eng = Integer.parseInt(items[2]);
int math = Integer.parseInt(items[3]);
int total = kor + eng + math;
int average = total/3;
System.out.println("이름 : " + name);
System.out.println("평균 : " + average);
System.out.println( );
}
reader.close();
}
// 위 코드에서 사용하는 data.csv 파일 내용
김유신,100,80,70
홍길동,100,100,100
고길동,70,60,80
PrintWriter
- 캐릭터스트림의 출력 전용 스트림
- print(), println() 메소드를 제공해준다
- println() 메소드를 사용하면 자동으로 줄바꿈 문자를 추가해주고 줄바꿈 문자없이 한 줄씩 출력하는게 가능하다
printWriter 예제
public class App2 {
// 이 코드에 맞게 패키지안에 파일이 생성되는 것을 확인할 수 있다
PrintWriter writer = new PrintWriter("src/io3/data3.csv");
writer.println("홍길동,100,100,100");
writer.println("고길동,90,100,80");
writer.flush();
writer.close();
}
URL
- URL 객체는 지정된 URL 주소가 가르키는 자원을 표현하는 객체
- URL 객체의 openStream() 메소드는 해당 자원과 연결된 읽기 스트림을 반환
- URL 객체의 openStream() 메소드를 실행해서 획득한 InputStream을 활용하면 URL 주소가 표현하는 자원을 읽어올 수 있다
ObjectOutputStream
- 객체를 직렬화해서 스트림으로 전송하는 역할 수행
- ObjectOutputStream의 writeObject(Object obj)는 지정된 객체를 직렬화해서 연결된 스트림으로 내보낸다
File
- 현재 존재하지 않는 파일에 대해서 File 객체를 생성할 수 있다
- createNewFile() 메소드는 사이즈가 0인 파일을 생성한다
- mkdir() 메소드는 디렉토리를 생성한다
- mkdir() 메소드는 한번에 하위 디렉토리까지 포함시켜서 생성할 수 있다
- delete() 메소드는 파일, 디렉토리를 삭제한다. 디렉토리는 디렉토리 안에 파일이나 하위 디렉토리가 있으면 삭제가 안된다
File 객체는 File(String path) , File(String parent, String child) , File(File parent, String child) 가 있다
'Java' 카테고리의 다른 글
Java_스레드와 동기화 (1) | 2023.12.04 |
---|---|
Java_네트워크, I/O (0) | 2023.11.29 |
Java_객체의 직렬화와 역직렬화 (1) | 2023.11.26 |
Java_예외처리 (0) | 2023.11.22 |
Java_Map, Comparable (2) | 2023.11.21 |