simDev1234
심플하고 차분하게
simDev1234
전체 방문자
오늘
어제
  • 분류 전체보기
    • Computer Science
      • Basic Math
      • Data Structure
      • Algorithm
      • Database
      • OS
    • Language
      • Java
      • Kotlin
      • SQL
    • Framework
      • Spring
      • Orm&Mapper
      • 프로젝트로 스프링 이해하기
      • 스프링 라이브러리
    • Infra
      • Cloud
      • Docker
      • Redis
      • AWS, Azure
      • Device
    • Etc
      • CleanCoding
    • Git,Github

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 404
  • JVM메모리구조
  • 컨트롤러
  • 자바메모리구조
  • 참조변수
  • 자바프로그램
  • controllerTest
  • scanner #next() #nextLine()
  • 참조타입
  • 자바
  • 자바프로그래밍
  • null
  • 스프링

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
simDev1234

심플하고 차분하게

Language/Java

[자바_API] 입출력 I/O

2022. 4. 5. 01:02

1. 스트림이란? 데이터를 운반하는데 사용되는 연결통로

  [생각] BJ는 온라인방송을 할 때, 왜 "스트리밍 중"이라고 할까?

 

2. 바이트기반 스트림_InputStream/OutPutStream 추상클래스 상속

입력스트림 출력스트림 입출력 대상의 종류
FileInputStream FileOutputStream 파일
ByteArrayInputStream ByteArrayOutputStream 메모리(byte배열)
PipedInputStream PipedOutputStream 프로세스(프로세스간의 통신)
AudioInputStream AudioOutputStream 오디오장치
.... .... ....

(1) InputStream 메서드

리턴타입 메소드  
int read() 입력 스트림에서 1byte씩 읽고 byte값을 int으로 반환
int read(byte[] b) 입력 스트림에서 1byte씩 읽어 byte배열에 저장, 읽은 갯수를 반환
int read(byte[] b, int off, int len) 입력 스트림에서 off부터 시작하여, len개를 읽어 byte 배열에 저장,
읽은 갯수를 반환
void close() 시스템의 자원을 반환하고 입력 스트림을 닫는다. (파일)

▶ read() 메소드

InputStream is = new FileInputStream("C:/test.jpg");
int readByte;
//모든 InputStream 하위 객체 read() : 읽은 내용이 없으면 -1 반환
while((readByte = is.read()) != -1){}

▶ 키보드에서 읽어오기 : System.in

package mymain.input;

import java.io.InputStream;

public class _01_KeyboardInputTest {

	public static void main(String[] args) throws Exception {
		int ch;
		
		//키보드의 입력값을 받는 inputStream
		//System객체 내에 포함관계로 inputStream이 생성되어 있는 상태
		InputStream is = System.in; 
		
		System.out.println("종료하려면 [Ctrl+Z]");
		
		while((ch = is.read()) != -1) {
			System.out.printf("%c",ch);
		}
	}

▶ 파일에서 읽어오기 : FileInputStream("파일경로")

package mymain.input;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class _02_FileInputTest {
	public static void main(String[] args) throws IOException {
		InputStream is = new FileInputStream("src/mymain/input/_02_FileInputTest.java");
		
		int ch;
		
		while((ch = is.read())!=-1) {
			System.out.printf("%c",ch);
		}
		
		is.close();
	}
}

▶ 네트워크에서 읽어오기 : URL(String url) > openStream()

package mymain.input;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

public class _03_NetWorkInputStream {
	public static void main(String[] args) throws IOException {
		URL url = new URL("https://www.naver.com");
		InputStream is = url.openStream();
		
		int ch;
		
		while((ch = is.read())!=-1) {
			System.out.printf("%c",ch);
		}
	}
}

 

(2) OutputStream 메서드

리턴타입 메소드  
void write() 출력 스트림으로 1byte씩 보낸다.
void write(byte[] b) 출력 스트림에 byte[] b의 값을 보낸다.
void write(byte[] b, int off, int len) 출력 스트림에 off부터 시작해서 len개 만큼 보낸다.
void flush() 버퍼에 잔류하는 모든 바이트를 출력
void close() 시스템의 자원을 반납하고 출력 스트림을 닫는다. (파일)

▶ read() 메소드

OutputStream os = new FileOutputStream("C:/test.txt");
byte[] data = "ABC".getBytes();
for(int i = 0; i < data.length; i++){
	os.write(data[i]);
}

 

▶ 모니터로 출력하기 : System.out

package mymain.output;

import java.io.IOException;
import java.io.OutputStream;

public class _01_MonitorTest {
	public static void main(String[] args) throws IOException {
		OutputStream os = System.out;
		
		//자바 -> 출력 스트림 -> 키보드버퍼로 문자를 전송
		os.write(65);
		
		String msg = "안녕";
		byte[] msg_bytes = msg.getBytes();
		os.write(msg_bytes);
		
		int n = 1004;
		String s = String.valueOf(n);
		os.write(s.getBytes());
		
		boolean bOk = true;
		String b = String.valueOf(bOk);
		os.write(b.getBytes());
		
		//키보드 커퍼를 비우면서 콘솔로 전송
		os.flush();
	}
}

▶ 파일로 출력하기 : FileOutputStream("파일경로");

package mymain.output;

import java.io.FileOutputStream;
import java.io.OutputStream;

public class _02_FileOutTest {

