-
221221 자바 14. 입출력스타터스 백엔드 3기 2022. 12. 21. 15:43
하루입니다.
스레드 복습


람다식 복습
1. 클래스, 메소드, 문장
2. 코드가 간결해진다.
3. 익명 클래스 / 익명 메소드이다
4. 추상메소드 1개만 있는 인터페이스인 함수형 인터페이스를 사용한다.
5. Runnable r = () -> { syso{"a"}; };
Thread c5 = new Thread( () -> {System.out.println("람다스레드");});
6. r.run(); ==> 다른 스레드 동시에 실행되지 않는다. 그냥 메소드이다.
7. newThread(r).start(); ==> 멀티스레드이다. 다른 스레드와 동시에 실행된다.
입출력
java.io 패키지
- 입출력 개념
- 자바 프로그램에서 외부 환경으로 데이터를 전송하는/받는 것이다.
- 파일, db, 타컴퓨터, 키보드 등에서 데이터를 받아오는 것이 입력이다.
- 파일, db, 타컴퓨터, 모니터 등으로 데이터를 보내는 것이 출력이다.
- stream이라는 표현을 사용한다. 입력스트림, 출력스트림
- 스트림은 데이터를 운반하는데 사용되는 연결통로이다. 단방향통신만 가능하다.
- 큐와 같은 선입선출이라고 생각하자.
java.oi의 class
입력스트림클래스 출력스트림클래스 입출력 1byte (byte stream) InputStream OutputStream 입출력 2byte (문자 stream) Reader Writer
1byte : 영문, 숫자, 특수문자의 일부
2byte : 다국어, char, 한글입출력 무관 class File
- 파일시스템 정보를 제공하는 클래스이다.
- 파일 +디렉토리를 관리하는 시스템이다.
- 모든 OS가 가지고 있으며,모두 다르게 작동한다.
- window는 탐색기...InputStream, OutStream
xxxStream들은 모두 InputStream, OutStream의 자손들이다. xxxInputStream extends InputStream xxxOutStream extends OutStream
- 상속받은 메소드를 그대로 사용한다.
- 각각의 xxxInputStream들에는
abstract int read() 가 오버라이딩 되어있다.
1byte- 상속받은 메소드를 그대로 사용한다.
- 각각의 xxxOutStream 들에는
abstract void write(int) 가 오버라이딩 되어있다.Reader, Writer
xxxReader extends Reader xxxWriter extends Writer
- 상속받은 메소드를 그대로 사용한다.
- 각각의 xxxReader들에는
abstract int read() 가 오버라이딩 되어있다.
2byte- 상속받은 메소드를 그대로 사용한다.
- 각각의 xxxWriter 들에는
abstract void write(int) 가 오버라이딩 되어있다.보조 스트림
- 파일이 디스크장치에 저장된다.
- 자바 프로그램이 실행되려면 cpu를 사용해야 한다.
- 전자가 후자보다 느리다.
- 그래서 파일 장치에 있는 걸 일단 메모리에 복사한다.
- 파일 장치 - 메모리 복사 - cpu
- 이 상태면 cpu가 파일에 접근하는 것보다 메모리에 접근하는 게 더 빨라서 이렇게 사용한다.
아래 코드 비교 설명- FileInputStream이 원본 장소에서 원본을 읽어온다. 기본스트림이다.
- 이 fis를 매개변수로 받는 보조스트림 BufferInputStream이 있다.
- BufferInputStream은 성능 향상을 위해 사용한다.
- 보조 스트림만으로는 입출력을 처리할 수 없기에, 스트림을 먼저 생성한 후 이를 이용해 보조 스트림을 생성해야 한다.

문자 기반 스트림 : Reader, Writer
public class InputStreamReader extends Reader {
public int read() throws IOException
}
* Reads a byte of data from this input stream. This method blocksif
* no input is yet available. Overrides: read() in InputStream Returns: the next byte of data, or -1 if the end of thefile is reached. Throws: IOException -
* if an I/O error occurs1. 파일 읽어오기


자동 refresh 설정 2. 파일에 input하기
fis는 args[0]을 매개변수로 하는 FileInputStream 객체이다.
fos는 args[1]을 매개변수로 하는 FileOutputStream객체이다.public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream(args[0]); FileOutputStream fos = new FileOutputStream(args[1], true); while(true) { int data = fis.read(); if(data == -1) break; fos.write(data); } fis.close(); fos.close(); }

