ch12/ 입출력 처리

ch12/ 입출력 처리

입출력 스트림

- 선입선출 구조 > 스트림에 포함된 데이터는 순서가 바뀌지 않음

- 단방향 > 하나의 스트림으로 읽기와 쓰기 동시 수행 불가

- 객체이다.

- 파일이나 장치에서 데이터를 전송하려고 사용 ex) 특정 파일을 읽거나 쓸때(파일 생성,삭제 등의 관리 x)

- 데이터 읽기/쓰기, 스트림 비우기, 스트림 열기/닫기, 스트림 내부의 바이트 개수 계산 등의 메서드 제공

- 출력 스트림의 출력을 입력 스트림의 입력으로 연결해 파이프라인 구성 가능

- 스트림이 가득 차면 프로그램이 빈공간이 생길 때까지 지연 된다.

- 사용 전에 먼저 열어야 하며, 사용을 마친 후에는 닫아야 한다.

- 한 번에 열 수 있는 개수가 제한되어 있다.

- 동일한 파일은 둘 이상의 스트림으로 열 수 없다.

- 우리가 많이쓰던 System.in/out > 표준 입력/출력 스트림

- 바이트 스트림과 문자 스트림으로 구분된다.

1. 바이트 스트림(바이너리 스트림)

- InputStream, OutputStream으로 끝남

- 바이트 단위로 전송, 이진 데이터 처리 > 이미지 or 동영상 파일 처리 유용

- 추상 클래스이다.

- 모든 자식 바이트 스트림에서 공통으로 사용하는 다양한 메서드를 포함한 최상위 클래스

- 각각 read()와 wirte()라는 추상 메서드를 포함한다.

바이트 스트림 클래스가 제공하는 주요 메서드 InputStream int available() 읽을 수 있는 바이트의 개수를 반환 void close() 입력 스트림 닫음 abstract int read() 1바이트를 읽음, 리턴값 0~255의 ASCII 값

읽을 데이터가 없을 시 -1 반환 int read(byte b[]) 1바이트씩 읽어 b[]에 저장한 후 읽은 개수를 반환 int read(byte b[], int off, int len) len만큼 읽어 b[]의 off 위치에 저장한 후 읽은 개수를 반환 long skip(long n) 입력 스트림을 n바이트만큼 건너뜀 OutputStream void close() 출력 스트림을 닫음 void flush() 출력하려고 버퍼의 내용을 비움 abstract void write(int b) b값을 바이트로 변환해서 씀 void wirte(byte b[]) b[]값을 바이트로 변환해서 씀 void wirte(byte b[], int off, int len) b[] 값을 바이트로 변환해서 off 위치부터 len 만큼 씀

- 시스템에 있는 모든 파일을 읽거나 쓸 수 있는 기능 제공한다.

- 파일 경로 문자열과 파일 객체를 생성자의 매개변수로 사용해 객체 생성한다

- 생성자로 스트림 객체 생성시 FileNotFoundException 예외 처리를 해야 한다.

FileInputStream(String name)

FileInputStream(File file)

FileOutputStream(String name)

FileOutputStream(File file)

FileOutputStream(String name, boolean append) -> true면 이어쓰고(append)

FileOutputStream(File file, boolean overwirte) -> false면 덮어쓴다(overwirte)

- 버퍼 : 스트림과 프로그램 간에 데이터를 효율적으로 전송하려고 사용하는 메모리

- 입출력 장치와 프로그램 간 동작 속도가 크게 차이가 날 대 버퍼를 사용하면 매우 효율적이다.

- InputStream 및 OutputStream을 매개변수로 사용해 스트림 객체를 생성한다.

BufferedInputStream(InputStream in)

BufferedInputStream(InputStream in, int size)

BufferedOutputStream(OutputStream out)

BufferedOutputStream(OutputStream out, int size) ->int size=버퍼의 크기

