반응형
프로그램에서 데이터를 외부에서 읽고 다시 외부로 출력하는 작업이 빈번하게 일어납니다.
데이터는 사용자로부터 키보드를 통해 입력 받을 수 있고, 파일 또는 네트워크로부터 입력될 수도 있습니다.
반대로 모니터로 출력될 수 도 있고, 파일로 출력되어 저장될 수도 있으며 네트워크로 출력되어 전송될 수도 있습니다.
자바의 입출력
- 자바에서 데이터는 스트림(Stream)을 통해 입출력되므로 스트림의 특징을 잘 이해해야 합니다.
- 스트림은 단방향으로 연속적으로 흘러가는 것을 말하며 출발지에서 도착지로 들어간다는 개념입니다.
- 프로그램이 데이터를 입력 받을 때는 입력 스트림이라 부르고, 프로그램이 데이터를 보낼 때는 출력 스트림이라고 부릅니다.
- 항상 프로그램을 기준으로 데이터가 들어오면 입력 스트림이고, 데이터가 나가면 출력 스트림이라는 것을 명심해야 합니다.
- 프로그램이 네트워크상 다른 프로그램과 데이터를 교환하기 위해서는 양쪽 모두 입력 스트림과 출력 스트림이 따로 필요합니다
- 자바에서 제공하는 클래스는 아래와 같습니다.
java.io 패키지의 주요 클래스 | 설명 |
File | 파일 시스템의 파일 정보를 얻기 위한 클래스 |
Console | 콘솔로부터 문자를 입출력하기 위한 클래스 |
InputStream / OutputStream | 바이트 단위 입출력을 위한 최상위 입출력 스트림 클래스 |
FileInputStream / FileOutputStream | 바이트 단위 입출력을 위한 하위 스트림 클래스 |
DataInputStream / DataOutputStream | |
ObjectInputStream / ObjectOutputStream | |
PrintStream | |
BufferedInputStream / BufferedOutputSteam | |
Reader / Writer | 문자 단위 입출력을 위한 최상위 입출력 스트림 클래스 |
FileReader / FileWriter | 문자 단위 입출력을 위한 하위 스트림 클래스 |
InputStreamReader / OuputStreamWriter | |
PrintWriter | |
BufferedReader / BufferedWriter |
- 스트림 클래스는 바이트 기반 스트림과 문자 기반 스트림으로 나눌수 있고 아래와 같습니다.
구분 | 바이트 기반 스트림 | 문자 기반 스트림 | ||
입력 스트림 | 출력 스트림 | 입력 스트림 | 출력 스트림 | |
최상위 클래스 | InputStream | OutputStream | Reader | Writer |
하위 클래스 (예시) |
XXXInputStream (FileInputStream) |
XXXOutputStream (FileOutputStream) |
XXXReader (FileReader) |
XXXWriter (FileWriter) |
InputStream
package io;
import java.io.*;
public class IoTest1 {
public static void main(String[] args) {
File file;
InputStream is = null;
try {
is = new FileInputStream("C:/_temp/test.txt");
int readByte;
while ((readByte = is.read()) != -1) {
System.out.println(readByte);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
OutputStream
package io;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
public class IoTest2 {
public static void main(String[] args) {
try {
OutputStream os = new FileOutputStream("C:/_temp/test2.txt");
byte[] data = "ABC".getBytes(StandardCharsets.UTF_8);
for (int i = 0; i < data.length; i++) {
os.write(data[i]);
}
os.flush();
os.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Reader
package io;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class IoTest3 {
public static void main(String[] args) {
Reader reader = null;
try {
reader = new FileReader("C:/_temp/test.txt");
int readData;
while ((readData = reader.read()) != -1) {
char charData = (char) readData;
System.out.println(charData);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Writer
package io;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class IoTest4 {
public static void main(String[] args) {
try {
Writer writer = new FileWriter("C:/_temp/test2.txt");
char[] data = "홍길동".toCharArray();
for (int i = 0; i < data.length; i++) {
writer.write(data[i]);
}
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
콘솔 입출력
System.in
package io;
import java.io.IOException;
import java.io.InputStream;
public class IoTest5 {
public static void main(String[] args) {
System.out.println("메뉴");
System.out.println("1. 예금 조회");
System.out.println("2. 예금 출금");
System.out.println("3. 예금 입금");
System.out.println("4. 종료 하기");
System.out.println("메뉴를 선택하세요");
InputStream is = System.in;
char inputChar = 0;
try {
inputChar = (char) is.read();
} catch (IOException e) {
e.printStackTrace();
}
switch (inputChar) {
case '1':
System.out.println("예금 조회를 선택했습니다.");
break;
case '2':
System.out.println("예금 출금을 선택했습니다.");
break;
case '3':
System.out.println("예금 입금을 선택했습니다.");
break;
case '4':
System.out.println("종료 하기를 선택했습니다.");
break;
}
}
}
System.out
package io;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
public class IoTest6 {
public static void main(String[] args) throws IOException {
OutputStream os = System.out;
for (byte b = 48; b < 58; b++) {
os.write(b);
}
os.write(10);
for (byte b = 97; b < 123; b++) {
os.write(b);
}
os.write(10);
String hangul = "가나다라마바사아자차카타파하";
byte[] hangulBytes = hangul.getBytes(StandardCharsets.UTF_8);
os.write(hangulBytes);
os.flush();
}
}
Console 클래스
package io;
import java.io.Console;
public class IoTest7 {
public static void main(String[] args) {
Console console = System.console();
System.out.println("아이디 : ");
String id = console.readLine();
System.out.println("패스워드: ");
char[] charPass = console.readPassword();
String strPasword = new String(charPass);
System.out.println("---------------");
System.out.println(id);
System.out.println(strPasword);
}
}
Scanner 클래스
package io;
import java.util.Scanner;
public class IoTest8 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("문자열 입력");
String inputString = scanner.nextLine();
System.out.println(inputString);
System.out.println();
System.out.println("정수 입력");
int inputInt = scanner.nextInt();
System.out.println(inputInt);
System.out.println();
System.out.println("실수 입력");
double inputDouble = scanner.nextDouble();
System.out.println(inputDouble);
}
}
파일 입출력
File 클래스
- 파일 리스트 조회
package io;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class IoTest9 {
public static void main(String[] args) {
try {
File dir = new File("C:/_temp/Dir");
File file1 = new File("C:/_temp/file1.txt");
File file2 = new File("C:/_temp/file2.txt");
File file3 = new File(new URI("file:////C:/_temp/file3.txt"));
if (dir.exists() == false) {
dir.mkdirs();
}
if (file1.exists() == false) {
file1.createNewFile();
}
if (file2.exists() == false) {
file2.createNewFile();
}
if (file3.exists() == false) {
file3.createNewFile();
}
File temp = new File("C:/_temp");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd a HH:mm");
File[] contents = temp.listFiles();
System.out.println("날짜 \t\t 시간 \t\t 형태 \t 크기 \t 이름");
System.out.println("-----------------------------------------");
for (File file : contents) {
System.out.print(sdf.format(new Date(file.lastModified())));
if (file.isDirectory()) {
System.out.print("\t<DIR> \t\t\t" + file.getName());
} else {
System.out.print("\t\t\t" + file.length() + "\t" + file.getName());
}
System.out.println();
}
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
FileInputStream
- 파일 읽기
package io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class IoTest10 {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("C:/_temp/test.txt");
int data;
while ((data = fis.read()) != -1) {
System.out.println(data);
}
fis.close();
} catch (Exception e) {
}
}
}
FileOutputStream
- 파일 복사
package io;
import java.io.*;
public class IoTest11 {
public static void main(String[] args) {
String originFileName = "C:/_temp/test.txt";
String targetFileName = "C:/_temp/test_cp.txt";
try {
FileInputStream fis = new FileInputStream(originFileName);
FileOutputStream fos = new FileOutputStream(targetFileName);
int readBytesNo;
byte[] readBytes = new byte[100];
while ((readBytesNo = fis.read(readBytes)) != -1) {
fos.write(readBytes, 0, readBytesNo);
}
fos.flush();
fos.close();
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
FileReader
- 파일 읽기
package io;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class IoTest12 {
public static void main(String[] args) {
try {
FileReader fr = new FileReader("C:/_temp/test.txt");
int readCharNo;
char[] cbuf = new char[100];
while((readCharNo = fr.read(cbuf)) != -1) {
String data = new String(cbuf, 0, readCharNo);
System.out.print(data);
}
fr.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
FileWriter
- 파일 쓰기
package io;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class FileTest13 {
public static void main(String[] args) {
File file = new File("C:/_temp/test.txt");
try {
FileWriter fw = new FileWriter(file, true);
fw.write("FileWriter는 한글로된 \r\n");
fw.write("문자열을 바로 출력 할 수 있다 \r\n");
fw.flush();
fw.close();
System.out.println("파일에 저장되었습니다.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
보조 스트림
- 다른 스트림과 연결되어 여러 가지 편리한 기능을 제공해주는 스트림을 의미합니다.
- 보조 스트림을 필터 스트림이라고도 하며 보조 스트림의 일부가 FilterInputStream, FilterOutputStream의 하위 클래스입니다.
- 다른 보조 스트림은 이 클래스들을 상속받지 않기 때문에 필터 스트림이란 용어 대신 사용 목적에 맞게 보조 스트림이라고 부릅니다.
- 보조 스트림은 자체적으로 입출력을 수행할 수 없기 때문에 입력 소스와 바로 연결되는 InputStream, FileInputStream, Reader, FileReader, 출력 소스와 바로 연결되는 OuputStream, FileOutputStream, Writer, FileWriter 등에 연결해서 입출력을 수행합니다.
- 보조 스트림은 문자 변환, 입출력 성능 향상, 기본 데이터 타입 입출력, 객체 입출력 등의 기능을 제공합니다.
문자 변환 보조 스트림
- InputStreamReader
- OutputStreamWriter
성능 향상 보조 스트림
보조 역할을 하는 버퍼를 제공해주는 보조스트림입니다.
소스로부터 직접 읽고 쓰는 대신에 버퍼로부터 읽고 쓰게되면서 성능이 향상됩니다.
- BufferedInputStream
- BufferedReader
- BufferedOutputStream
- BufferedWriter
기본 타입 입출력 보조 스트림
바이트 스트림은 바이트 단위로 입출력하기 때문에 자바의 기본 데이터 타입으로 입출력 할 수 없지만 DataInputStream, DataOutputStream 보조 스트림을 연결하면 기본 데이터 타입으로 입출력이 가능합니다.
- DataInputStream
- DataOutputStream
프린터 보조 스트림
- PrintStream
- PrintWriter
객체 입출력 보조 스트림
바이트 출력 스트림과 연결되어 객체를 직렬화하는데 ObjectOutputStream이 사용되고 역직렬화하는데 ObjectInputStream이 사용됩니다.
- ObjectInputStream
- ObjectOutputStream
반응형
'개발(합니다) > Java&Spring' 카테고리의 다른 글
[java-기초-19] NIO 기반 입출력 및 네트워킹 (0) | 2021.03.12 |
---|---|
[java-기초-18] 네트워크 기초 (2) | 2021.03.11 |
[java-기초-16] 스트림과 병렬 처리 (0) | 2021.02.24 |
[java-기초-15] 컬렉션 프레임워크 (0) | 2021.02.22 |
[java-기초-14] 람다식 (0) | 2021.02.14 |