ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 occurs


    1. 파일 읽어오기








    자동 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

Designed by Tistory.