더보기 //버퍼의 유무에 따라 iexplorer.exe 파일을 복사하는 시간을 비교 -> 3배 더 걸림ㅎ package book.ch12; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class Demo2 { public static void main(String[] args) { long start, end, duration; String org = "C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe"; String dst = "C:\\jinsugyeong\\iexplore1.exe"; start = System.nanoTime(); try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream(org)); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dst));){ //available() 읽을 수 있는 바이트 개수 반환 메서드 while(bis.available() > 1) { int b = bis.read(); bos.write(b); } bos.flush(); }catch(IOException e) { } end = System.nanoTime(); duration = end - start; System.out.println("버퍼를 사용한 경우 : " + duration); start = System.nanoTime(); try(FileInputStream fis = new FileInputStream(org); FileOutputStream fos = new FileOutputStream(dst);){ while(fis.available() > 1) { int b = fis.read(); fos.write(b); } fos.flush(); }catch(IOException e) { } end = System.nanoTime(); duration = end - start; System.out.println("버퍼를 사용하지 않은 경우 : " + duration); } }

- DataInput, DataOutput 인터페이스를 구현한 FilterInputStream과 FilterOutputStream 각각의 자식 클래스이다.

- 각각 기초 타입 데이터를 읽고, 기록하는 메서드를 제공한다.

- DataInput 인터페이스 : readBoolean(), readByte(), readChar(), readDouble(), readFloat(), readInt(), readLong(), readShort() 등 기초 타입을 위한 메서드와 readUTF() 등 문자를 읽을 수 있는 메서드를 제공한다.

- DataOutput 인터페이스 : DataInput인터페이스가 정의한 모든 메서드에서 read>write로 대체하는 메서드 제공하고, byte[]를 매개변수로 사용하는 write(), 다수의 char타입을 위한 writeBytes() 메서드 등도 제공한다.

- 직접 키보드에서 데이터를 입력받거나 콘솔 뷰에 데이터를 출력하기에는 부적합하다.

- FileInputStrem 및 FileOutputStrem 등 다른 스트림과 연결해서 파이프라인을 구성해 사용한다.

- 다양한 데이터 값을 편리하게 표현 할 수 있도록 출력 스트림에 기능을 더하는 스트림

- IOException을 발생하지 않는다

- 자동 플러시 기능을 제공해 flush() 메서드를 호출하지 않고도 버퍼를 비울 수 있다.

- 지금까지 사용한 System.out 객체의 println(), print(),printf() 메서드는 PrintStream으로 출력하는데, 각종 데이터 타입을 출력할 수 있도록 다양하게 오버로딩 되어 있다.

PrintStream(File file)

PrintStream(String filename)

PrintStream(OutputStream out)

PrintStream(OutputStream out, boolean autoFlush) -> 자도 플러시 기능 선택

2. 문자 스트림

- Reader , Writer로 끝남

- 2바이트 단위인 유니코드로 전송/수신 > 언어로 된 파일 처리 유용

- 추상클래스이다.

- 모든 자식 바이트 스트림에서 공통으로 사용하는 다양한 메서드를 포함한 최상위 클래스

- 각각 read(),close()와 wirte(),flush(),close()라는 추상 메서드를 포함한다.

- Reader 클래스는 InputStream과 , Writer클래스는 OutputStream과 유사한 메서드를 제공한다

- 모두 2바이트씩 각각 읽고 쓸 수 있는 메서드로 구성되어 있다

문자 스트림 클래스가 제공하는 주요 메서드 Reader abstract void close() 입력 스트림 닫음 int read() 1개의 문자를 읽음 int read(char[] cbuf) 문자 단위로 읽어 cbuf[]에 저장한 후 읽은 개수를 반환 abstract int read(char[] cbuf, int off, int len) len만큼 읽어 cbuf[]의ㅣ off위치에 저장한 후 읽은 개수를 반환 long skip(long n) 입력 스트림을 n 문자만큼 건너뜀 Writer abstract void close() 스트림을 닫고 관련된 모든 자원 반납 abstract void flush() 버퍼의 내용을 비움 void write(int c) c값을 char로 변환해 출력 스트림에 씀 void wirte(char[] cbuf) cbuf[]값을 char로 변환해 출력 스트림에 씀 abstract void wirte(char[] cbuf, int off, int len) cbuf[]값을 char로 변환해 off 위치부터 len 만큼 씀 void write(String str) 문자열 str을 출력 스트림에 씀

- 시스템에 있는 모든 문자 파일을 읽거나 쓸수 있는 기능 제공

- 생성자로 스트림 객체 생성 시 FileNotFoundException 예외 처리를 해줘야한다

