ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [14회차-①] JAVA (스트림)
    JAVA 2021. 4. 11. 01:27

    강의명 : 오픈프레임워크 활용 디지털융합 SW엔지니어 양성 과정

    강의 날짜 : 21.04.09

     

    <스트림>

     

    1. 스트림

     

    여러 자료의 처리에 대한 기능을 구현한 클래스가 스트림이다.

    자바에서 모든 입출력은 스트림을 통해 이루어진다. 

    입출력 장치는 매우 다양해서 장치에 따라 입출력을 다르게 하면 프로그램 호환성이 떨어지게 된다. 

    이러한 문제를 해결하기 위해 입출력 장치와 무관하고 일관성있게 프로그램을 구현할 수 있도록 일종의 가상 통로인 스트림을 제공한다. 

    자료를 읽어드리는 소스와 자료를 쓰려는 대상(target)에 따라 각각 다른 스트림 클래스를 제공합니다. 

     

    2. 입력 스트림과 출력 스트림 

     

    어떤 대상으로부터 자료를 읽어 들일 때는 입력 스트림

    : InputStream이나 Reader로 끝나는 이름의 클래스는 입력 스트림

     

    파일에 저장할 때는 출력 스트림

    : OutputStream이나 Writer로 끝나는 이름의 클래스는 출력 스트림

     

    바이트 단위 스트림

    : Stream으로 이름이 끝나는 클래스

     

    문자 단위 스트림

    문자는 2바이트를 먹기 때문에 바이트 단위로 읽으면 깨지게 되므로 별도로 문자 스트림을 제공한다.

    : Reader나  Writer로 끝나는 클래스

     

    기반 스트림 

    읽어 들일 곳(소스)이나 써야할 곳 (대상)에서 직접 읽고 쓸 수 있으며 입출력 대상에 직접 연결되어 생성되는 스트림

    : FileInputStream, FileOutputStream, FileReader, FileWriter 등

     

    보조 스트림

    직접 읽고 쓰는 기능이 없어서 항상 다른 스트림을 포함하여 생성된다.

    기반 스트림 + 보조 스트림A+ 보조 스트림B

    : InputStreamReader, OutputStreamReader, BufferedInputStream, BufferedOutputStream 등

     

    FileOutoutStream : 파일에 대한 입출력 스트림 생성

    BufferedOutputStream : 입출력 스트림에 대한 객체를 생성

    DataOutPutStream : 입출력 스트림을 매개로 받아와서 Data입출력 스트림 생성

     

     

    <바이트 단위 자료의 입출력 스트림>

     

    1. InputStream

     : 바이트 단위로 읽는 스트림 중 최상위 스트림

     

    추상메소드를 포함한 추상 클래스로서 하위 스트림 클래스가 상속받아 각 클래스 역할에 맞게 추상 메소드 기능을 구현

     

    주로 사용하는 하위 클래스

    스트림 클래스 설명
    FileInputStream 파일에서 바이트 단위로 자료를 읽음
    ByteArrayInputStream Byte 배열 메모리에서 바이트 단위로 자료를 읽음
    FilterInputStream 보조 스트림의 상위 클래스

     

    바이트 자료를 읽기 위해 사용하는 메소드

    메소드 설명
    int read() 입력 스트림으로부터 한 바이트의 자료를 읽음
    읽은 자료의 바이트 수 반환
    int read(byte b[]) 입력 스트림으로부터 b[]크기의 자료를 b[]에 읽음
    읽은 자료의 바이트 수 반환
    int read(byte b[], int off, int len) 입력 스트림으로부터 b[]크기의 자료를 b[]의 off변수 위치부터 저장하며 len만큼 읽음
    읽은 자료의 바이트 수 반환
    void close() 입력 스트림과 연결된 대상 리소스를 닫음

     

    반환형이 int인 이유는 더 이상 읽어들일 자료가 없는 경우에는 정수 -1이 반환되기 때문이다. 

    그럼 이때 close()가 되도록 경우가 많기 때문이다.

     

     

    2. FileInPutStream 

     : 파일에서 바이트 단위로 자료를 읽어 들일 때 사용하는 스트림 클래스

     

    이 스트림은 사용하기 위해서 먼저 스트림 클래스를 생성해야 한다. 

    생성자 설명
    FileInputStream(String name) 파일 이름 name(경로 포함)을 매개 변수로 받아 입력 스트림 생성
    FileInputStream(File f) File 클래스 정보를 매개변수로 받아 입력 스트림 생성

     

    import java.io.FileInputStream;
    import java.io.IOException;
    
    public class FileInputStreamTest {
    	
    
    	public static void main(String[] args) {
    		
    		FileInputStream fis= null;
    		
    		try {
    			fis= new FileInputStream("input.txt"); //input파일 입력 스트림 생성
    			System.out.println(fis.read());
    			System.out.println(fis.read());
    			System.out.println(fis.read());
    		} catch (IOException e) { //파일이 없는 경우의 예외처리
    			System.out.println(e); //오류 출력
    		}finally {
    			try {
    				fis.close(); //생성된 스트림을 닫음
    			}catch (IOException e) { 
    				System.out.println(e);
    			}catch (NullPointerException e) { //스트림이 아예 생성되지 않아 catch
    				System.out.println(e);
    			}
    		}
    		System.out.println("end");
    	}
    }

    input이 없는 경우 : 프로그램이 중단되거나 하지 않고 예외 처리를 해서 end까지 출력된 것을 확인 
    input이 있는 경우

     

     

    ABC 라고 입력된 input이 있는 경우 출력 확인한다.

    다만  문자형이 아닌 아스키 코드가 찍혀있으므로

    위에서 print를 해 줄때 char형으로 강제 형변환을 해주면 된다.

     

     

    System.out.println((char)fis.read());

     

    * 파일 끝까지 읽기

    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    
    public class FileInputStreamTest2 {
    
    	public static void main(String[] args) {
    
    		try(FileInputStream fis = new FileInputStream("input.txt")){ //input파일 입력 스트림 생성
    			int i; //반환된 바이트 수를 저장할 변수
    			while((i=fis.read())!=-1){ //다 읽을 때까지
    				System.out.println((char)i); //문자형으로 출력
    			}
    			System.out.println("end"); //반복문을 벗어나면(더이상 읽을 것이 없으면) end 출력
    		}catch (FileNotFoundException e){ //파일이 없는 경우의 예외 처리
    			e.printStackTrace();
    		}catch (IOException e) { //입출력 실패 예외처리
    			e.printStackTrace();
    		}
    	}
    }

     

    *int read(byte[] b) 메소드 사용

    import java.io.FileInputStream;
    import java.io.IOException;
    
    public class FileInputStreamTest3 {
    
    	public static void main(String[] args) {
    		
    		try ( FileInputStream fis = new FileInputStream("abc.txt")){ //abc 파일 입력 스트림 생성
    			byte bs[]= new byte[10]; //10크기의 바이트형의 배열 생성
    			int i;
    			while((i=fis.read(bs))!=-1) { //읽을 것이 없을 때까지 
    				for(byte b : bs) { //for-each 반복문
    					System.out.print((char)b); //문자형으로 출력
    				}
    				System.out.println(": "+i+"바이트 읽음"); 
    			}
    		}catch (IOException e) {
    			e.printStackTrace();
    		}
    		System.out.println("end");
    	}
    }

     

    세번째 줄에 읽는 것은 6바이트지만 출력문에 뒤에 4바이트 부분이 아직 남아있어 같이 출력된 것을 확인 할 수 있다.

    출력할 때 다 출력하지 말고 조건을 주어 해결할 수 있다.

    (for문 사용)

     

     

     

    for(int k=0 ; k < i ; k++) {

         System.out.println((char)bs[k]);

    }

     

     

     

     

    3. OutputStream

     : 바이트 단위로 쓰는 스트림 중 최상위 스트림

     

    * 잘 사용되는 하위 클래스

    스트림 클래스 설명
    FileOutputStream 바이트 단위로 파일에 자료를 씀
    ByteArrayOutputStream Byte 배열에 바이트 단위로 자료를 씀
    FilterOutputStream 보조 스트림의 상위 클래스

     

    * 사용되는 메소드

    메소드 설명
    void write() 한 바이트 출력
    void write(byte b[]) b[]에 있는 자료를 출력
    void write(byte b[], int off, int len) b[]배열에 있는 자료를 off변수 위치부터 len만큼 출력
    void flush() 출력 버퍼를 강제로 지워 자료를 출력
    void close() 출력 스트림과 연결된 대상 리소스를 닫음

     

     

    4. FileOutputStream

     : 바이트 단위 자료를 출력하기 위한 스트림

     

    생성자 설명
    FileOutputStream(String name) 파일 이름 name(경로 포함)을 매개 변수로 받아 출력 스트림 생성
    FileOutputStream(String name,
    boolean append)
    파일 이름 name(경로 포함)을 매개 변수로 받아 출력 스트림 생성
    append값이 true이면 파일 스트림을 닫고 다시 생성할 때 파일의 끝에 이어서 씀
    FileOutputStream(File f) File 클래스 정보를 매개변수로 받아 출력 스트림 생성
    FileOutputStream(File f,
    boolean append)
    File 클래스 정보를 매개변수로 받아 출력 스트림 생성
    append값이 true이면 파일 스트림을 닫고 다시 생성할 때 파일의 끝에 이어서 씀

     

    매개변수로 준 파일이 만약 경로에 없으면 스트림은 파일을 새로 생성한다.

    기존의 파일에 덮어쓰고 새로 쓴다면 append는 false, 

    이어서 쓴다면 append는 true로 주어야 한다. 

     

    * write()메소드 사용

    FileOutputStream은 아스키 코드를 문자로 변환해서 저장한다.

     

    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class FileOutputStreamTest {
    
    	public static void main(String[] args) {
    		
    		try(FileOutputStream fos = new FileOutputStream("output.txt")){
    			fos.write(65); //A의 아스키 코드
    			fos.write(66); //B의 아스키 코드
    			fos.write(67); //C의 아스키 코드
    		}catch(IOException e) {
    			e.printStackTrace();
    		}
    		System.out.println("출력이 완료되었습니다.");
    	}
    }

    f5를 눌러 output이 생긴걸 확인할 수 있다

     

    * write(byte[] b) 메소드 사용

    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class FileOutputStreamTest2 {
    
    	public static void main(String[] args) throws IOException{
    		
    		FileOutputStream fos = new FileOutputStream("output2.txt");
    		try(fos){
    			byte bs[]= new byte[26];
    			byte data=65; //A의 아스키코드
    			for(int i=0;i<bs.length;i++) {
    				bs[i]=data;
    				data++;
    			}
    			fos.write(bs); //배열을 한꺼번에 출력
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		System.out.println("출력이 완료되었습니다.");
    	}
    }

    output2 확인

     

    * write(byte[] b, int off, int len) 메소드 사용

    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class FileOutputStreamtest3 {
    
    	public static void main(String[] args) throws IOException{
    		
    		FileOutputStream fos = new FileOutputStream("output3.txt");
    		try(fos){
    			byte bs[]= new byte[26];
    			byte data=65; //A의 아스키 코드
    			for(int i=0;i<bs.length;i++) {
    				bs[i]=data;
    				data++;
    			}
    			fos.write(bs,2,10); //배열의 인덱스 2부터 10개 바이트 출력
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		System.out.println("출력이 완료되었습니다.");
    	}
    }

    output3 확인

     

    5. flush()메소드와 close()메소드

     

    출력 스트림의 flush() 메소드의 기능은 강제로 자료를 출력하는 기능이다.

    버퍼에 저장된 자료가 충분치 않다면 write()메소드를 실행해도 파일에 쓰이지 않거나 전송되지 않을 수 있다. 

    이런 경우 flush()메소드를 호출한다. 

     

    close() 메소드는 그 안에서 flush() 메소드를 호출하여 출력 버퍼가 지워지면서 남아있는 자료가 모두 출력된다.

     

     

    <문자 입출력 스트림>

     

    1.  Reader

     : 문자 단위로 읽는 스트림 중 최상위 스트림

     

    * 주로 사용하는 하위클래스

    스트림 클래스 설명
    FileReader 파일에서 문자 단위로 자료를 읽음
    InputStreamReader 바이트 단위로 읽은 자료를 문자로 변환해 주는 보조 스트림 클래스
    BufferedReader 문자로 읽을 때 배열을 제공하여 한꺼번에 읽을 수 있는 기능을 제공하는 보조 스트림

    * 자료를 읽는 메소드 

    메소드 설명
    int read() 파일로부터 한 문자를 읽음. 읽은 값 반환
    int read(char[] buf) 파일로부터 buf배열에 문자를 읽음
    int read(char[] buf, int off, int len) 파일로부터 buf배열의 off위치에서부터 len 개수만큼 문자를 읽음
    void close() 입력 스트림과 연결된 대상 리소스를 닫음

     

    2. FileReader

    FileInputStream과 같이 파일이 없으면 FileNotFoundException이 발생한다.

     

    생성자 설명
    FileReader(String name) 파일 이름 name(경로 포함)을 매개 변수로 받아 입력 스트림 생성
    FileReader(File f) File 클래스 정보를 매개변수로 받아 입력 스트림 생성

     

    "안녕하세요"라고 적힌 텍스트 파일을 만들고 그것을 읽어오도록 하자.

    import java.io.FileReader;
    import java.io.IOException;
    
    public class FileReaderTest {
    
    	public static void main(String[] args) {
    		
    		try(FileReader fr = new FileReader("hello.txt")){ //hello파일 입력 스트림 생성
    			int i;
    			while((i=fr.read())!=-1) { //다 읽을 때까지
    				System.out.print((char)i); //출력
    			}
    		}catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    }

     

    3. Writer

     : 문자 단위로 출력하는 스트림 중 최상위 스트림

     

    * 주로 사용하는 하위 클래스

    스트림 클래스 설명
    FileWriter 문자 단위로 파일에 자료를 씀
    OutputStreamWriter 파일에 바이트 단위로 출력한 자료를 문자로 변환하여 자료에 씀
    BufferedWriter 문자로 쓸 때 배열을 제공하여 한꺼번에 쓸 수 있는 기능을 제공하는 보조 스트림 

     

    * 자료를 읽는 메소드

    메소드 설명
    void write(int c) 한 문자를 출력
    void write(char[] buf) 문자 배열 buf의 내용을 출력
    void write(char[] buf, int off, int len) 문자 배열 buf를 off변수 위치부터 len만큼 출력
    void write(String str) 문자열 str을 파일에 출력
    void write(String str, int off, int len) 문자열 str을 off변수 위치부터 len만큼 출력
    void flush() 출력 버퍼를 강제로 지워 자료를 출력
    void close() 출력 스트림과 연결된 대상 리소스를 닫음

     

    4. FileWriter

    생성자 설명
    FileWriter(String name) 파일 이름 name(경로 포함)을 매개 변수로 받아 출력 스트림 생성
    FileWriter(String name,
    boolean append)
    파일 이름 name(경로 포함)을 매개 변수로 받아 출력 스트림 생성
    append값이 true이면 파일 스트림을 닫고 다시 생성할 때 파일의 끝에 이어서 씀
    FileWriter(File f) File 클래스 정보를 매개변수로 받아 출력 스트림 생성
    FileWriter(File f,
    boolean append)
    File 클래스 정보를 매개변수로 받아 출력 스트림 생성
    append값이 true이면 파일 스트림을 닫고 다시 생성할 때 파일의 끝에 이어서 씀

     

    import java.io.FileWriter;
    import java.io.IOException;
    
    public class FileWriterTest {
    
    	public static void main(String[] args) {
    		
    		try(FileWriter fw = new FileWriter("writer.txt")){
    			fw.write('A'); //A 저장
    			char buf[]= {'B','C','D','E','F','G'}; 
    			
    			fw.write(buf); //배열 저장
    			fw.write("안녕하세요. 잘 써지네요"); //문자열 저장
    			fw.write(buf,1,2); //배열의 일부 저장
    			fw.write("65"); //65 저장
    			
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		System.out.println("출력이 완료되었습니다.");
    	}
    }

    writer 확인

     

    <보조 스트림>

     

    1. 보조 스트림

     

    보조 스트림은 기반 스트림처럼 직접 쓰거나 읽는 기능은 없다.

    하지만 기반 스트림과 함께 사용하면서 보조 기능을 추가해준다

     

    Wrapper 스트림이라고도 하는데 , 생성자의 매개변수로 다른 스트림을 받게 되면 자신이 감싸고 있는 스트림이 읽거나 쓰는 기능을 수행할 때 보조 기능을 추가하게 된다.

     

    2. FilterInputStream과 FilterOutputStream

     : 보조 스트림의 상위 클래스

     

    생성자 설명
    protected FilterInputStream(InputStream in) 생성자의 매개변수로 InputStream을 받음
    public FilterOutputStream(OutputStream out) 생성자의 매개변수로 OutputStream을 받음

    이 생성자 외에는 제공하지 않는다. 

     

    보조 스트림의 매개변수에는 항상 기반 스트림만 오는 것은 아니다. 

     

    3. InputStreamReader와 OutputStreamReader

     

    바이트 단위로 자료를 읽으면 한글의 경우는 깨지게 된다. 그래서 문자는 Reader나 Writer에서 상속받은 스트림을 사용해서 자료를 읽어야한다. 

    하지만 바이트 자료만 입력되는 스트림의 경우는 문자로 변환해주는 보조 스트림이 필요하다.

     

    *InputStreamReader의 생성자

    생성자 설명
    InputStreamReader(InputStream in) InputStream 클래스를 생성자의 매개변수로 받아 Reader를 생성 
    InputStreamReader(InputStream in,
    Charset cs)
    InputStream과 Charset 클래스를 생성자의 매개변수로 받아 Reader를 생성 
    InputStreamReader(InputStream in,
    CharsetDecorder dec
    )
    InputStream과 CharsetDecorder 클래스를 생성자의 매개변수로 받아 Reader를 생성
    InputStreamReader(InputStream in,
    String charsetName)
    InputStream과 String으로 문자 세트 이름을 받아 Reader를 생성

    문자 세트란 문자를 표현하는 인코딩 방식이다. 바이트 자료가 변환될 때 지정된 문자 세트가 적용이 된다. 

     

    * InputStreamReader 사용

    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class InputStreamReaderTest {
    
    	public static void main(String[] args) {
    		//바이트 단위로 읽어온 파일을 문자로 변환하는 스트림을 생성
    		try(InputStreamReader isr = new InputStreamReader(new FileInputStream("hello.txt"))){
    			int i;
    			while((i=isr.read())!=-1) {
    				System.out.print((char)i);
    			}
    		}catch (IOException e){
    			e.printStackTrace();
    		}
    	}
    }

     

    4. Buffered 스트림

     

    내부적으로 8192 바이트 크기의 배열을 가지고 있으며 이미 생성된 스트림에 배열 기능을 추가해 더 빠르게 입출력을 실행할 수 있는 버퍼링 기능을 제공한다. 

    즉 시간적으로 빠른 것이 특징이다.

     

    * 버퍼링 기능을 제공하는 스트림 클래스

    스트림 클래스 설명
    BufferedInputStream byte 단위로 읽는 스트림에 버퍼링 기능 제공
    BufferedOutputStream byte 단위로 출력하는 스트림에 버퍼링 기능 제공
    BufferedReader 문자 단위로 읽는 스트림에 버퍼링 기능 제공
    BufferedWriter 문자 단위로 출력하는 스트림에 버퍼링 기능 제공

     

    *BufferedInputStream 생성자

    생성자 설명
    BufferedInputStream(InputStream in) InputStream 클래스를 매개변수로 받아 생성
    BufferedInputStream(InputStream in, int size) InputStream 클래스와 버퍼의 크기를 매개변수로 받아 생성

     

    5. DataInputStream과 DataOutputStream

     

    메모리에 저장된 0,1 상태를 그대로 읽거나 쓰는 스트림 클래스이다.

    그래서 자료형의 크기가 그대로 보존이 된다.

     

    *생성자

    생성자 설명
    DataInputStream(InputStream in) InputStream 클래스를 매개변수로 받아 생성
    DataOutputStream(OutputStream out) OutputStream 클래스를 매개변수로 받아 생성

    이 스트림은 각 자료형별 메소드를 제공하여 자료형에 따라 읽거나 쓸 때 사용한다.

     

    * DataInputStream 메소드

    메소드 설명
    byte readByte() 1바이트를 읽어 반환
    boolean readBoolean() 읽은 자료가 0이 아니면 true, 0이면 false를 반환
    char readChar() 한 문자를 읽어 반환
    short readShort() 2바이트를 읽어 정수 값을 반환
    int readInt() 4바이트를 읽어 정수 값을 반환
    long readLong() 8바이트를 읽어 정수 값을 반환
    float readFloat() 4바이트를 읽어 실수 값을 반환
    double readDouble() 8바이트를 읽어 실수 값을 반환
    String readUTF() UTF-8인코딩 기법으로 문자열을 읽어 반환

     

    * DataOutputStream 메소드

    메소드 설명
    void writeByte(int v) 1바이트의 자료 출력
    void writeBoolean(boolean v) 1바이트 값을 출력
    void writeChar(int v) 2바이트를 출력
    void writeShort(int v) 2바이트를 출력
    void writeInt(int v) 4바이트를 출력
    void writeLong(long v) 8바이트를 출력
    void writeFloat(float v) 4바이트를 출력
    void writeDouble(double v) 8바이트를 출력
    void writeUTF(String str) UTF-8인코딩 기법으로 문자열을 출력

     

    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class DataStreamTest {
    
    	public static void main(String[] args) throws IOException{ //예외처리 선언
    	
    		DataInputStream in = null; //자바의 여러 자료를 입력하는 기능
    		DataOutputStream out = null; //자바의 여러 자료를 출력하는 기능
    		
    		try {
    			int c;
    			
    			out=new DataOutputStream(new BufferedOutputStream(
    					new FileOutputStream("data.bin")));
    			out.writeDouble(3.14);
    			
    			out.writeInt(100);
    			out.writeUTF("자신의 생각을 바꾸지 못하는 사람은 결코 현실을 바꿀 수 없다");
    			
    			out.flush();
    			in=new DataInputStream(new BufferedInputStream(
    					new FileInputStream("data.bin")));
    			//입력한 순서대로 맞는 자료형을 사용하여 출력 
    			System.out.println(in.readDouble());
    			System.out.println(in.readInt());
    			System.out.println(in.readUTF());
    		} finally {
    			if(in!=null) {
    				in.close();
    			}
    			if(out!=null) {
    				out.close();
    			}
    		}
    	}
    }

    모든 자료형을 다 읽어냄

     

    <기타>

     

    1. 스캐너를 사용한 출력 스트림

     

    스캐너 클래스의 경우는 소수점이나 콤마가 있을 경우에는 텍스트를 실수(Double)로 인식을 하여 출력해준다 

     

    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Scanner;
    
    public class ScanTest2 {
    
    	public static void main(String[] args) throws IOException{
    		
    		Scanner s = null;
    		double sum=0;
    		PrintWriter out = null;
    		
    		out = new PrintWriter(new FileWriter("output.txt")); // output텍스트 파일에 문자 입력
    		out.println("9.5"); //9.5입력
    		out.println("567,000"); //567,000 입력
    		out.flush(); //비움
    		s=new Scanner (new BufferedReader(new FileReader("output.txt"))); //읽어오기 위해 스캐너 생성
    		while (s.hasNext()) {
    			if(s.hasNextDouble()) { //실수라면
    				sum+=s.nextDouble(); //sum에 누적
    			}else {
    				s.next(); //아니면 넘어감
    			}
    		}
    	
    	if(out!=null)
    		out.close();
    	if(s!=null)
    		s.close();
    	System.out.println(sum);
    	}
    }

     

    2. zip파일 처리하는 스트림

     

    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipOutputStream;
    
    public class ZipTest {
    
    	public static void main(String[] args) throws IOException{
    		
    		String outputFile = "test.zip"; //zip파일 이름 지정
    		int level =9;
    		FileOutputStream fout= new FileOutputStream(outputFile); //파일 출력 스트림 객체 생성
    		ZipOutputStream zout = new ZipOutputStream(fout); //압축 형식의 파일 출력 스트림 객체 생성
    		zout.setLevel(level);
    		
    		ZipEntry entry = new ZipEntry("input.txt"); //zip파일에 집어넣기 위한 클래스 객체 생성
    		FileInputStream fin = new FileInputStream("input.txt"); //input을 입력해줌
    		zout.putNextEntry(entry); //zip파일을 만들어낼때 위치와 이름 정보는 entry가 된다
    		for(int c = fin.read();c!=-1;c=fin.read()) { //읽어내고
    			zout.write(c); // 써준다
    		}
    		fin.close();
    		zout.close();
    	}
    }

    압축 파일 생긴 것을 확인할 수 있다

     

    3. 압축 풀기

    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipInputStream;
    
    public class ZipTest2 {
    
    	public static void main(String[] args) throws IOException {
    		
    		FileInputStream fin = new FileInputStream("test.zip");
    		ZipInputStream zin = new ZipInputStream(fin);
    		ZipEntry entry = null;
    		
    		while((entry=zin.getNextEntry())!=null) { //압출파일 안의 정보가 존재하면
    			System.out.println("압축 해제 : "+ entry.getName()); //이름 가져오고
    			FileOutputStream fout = new FileOutputStream(entry.getName()); //그 이름의 파일에 출력
    			for(int c= zin.read();c!=-1;c=zin.read()) { //읽어오고
    				fout.write(c); //써준다
    			}
    			zin.closeEntry();
    			fout.close();
    		}
    		zin.close();
    	}
    }

    input파일이 오전 10시에 압축이 풀려 저장됨

     

    4. 직렬화

     

    변수의 값은 계속 변하기 마련이다.

    그러나 어느 순간의 상태를 그대로 저장하거나 네트워크를 통해 전송할 수 있다. 이것이 직렬화(serialization)이다.

    그리고 저장된 내용이나 전송받은 내용을 다시 복원하는 것을 역직렬화(deserialization)라고 한다.

     

    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.util.Date;
    
    public class ObjectStreamTest {
    
    	public static void main(String[] args) throws IOException{
    	
    		ObjectInputStream in = null; //입력 스트림
    		ObjectOutputStream out = null; //출력 스트림 
    		try {
    			int c;
    			
    			out = new ObjectOutputStream(new FileOutputStream("object.dat")); //출력 객체 생성
    			out.writeObject(new Date()); //Date메소드를 기입(직렬화)
    			out.flush(); //비우고
                
    			in = new ObjectInputStream(new FileInputStream("object.dat")); //입력 객체 생성
    			Date d= (Date)in.readObject(); //객체를 데이터스트림형태로 읽어와서 강제로 Date형 변환(역직렬화) 
    			System.out.println(d); 
    		} catch (ClassNotFoundException e){
    			
    		} finally {
    			if( in !=null) {
    				in.close();
    			}
    			if(out!=null) {
    				out.close();
    			}
    		}	
    	}
    }

     

     

    5. File 클래스

     

    파일이라는 개념을 추상화한 클래스이다. 

    별도의 입출력 기능은 없지만 파일 자체의 경로나 정보를 알 수 있고 파일을 생성할 수도 있다. 

     

    *생성자

    생성자 설명
    File(String pathname) pathname을 매개변수로 받아 파일을 생성

     

    import java.io.File;
    import java.io.IOException;
    
    public class TileTest {
    //이클립스 디렉토리에 있는 것들에 대한 것이 다 나온다
    public static void main(String[] args) throws IOException{
    		
    	String name = "C:/eclipse"; //이클립스의 디렉토리
    	File dir = new File(name); //이클립스 파일을 매개로 받은 파일 클래스 생성
    	String[] fileNames = dir.list(); //디렉토리의 전체 파일리스트를 저장할 배열
    	for(String s : fileNames) {
    		File f= new File(name + "/"+s); //이클립스 안의 모든 파일을 반복문을 통해 File객체로 생성
    		System.out.println("============================");
    		System.out.println("이름: "+f.getName());
    		System.out.println("경로: "+f.getPath());
    		System.out.println("부모: "+f.getParent());
    		System.out.println("절대경로: "+f.getAbsolutePath());
    		System.out.println("정규경로: "+f.getCanonicalPath());
    		System.out.println("디렉토리 여부: "+f.isDirectory());
    		System.out.println("파일 여부: "+f.isFile());
    		System.out.println("============================");	
    	}
    }
    }

    이클립스의 전체 파일이 나옴

     

     

Designed by Tistory.