	public static void main(String[] args) throws Exception{
		OutputStream os = new FileOutputStream("a.txt");
		
		os.write('A');
		
		String name = "홍길동";
		byte[] sArr = name.getBytes();
		os.write(sArr);
		
		int n = 1994;
		os.write(String.valueOf(n).getBytes());
		
		os.flush();
		
		os.close();
	}

}

 

(3) 바이트 배열 단위로 읽어오기/보내기

가. InputStream/OutputStream의 read(byte[] b), write(byte[] b) 사용

package mymain.input;

import java.io.FileInputStream;
import java.io.InputStream;

public class _04_InputStream_Array {
	public static void main(String[] args) throws Exception{
		InputStream is = new FileInputStream("src/mymain/input/_04_InputStream_Array.java");
		
		int readByteNo;
		byte[] readBytes = new byte[8];
        //           is.read(readBytes, 1, 8); <- index 1부터 8개
		readByteNo = is.read(readBytes);
		
		for(int i = 0; i < readBytes.length; i++) 
			System.out.printf("%c",readBytes[i]);
		
		is.close();
	}
}
package mymain.output;

import java.io.FileOutputStream;
import java.io.OutputStream;

public class _03_OutputStream_Array {
	public static void main(String[] args) throws Exception{
		OutputStream os = new FileOutputStream("a2.txt");
		
		byte[] output = "ABC".getBytes();
		
		// os.write(output,1,2); /*: index1부터 2개*/
		os.write(output);
		
		os.close();
	}
}

 

나. ByteArrayInputStream/ByteArrayOutputStream 객체 사용

package mymain.input;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Arrays;

public class _04_InputStream_Array2 {
	public static void main(String[] args) throws Exception{
		byte[] inSrc = {0,1,3,4,5,6};
		byte[] outSrc = null;
		
		ByteArrayInputStream input = null;
		ByteArrayOutputStream output = null;
		
		input = new ByteArrayInputStream(inSrc);
		output = new ByteArrayOutputStream();
		
		int data = 0;

		while((data = input.read()) != -1) {
			output.write(data);
		}
		
		outSrc = output.toByteArray();
		
		System.out.println("Input Source : "+Arrays.toString(inSrc));
		System.out.println("Output Source : "+Arrays.toString(outSrc));
	}
}

>> 결과

Input Source : [0, 1, 3, 4, 5, 6]
Output Source : [0, 1, 3, 4, 5, 6]

 

 

3. 문자기반 스트림_Reader,Writer 추상클래스 상속

입력스트림 출력스트림 입출력 대상의 종류
FileReader FileWriter 파일
ByteArrayReader ByteArrayWriter 메모리(byte배열)
PipedReader PipedWriter 프로세스(프로세스간의 통신)
StringReader StringWriter 문자열
.... .... ....

 

4. 보조스트림_Filterxxxxx, Bufferedxxxxx, Objectxxxxx

입력스트림 입출력 대상의 종류
Filterxxxxx 필터를 이용한 입출력 처리
Bufferedxxxxxx 버퍼를 이용한 입출력 향상 (버퍼에 바이트/문자 올려두고, 한 줄씩 출력 가능-nextLine())
Objectxxxxxx 객체 직렬화/역직렬화

 

 

 

[참조]

이것이 자바다 

자바의 정석, 남궁성 지음

'Language > Java' 카테고리의 다른 글

[자바의정석_예제] 객체지향프로그래밍2  (0) 2022.04.13
[자바_API] java.lang패키지와 유용한 클래스(1)  (0) 2022.04.08
[자바_API] 네트워킹  (0) 2022.04.04
[자바의정석_복습] 예외처리  (0) 2022.03.28
[자바_예제] 2차원 배열 _ 달팽이(snail) 배열  (0) 2022.03.28
    'Language/Java' 카테고리의 다른 글
    • [자바의정석_예제] 객체지향프로그래밍2
    • [자바_API] java.lang패키지와 유용한 클래스(1)
    • [자바_API] 네트워킹
    • [자바의정석_복습] 예외처리
    simDev1234
    simDev1234
    TIL용 블로그. * 저작권 이슈가 있는 부분이 있다면 댓글 부탁드립니다.

    티스토리툴바