- 생성자: String name, File file(+boolean append)->true이면 이어쓰고 false이면 덮어쓴다

- 데이터를 효율적으로 전송하려고 버퍼로 처리할 때 사용

- 생성자: In/OutputStream 변수 (+int size)

- Stream lines() 메서드 : 읽은 행을 스트림으로 반환

- String readLine() : 한 행을 읽어 문자열로 반환

- 바이트 스트림과 문자 스트림을 연결하는 브리지 스트림

- 바이트 기반의 In/OutputStream을 포장해 문자 기반의 Reader와 Writer로 변환

- 생성자 : In/OutputStream 변수(+ Charset cs)

- PrintStream처럼 다양한 데이터값을 편리하게 표현할 수 있게 기능을 더하는 클래스

- 생성자 : PrintStream과 비슷하지만 OutputStream과 Writer 둘다 인수로 받을 수 있음

- FileNotFoundException 예외 처리 해야함

- println(), print(), printf() 얘도 제공

4. 파일 관리

- 자바는 File,Files클래스와 Path 인터페이스를 제공해 특정파일의 속성이나 생성,삭제 등 관리할 수 있는 기능을 제공한다

(1) File 클래스

- 파일이나 폴더의 경로를 추상화한 클래스

- java.io 패키지에 포함되어 있다

File 클래스 생성자 File(File parent, String child) parent 객체 폴더의 child라는 File 객체 생성 File(String pathname) pathname에 해당하는 File 객체 생성 File(String parent, String child) parent 폴더에 child라는 File 객체 생성 File(URI uri) uri 경로에서 File 객체 생성

- 메서드 : 리턴타입

boolean : canExecute(),canRead(),canWrite(),createNewFile(),delete(),exists(존재유무),isDirectory(폴더존재유무),isFile(파일존재유무),mkdir(폴더생성)

String : getAbsolutePath(절대경로),getName(파일이름),getPath(경로)

long : lastModified(마지막수정시간), length(파일크기)

모든자식파일폴더>String[] list(문자열배열로), File[] listFiles(File배열로)

Path toPath() : 파일경로에서 구성한 Path객체 반환

(2) Path인터페이스와 Files 클래스

● Path인터페이스 : 운영체제에 따라 일관성없이 동작하는 File 클래스 대체하는 것

- 기존 File객체도 toPath()메서드를 이용해 Path객체로 변환가능

- 구현 객체는 파일 시스템에서 경로를 나타낸다

● Files 클래스 : 파일의 속성을 조사하거나 파일 또는 폴더 생성 및 삭제할 수 있도록 정적 메서드 제공(존나많음...)

(3) 스트림 얻기

Files 클래스가 제공하는 스트림을 반환하는 정적메서드 Stream lines(Path path) 기본 문자집합을 이용해 파일의 모든 행을 스트림으로 반환 Stream lines(Path path, Charset cs) 주어진 문자집합을 이용해 파일의 모든 행을 스트림으로 반환 Stream list(Path dir) 서브 폴더를 제외한 폴더에 들어 있는 모든 원소를 스트림으로 반환 Stream walk(Path start) 서브 폴더를 포함한 폴더에 들어 있는 모든 원소를 스트림으로 반환

더보기 텍스트 파일에 써져있는 숫자 배열로 가져와 영문으로 변환하기 import java.io.File; import java.nio.file.Files; import java.nio.file.Path; import java.util.stream.Stream; public class Demo4 { public static void main(String[] args) throws Exception { String[] number = {"zero","one","two","three","four","five","six","seven","eight","nine"}; Path p = new File("C:\\jinsugyeong\

umber.txt").toPath(); //저 경로에 number.txt가 있고, 행마다 숫자 한자릿수가 기록되어있음 Stream s = Files.lines(p); //Path객체로 스트림 생성 s.forEach(x->System.out.println(x)); s = Files.lines(p); //스트림을 위에서 출력하는데 썻기때문에 한번 더 생성해 줘야한다. s.map(x->number[Integer.parseInt(x)]) .forEach(x->System.out.print(x + " ")); //스트림 원소 값에 대응하는 number 배열 값으로 출력한다. } } 콘솔창 결과

from http://everyday-com-eat.tistory.com/42 by ccl(A) rewrite - 2021-12-20 01:01:39