fos 먼저 close(); 하면 Stream Closed 오류 발생
- FilterInputStream / FilterOutputStream ==> 보조스트림 (원본스트림을 필터링 없이 표현)
- SequenceInputStream ==> 보조스트림 (여러 원본스트림을 연결)
- PrintStream(OutStream의 일종) ==> System.out.println();
- System : 자바를 실행하는 컴퓨터의 정보
- System.out : 자바 실행하는 컴퓨터 표준출력장치(모니터) 변수
- System.out.println();
System 자바를 실행하는 컴퓨터의 정보 access to externally defined properties and environment
* variables; a means of loading files and libraries; and a utility
* method for quickly copying a portion of an array.System.out 자바 실행하는 컴퓨터 표준출력장치(모니터) 변수 public static final PrintStream out = null;
Typically this stream corresponds to display output or another
* output destination specified by the host environment or user.System.out.println(); printStream 메소드를 사용해 모니터에 출력한다.
BufferedReader- 보조스트림들은 사용하면 효능이 좋아져용
- 파일로부터 직접 받은 시간보다 버퍼에 저장 후 실행할 때의 시간이 5ms정도 빨랏당.
package chap15; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class BufferedInTest2 { public static void main(String[] args) throws Exception { long start = 0, end = 0; // 1. 파일로부터 직접 입력된 소요 시간 FileReader fis = new FileReader("C:\\Users\\user\\Desktop\\컬렉션프레임워크실습예제.pdf"); start = System.currentTimeMillis(); while(true) { int data = fis.read(); if(data == -1) break; } end = System.currentTimeMillis(); System.out.println("버퍼 미사용시 : " + (end - start) + "ms"); // 2. 버퍼에 저장한 게 입력되었을 때의 소요시간 // 아래 한번 더 만든 이유 : 위의 fis는 다 읽어서 더이상 읽을 게 없다 fis = new FileReader("C:\\Users\\user\\Desktop\\컬렉션프레임워크실습예제.pdf"); BufferedReader br = new BufferedReader(fis, 100); start = System.currentTimeMillis(); while (true) { int data = fis.read(); if(data == -1) break; // String line = br.readLine(); // if(line == null) break; // System.out.println(line); } end = System.currentTimeMillis(); System.out.println("버퍼 사용시 : " + (end - start) + "ms"); br.close(); } }
InputStreamReader
1바이트를 2바이트 스트림으로 변환한다.
InputStreamReader ir = new InputStreamReader(InputStream 객체)
OutputStreamReader ir = new OutputStreamReader(OutputStream 객체)
System.out ==> 내 컴퓨터 콘솔
System.in ==> 내 컴퓨터의 키보드 변수 ==> read 사용해서 1byte, 한글 안 보인다
표준입출력
System.in.read();
콘솔을 통해서 키보드 입력 받는 법
java.util.Scanner 클래스
- 입력할 때 여러 클래스를 단순화하였다.
- Scanner sc =new Scanner(Reader/InputStream);
- sc.nextInt(); sc.nextDouble(); sc.nextBoolean(); sc.next();
package chap15; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Scanner; public class SystemInTest22 { public static void main(String[] args) throws IOException { System.out.println("키보드 입력을 대기 중입니다."); InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); Scanner key = new Scanner(System.in); while(key.hasNextInt()) { // int형 아니면 실행되지 않는다. int first = key.nextInt(); int second = key.nextInt(); System.out.println(first + second); } while(key.hasNext()) { // 공백 이전 문자열을 읽어온다. String first = key.next(); String second = key.next(); System.out.println(first + second); } String first = key.nextLine(); // 한 줄을 읽어온다. 위에는 스페이스바가 데이터 기준이었음.얘는 스페이스바 쳐도 한 줄로 인식해준다. System.out.println(first); } }
직렬화
Employee 객체를 만들었다. 안에 id name잉라는 두 개의변수가 ㅣㅆ다. 객체는 메모리에 저장이 된다. main이 종료되면객체도 필요가 없으니 사라진다. 객체가 소멸되기 저에 영구적으로 기록을 하려고 한다. 전원을 껐다가 켜도 그대로 있게 하려고 한다. 이걸 돕는 건 db, file이다.
1. Serializable 인터페이스를 구현해야한다. 오버라이딩 메소드는 없다.
Employee는 직렬화가 가능한 객체이다.
class Employee implements Serializable {
int id;
int name;
}
2. 직렬화 ㅣ 객체를 연속적인 데이터로 만든다.FileOutputStream fos= new FileOutputStream("a.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos); 보조스크림이라 다른 걸 변수로받음
oos.writeObject(e);e라는 객체를 붙이기 위한 여정
3. 역직렬화 ㅣ 연속적인 데이터를 객체로 만든다.
저장한 걸 읽어오기 위한 여정
FileInputStream fis= new FileInputStream ("a.txt");
ObjectItputStream ois = new ObjectItputStream (fis);
Employee e = (Employee)ois.readObject();

!!! 모르겠다면 코드 다시 보고 구글링하자 !!! 필요할 때 찾아쓰자 !!!
FileViewer FileCopy BufferedInTest BufferedInTest2(소요시간 비교) SystemInTest(키보드입력, InputStreamReader) SystemInTest22(Scanner) BufferedOutputTest Calculator
'스타터스 백엔드 3기' 카테고리의 다른 글
221223. DB 2. RDBMS, select (0) 2022.12.23 221221 자바15. 파일 (0) 2022.12.21 221220 자바 13 (스레드, 람다) : 람다식이 뭘까요? (0) 2022.12.20 221220 자바 13 (스레드, 람다) : 스레드 (0) 2022.12.20 221219. 자바 12. 제네릭 <> (0) 2022.12.19