Java Io기반 입출력 및 네트웤 #1
IO기반 입출력 및 네트워킹
java.io 패키지 = 자바의 기본적인 데이터 입출력(IO : Input/Output ) API 제공
#예외가 거의 발생하니 try, catch로 해도되고 throws Exception으로 떠넘겨도 된다.
바이트 기반 스트림과 문자 기반 스트림
바이트 기반 스트림 = 그림, 멀티미디어, 문자 등 모든 종류의 데이터를 받고 보내는 것이 가능.
문자 기반 스트림
문자만 받고 보낼 수 있도록 특화.
바이트 기반 스트림 = InputStream , OutputStream 입력 , 출력 최상위 클래스
문자 기반 스트림 = Reader , Writer 입력 , 출력 최상위 클래스
InputStream = 바이트 기반 입력 스트림의 최상위 클래스로 추상 클래스
예시.
import java.io.FileInputStream; import java.io.InputStream;
public class AInputStream1 {
public static void main(String[] args) throws Exception {
// inputstream의 is는 Fileinputstream을 가져온다.
InputStream is = new FileInputStream("C:/java.jae/text.txt");
// readbyte를 만들어주고
int readByte;
while(true) {
// 만들어진 readbyte는 is를 읽어온다(read();)
readByte = is.read();
// readbyte가 -1(즉 더이상 읽을수없다면)이면 빠져나온다. 바로 처리할꺼라 {}는 필요없다.
if(readByte == -1) break;
// char타입으로 바뀐 readbyte를 출력한다.
System.out.print((char)readByte);
}
// is를 닫는다.
is.close();
}
}
예시2.
import java.io.FileInputStream; import java.io.InputStream;
public class AInputStream2 {
public static void main(String[] args) throws Exception {
InputStream is = new FileInputStream("C:/java.jae/text.txt");
int readbyteno;
// byte를 3를 준다.
byte[] readbytes = new byte[3];
String data = "";
while(true) {
readbyteno = is.read(readbytes);
if(readbyteno == -1) break;
// readbyteno를 0부터 len까지 저장하고 읽을 len개를 리턴한다.
data += new String(readbytes, 0, readbyteno);
}
System.out.print(data);
is.close();
}
}
예시3.
import java.io.FileInputStream; import java.io.InputStream;
public class AInputStream3 {
public static void main(String[] args) throws Exception{
InputStream is = new FileInputStream("C:/java.jae/text.txt");
int input;
// byte를 8개 준다.
byte[] inputs = new byte[8];
// 값을 불러오는데 inputs의 배열에서 2번째와 3번째를 쓸거고 불러오는것도 3번 불러올꺼다
// index 65 66 67
input = is.read(inputs, 2, 3);
// inputs.length만큼 반복한다.
for(int i=0; i<inputs.length; i++) {
System.out.println(inputs[i]);
}
is.close();
}
}
OutputStream = 바이트 기반 출력 스트림의 최상위 클래스로 추상 클래스
예시
import java.io.FileOutputStream; import java.io.OutputStream;
public class BOutputStream1 {
public static void main(String[] args) throws Exception {
OutputStream os = new FileOutputStream("C:/java.jae/text.txt");
byte[] data = "ABCD".getBytes();
for(int i=0; i<data.length; i++) {
os.write(data[i]);
}
os.flush();
os.close();
}
}
예시2
import java.io.FileOutputStream; import java.io.OutputStream;
public class BOutputStream2 {
public static void main(String[] args) throws Exception {
OutputStream os = new FileOutputStream("C:/java.jae/text.txt");
byte[] data = "ABC".getBytes();
os.write(data);
os.flush();
os.close();
}
}
예시3
import java.io.FileOutputStream; import java.io.OutputStream;
public class BOutputStream3 {
public static void main(String[] args) throws Exception {
OutputStream os = new FileOutputStream("C:/java.jae/text.txt");
byte[] data = "DEFG".getBytes();
// index 1번째부터 2번째까지 저장시킨다. DEFG = 0123 따라서 EF만
os.write(data, 1, 2);
os.flush();
os.close();
}
}
Reader = 문자 기반 입력 스트림의 최상위 클래스 추상 클래스.
Writer = 문자 기반 출력 스트림의 최상위 클래스 추상 클래스.
Writer은 보통 Writer(String str) 이 메소드를 많이쓴다.
예시 Reader.
import java.io.FileReader; import java.io.Reader;
public class CReader1{
public static void main(String [] args) throws Exception{
Reader reader = new FileReader("C:/");
int readerdata;
while(true){
readerdata = reader.read();
if(readerdata == -1) break;
System.out.println((char) readerdata);
}
reader.close();
}
}
예시2
import java.io.FileReader; import java.io.Reader;
public class CReader2 {
public static void main(String[] args) throws Exception {
Reader reader = new FileReader("C:/java.jae/text.txt");
int readerno;
char[] cbuf = new char[2];
String data = "";
while(true) {
// readerno는 reader의 cbuf메소드의 입력스트림으로 부터 주어진 문자 배열의 길이만큼 문자를 읽고 배열에 저장한다.
readerno = reader.read(cbuf);
if(readerno == -1) break;
data += new String(cbuf, 2, readerno);
}
System.out.println(data);
reader.close();
}
}
예시3
import java.io.FileReader; import java.io.Reader;
public class CReader3 {
public static void main(String[] args) throws Exception {
Reader reader = new FileReader("C:/java.jae/text.txt");
int readerno;
char[] cbuf = new char[4]; // cbuf에 4개의 배열을 준다 즉 index 0123이 있는거다.
// readerno는 reader의 값을 불러오는데 cbuf의 배열에서 1번째와 2번째를 쓸거고 불러오는것도 2번 불러올거다.
readerno = reader.read(cbuf, 1, 2);
for(int i=0; i<cbuf.length; i++) {
System.out.print(cbuf[i]);
}
reader.close();
}
}
Write
예시
import java.io.FileWriter; import java.io.Writer;
public class DWriteExample1 {
public static void main(String[] args) throws Exception {
Writer writer = new FileWriter ("C:/java.jae/text.txt");
char[] data = "길동".toCharArray();
for(int i=0; i<data.length; i++) {
writer.write(data[i]);
}
writer.flush();
writer.close();
}
}
예시2.
import java.io.FileWriter; import java.io.Writer;
public class DWriteExample2 {
public static void main(String[] args) throws Exception {
Writer writer = new FileWriter ("C:/java.jae/text.txt");
char[] data = "길동길동".toCharArray();
writer.write(data);
writer.flush();
writer.close();
}
}
예시3.
import java.io.FileWriter; import java.io.Writer;
public class DWriteExample3 {
public static void main(String[] args) throws Exception {
Writer writer = new FileWriter ("C:/java.jae/text.txt");
char[] data = "길동길동길동".toCharArray();
writer.write(data , 1 , 2);
writer.flush();
writer.close();
}
}
예시4.
import java.io.FileWriter; import java.io.Writer;
public class DWriteExample4 {
public static void main(String[] args) throws Exception {
Writer writer = new FileWriter ("C:/java.jae/text.txt");
String data = "안녕 클레오 파트라~ 세상에서 제일 가는 포테이토 칩!";
// writer.write(data);
writer.write(data, 3, 3);
writer.flush();
writer.close();
}
}
System.in필드 inputstream 타입의 입력 스트림 - inputstream 변수 대입가능
읽은 바이트는 키보드의 아스키 코드(ascii code)
아스키 코드로 부터 문자 변환
키보드로부터 입력된 한글 읽기
read() 메소드는 1바이트씩 읽어 오류발생하니 전체 내용을 바이트 배열로 받아 String 객체 생성 후 읽어준다
System.out 필드
PrintStream 타입의 출력 스트림 OutputStream으로 타입변환 가능
아스키 코드를 출력하면 콘솔에는 문자가 출력
문자열을 출력하려면 바이트 배열을 얻어야함
예시
import java.io.InputStream;
public class ESystemInExample1{
public static void main(String[] args) throws Exception{
System.out.println("메뉴");
System.out.println("1예금");
System.out.println("2출금");
System.out.println("3입금");
System.out.println("4종료");
System.out.print("메뉴선택");
InputStream is = System.in;
char inputchar = (char) is.read();
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;
}
}
}
예시2
import java.io.InputStream;
public class ESystemInExample2 {
public static void main(String[] args) throws Exception{
InputStream inputstream = System.in;
byte[] data = new byte[100];
System.out.println("이제....우린....깐부니깐.... 대답....");
int namebytes = inputstream.read(data);
String name = new String(data, 0 , namebytes-2);
System.out.println("뭐라고오????");
int commentbytes = inputstream.read(data);
String comment = new String(data, 0 , commentbytes-2);
System.out.println(name);
System.out.println(comment);
}
}
예시3 OutputStream
import java.io.OutputStream;
public class ESystemOutExample {
public static void main(String[] args) throws Exception {
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();
os.write(hangulbytes);
os.flush();
}
}
Scanner = 가장 강력하게 읽을수있는 클래스 File, InputSteam, Reada, String 등등 원하는 타입으로 바로 읽을수있음
단점은 숫자가 들어가는 부분엔 오류가 뜸
예시
import java.util.Scanner;
public class FScannerExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("문자: ");
String in = scanner.nextLine();
System.out.println(in);
System.out.println();
System.out.println("정수: ");
int INT = scanner.nextInt();
System.out.println(INT);
System.out.println();
System.out.println("실수: ");
double dou = scanner.nextDouble();
System.out.println(dou);
}
}