1. 스트림(Stream)이란?
    • 일차원적인 데이터의 흐름
    • 스트림에 데이터를 쓸 수 있고, 스트림에서 데이터를 읽을 수 있다.
  2. 스트림의 특징
    1. 스르림은 FIFO 구조이다.
      • FIFO 구조란 먼저 들어간 것이 먼저 나오는 형태로서 데이터의 순서가 바뀌지 않는다는 특징을 가지고있다.
    2. 스트림은 단방향이다.
      • 자바에서 스트림은 읽기, 쓰기동시에 되지 않는다. 따라서 읽기, 쓰기가 필요하다면 읽는 스트림과 쓰는 스트림을 하나씩 열어 사용해야 한다.
    3. 스트림은 지연될 수 있다.
      • 스트림은 넣어진 데이터가 처리되기 전까지는 스트림에 사용되는 스레드는 지연상태에 빠진다.
      • 즉, 네트워크 내에서는 데이터가 모두 전송되기 전까지 네트워크 스레드는 지연상태가 된다.
  3. 스트림의 분류
    1. 데이터 전송 방향에 의한 분류
      1. 입력 스트림(InputStream)
        • 프로그램으로 들어오는 스트림
      2. 출력 스트림(OutputStream)
        • 프로그램에서 밖에서 나가는 스트림
    2. 데이터 전송 단위에 의한 분류
      1. 문자 스트림(character stream)
        • 한 문자(2 byte) 단위로 읽고, 쓸 수 있는 스트림
      2. 바이트 스트림(byte stream)
        • 한 byte 단위로 읽고, 쓸 수 있는 스트림
  4. File Class
    • File 클래스는 파일 혹은 디렉토리의 등록정보를 표현하는 클래스
    • File 클래스는 실제 파일의 내용을 포함하지 않는다.
    • File 객체는 실제 파일의 존재여부와 상관없이 생성된다.
    1. 생성자

      생성자 

      설명 

      File(String pathname) 

      문자열 Pathname을 가지고 경로를 생성하여 File 객체를 생성한다. 

      File(String parent, String child) 

      Parent와 child 문자열을 연결한 문자열로 경로를 생성하여 File 객체를 생성한다. 

      File(File parent, String child) 

      Parent의 객체와 child 문자열로 경로를 생성하여 File 객체를 생성한다. 



    2. 메소드

    3. 반환형

      메소드 

      설명 

      boolean

      canRead() 

      파일을 읽을 수 있으면 true,

      그렇지 않으면 false 

      canWrite() 

      파일을 쓸 수 있으면 true,

      그렇지 않으면 false 

      createNewFile() 

      파일을 새로 생성하면 true,

      그렇지 않으면 false 

      delete() 

      파일을 지우면 true,

      그렇지 않으면 false 

      exists()

      파일이나 디렉토리가 존재하면 true,

      그렇지 않으면 false 

      String

      getAbsolutePath() 

      파일의 절대 경로를 반환한다. 

      getCanonicaPath() 

      파일의 정규 경로를 반환한다. 

      getName()

      파일명을 반환한다. 

      boolean 

      isDirectory() 

      디렉토리면 true,

      그렇지 않으면 false 

      isFile() 

      파일이면 true,

      그렇지 않으면 false 

      long 

      lastModified()

      1970년 1월 1일부터 현재까지의 시간을 밀리세컨드 초로 반환 

      length() 

      파일의 크기를 바이트로 반환 

      String[] 

      list() 

      특정 디렉토리를 생성하면 true,

      디렉토리가 있어서 생성하지 못하면 false 

      boolean 

      mkdir() 

      디렉토리를 생성하면 true,

      디렉토리가 있어서 생성하지 못하면 false 

      renameTo(File dest) 

      dest 파일 객체로 이름을 바꾸면 true,

      그렇지 않으면 false 


      • 파일 정보 출력 예제 1

        import java.io.File; public class FileEx1 { public static void main(String[] args) { File file = new File("경로/hello.txt"); System.out.println("파일인지 여부 : " + file.isFile()); System.out.println("디렉토리인지 여부 : " + file.isDirectory()); System.out.println("상대경로 : " + file.getPath()); System.out.println("절대경로 : " + file.getAbsolutePath()); System.out.println("디렉토리 혹은 파일의 이름 : " + file.getName()); System.out.println("파일의 길이 : " + file.length()); System.out.println("파일의 최종 수정 날짜 : " + file.lastModified()); } }

      • 파일 목록 출력 예제 2
        import java.io.File;
        
        public class FileEx2 {
        	public static void main(String[] args) {
        		File directory = new File("디렉토리 경로");
        		
        		if(directory.exists()){
        			if(directory.isDirectory()){
        				// 현재 디렉토리내의 모든 파일 디렉토리의 이름 얻기
        				String[] fileNameList = directory.list();
        				// for (자료형 index : 변수명)
        				for (String fileName : fileNameList){
        					System.out.println("파일 이름 : " + fileName);
        				}
        			}
        		}
        	}
        }
        
        
      • 파일, 디렉토리 생성 및 삭제 변경
      • import java.io.File; import java.io.IOException; public class FileEx3 { public static void main(String[] args) { // 파일 생성 File f1 = new File("경로명/newFile.txt"); if (f1.exists()) { System.out.println("파일 이름 : " + f1.getName()); } else { try { if (f1.createNewFile()) { System.out.println("새로운 파일을 만들었습니다."); } } catch (IOException e) { e.printStackTrace(); } } File f2 = new File("경로명/newDirectory"); if (f2.exists()) { f2.mkdir(); } else { System.out.println("디렉토리 이름 : " + f2.getPath()); } //파일 혹은 디렉토리 삭제 File f3 = new File("경로명/text.txt"); if(f3.exists()){ f3.delete(); } //파일 혹은 디렉토리 이름 변경 File src = new File("경로명/newFile.txt"); File dest = new File("경로명/dest.txt"); File dest2 = new File("경로명/dest2.txt"); if(src.exists()){ src.renameTo(dest); src.renameTo(dest2); } if(f2.isDirectory()){ String dir[] = f2.list(); System.out.println("\n \n Dir Content:===========\n"); for (String dirs : dir){ System.out.println("dirs : " + dirs); } } } }

  5. Byte Stream의 상속 관계
  6. Byte Stream의 주요 메소드

     InputStream

    close() 

    Device와 연결된 스트림 해제 

    read() 

    1 byte씩 읽어서 바이트 값 반환 

    read(byte[] b)

    1 byte씩 읽어서 byte 배열에 저장하고, 배열에 저장된 개수를 반환한다.

    스트림의 끝에 도달하면 -1을 반환 

    read(byte[], int start, int length) 

    데이터를 length만큼 읽어서 byte[]에 start 위치에 저장하고 읽은 수 만큼 반환한다.

     OutputStream

    close() 

    Device와 연결된 스트림 해제 

    write(int i) 

    1 byte 기록한다. 

    write(byte[] b) 

    byte배열에 저장된 data를 기록한다. 

    write(byte[], int offset, int length) 

    byte배열에 저장된 data를 offset위치에서 length만큼 기록한다.


  7. FileInputStream과 FileOutputStream
    • 바이트 단위로 파일 내용을 읽어 들이거나, 파일에 내용을 기록할 때 사용하는 스트림

    1. 생성자

      생성자 

      설명 

      FileInputStream(String fileName) 

      fileName의 파일객체를 생성하고 InputStream을 연결 

      FileInputStream(File file) 

      file 객체에 inputStream을 연결 

      FileOutputStream(String fileName) 

      fileName의 파일객체를 생성하고 outputStream을 연결 

      FileOutputStream(String name, boolean append)

      append가 true이면 파일에 내용을 이어쓰고, append가 false이면 덮어쓴다. 

      FileOutputStream(File file) 

      file 객체에 outputStream을 연결 

      FileOutputStream(File file, boolean append) 

      append가 true이면 파일에 내용을 이어쓰고, append가 false이면 덮어쓴다. 


      • FileInputStream 예제

        import java.io.FileNotFoundException;
        import java.io.FileOutputStream;
        import java.io.IOException;
        
        public class FileOutputStreamEx {
        	public static void main(String[] args) {
        		FileOutputStream fos = null;
        
        		try {
        			// FileNotFoundException 예외처리
        			fos = new FileOutputStream("c:\\fileout.txt");
        			String message = "Hello FileOutPutStream!!";
        			// IOException 예외처리
        			fos.write(message.getBytes());
        
        		} catch (FileNotFoundException e) {
        			e.printStackTrace();
        		} catch (IOException e) {
        			e.printStackTrace();
        		} finally {
        			try {
        				// FileOutputStream 스트림 해제
        				fos.close();
        			} catch (IOException e) {
        				e.printStackTrace();
        			}
        			
        		}
        
        	}
        }
        

      • 파일 복사 예제 1 : 1 byte 단위로 복사
        import java.io.File;
        import java.io.FileInputStream;
        import java.io.FileNotFoundException;
        import java.io.FileOutputStream;
        import java.io.IOException;
        
        public class FileCopyEx1 {
        	public static void main(String[] args) {
        		System.out.println("파일복사 시작");
        
        		long start = System.currentTimeMillis();
        		FileInputStream src = null;
        		FileOutputStream dest = null;
        		try {
        			// 원본파일을 읽기 위한 FileInputStream 객체 생성
        			src = new FileInputStream(new File("src.zip"));
        			// 복사본 파일을 생성하기 위한 FileOutputStream 객체 생성
        			dest = new FileOutputStream(new File("dest.zip"));
        
        			// FileInputStream을 통해서 읽어들인 값을 저장할 변수
        			int readValue = 0;
        
        			// FileInputStream의 read()메소드를 통해서 읽어들인 값을 readValue에 저장
        			while ((readValue = src.read()) != -1) {
        				// readValue에 저장된 값을 FileOutputStream의 write() 메소드를 통해서 파일에 기록
        				dest.write(readValue);
        			}
        		} catch (FileNotFoundException e) {
        			e.printStackTrace();
        		} catch (IOException e) {
        			e.printStackTrace();
        		} finally {
        			try {
        				if (dest != null) {
        					dest.close();
        				}
        				if (src != null) {
        					src.close();
        				}
        			} catch (IOException e) {
        				e.printStackTrace();
        			}
        		}
        		long end = System.currentTimeMillis();
        		long copyTime = (end - start) / 1000;
        		System.out.println("걸린 시간 : " + copyTime + " 초");
        	}
        }
        
      • 파일 복사 예제 2 : byte[] 를 이용한 복사
        import java.io.FileInputStream;
        import java.io.FileNotFoundException;
        import java.io.FileOutputStream;
        import java.io.IOException;
        
        public class FileCopyEx2 {
        	public static void main(String[] args) {
        		System.out.println("파일 복사 시작");
        		long start = System.currentTimeMillis();
        		FileInputStream src = null;
        		FileOutputStream dest = null;
        
        		try {
        			src = new FileInputStream("src.zip");
        			dest = new FileOutputStream("dest.zip");
        			// 임시저장소에 저장된 data의 전체갯수를 저장할 변수
        			int length = 0;
        			// 임시 저장소로 사용될 byte[] 배열 선언
        			byte[] buffer = new byte[1024 * 8];
        			// InputStream을 통해서 읽어들인 data를 임시저장소에 쌓고 저장된 data의 갯수를 length에 저장한다.
        			while ((length = src.read(buffer)) != -1) {
        				// outputStream을 통해서 임시저장소에 쌓여있는
        				// data을 length만큼 파일에 기록한다.
        				dest.write(buffer, 0, length);
        			}
        		} catch (FileNotFoundException e) {
        			e.printStackTrace();
        		} catch (IOException e) {
        			e.printStackTrace();
        		} finally {
        			try {
        				if (dest != null) {
        					dest.close();
        				}
        				if (src != null) {
        					src.close();
        				}
        			} catch (IOException e) {
        				// TODO Auto-generated catch block
        				e.printStackTrace();
        			}
        		}
        		long end = System.currentTimeMillis();
        		long copyTime = (end - start) / 1000;
        		System.out.println("걸린 시간 : " + copyTime + " 초");
        	}
        }
        
  8. DataInputStream과 DataOutputStream
    • 특정 데이터 타입과 포맷을 유지한 채 데이터를 기록하고 읽어올 수 있는 스트림
    • 특정 데이터 타입과 포맷에 맞게 읽고 쓸 수 있는 readBoolean(), writeBoolean(boolean v), readInt(), writeInt(int v), readUTF(), writeUTF(Strring s)등 의 메소드를 제공한다.
    1. 생성자
      • DataInputStream(InputStream stream)
      • DataOutputStream(OutputStream stream)
        1. DataOutputStream 활용 예제 : 여러 가지 자료형의 데이터를 파일에 기록
        2. DataInputStream 활용 예제 : 특정 자료형의 포맷과 값을 유지한 채로 읽어오기
  9. 문자 스트림
    • 바이트 스트림에 추가하여 Reader와 Writer 클래스를 제공하는데, 이것은 2바이트를 입출력 할 수 있는 문자 기반 스트림이다.
    • 바이트 스트림은 1바이트를 입출력하기 때문에 일반적으로 영문자로 구성된 파일, 동영상 파일, 음악 파일의 입출력 등에 적합한 스트림이다.
    • 문자 스트림은 2바이트를 입출력하기 때문에 세계 모든 언어로 구성된 파일을 입출력하기에 적합하다.
  10. 문자 Stream의 상속관계
  11. 문자 Stream의 주요 메소드
    • Reader의 주요 메소드
    • Writer의 주요 메소드
  12. FileReader와 FileWriter
    • 문자 단위로 파일 내용을 읽어 들이거나, 파일에 내용을 기록할 때 사용하는 스트림
    • 텍스트 기반의 파일만을 읽고 쓸 수 있다.
    1. FileReader의 생성자
    2. FileWriter의 생성자
    • FileWriter 활용 예제 : 파일에 텍스트 기록하기
    • FileReader 활용 예제 : 파일로부터 한 문자씩 텍스트 읽기
  13. Bridge 스트림과 Bufferd스트림
    • 브릿지(Bridge) 스트림 : 바이트 스트림을 문자스트림으로 변환하는 스트림
    1. InputStreamReader : 바이트 입력 스트림을 문자 입력스트림으로 변환
      InputStreamReader isr = new InputStreamReader(System.in);
    2. OutputStreamWriter : 바이트 출력 스트림을 문자 출력스트림으로 변환
      FileOutputStream fos = new FileOutputStream("hello.txt");
      OutputStreamWriter osw = new OutputStreamWriter(fos);
    • Buffered 스트림 : 스트림의 읽고 쓰는 성능을 개선하기 위해 스트림 내부에 버퍼를 가지고있는 스트림
      1. BufferedInputStream, BufferedOutputStream
      2. BufferedReader, BufferedWriter
    • BufferedReader 스트림
      • BufferedReader은 readLine()메소드 제공
      • readLine()메소드는 스트림으로부터 한 라인씩 읽을 수 있다.
      • readLine()메소드는 문자열을 반환하면, 스트림의 긑에 도달하면 null을 리턴한다.
      • 개행문자의 앞까지 읽어온다.
    • BufferedWriter 활용예제 : 텍스트에 문자 기록하기
    • BufferedReader 활용예제 : 텍스트로부터 문자읽기
  14. PrintStream과 PrintWriter
    1. PrintStream
      • PrintStream은 모든 자료형을 출력할 수 있는 print(), println() 메소드가 오버로딩 되어 있다.
      • 프로그램이 시작되면 장치와 연결된 출력스트림인 System.out, System.err 객체가 PrintStream 객체이다.
      • 다른 스트림과는 다르게 플러쉬 기능을 자동으로 처리할 수 있는 생성자를 가지고 있다.
    2. PrintWriter
      • PrintWriter 클래스는 다른 스트림과 다르게 바이트 출력 스트림과 문자 출력 스트림을 가지고 객체를 생성할 수 있는 클래스이다.
      • 자동 플러쉬 기능을 가지고 있다.
      • PrintWriter 클래스의 생성자에는 FileNotFoundException 예외를 발생하기 때문에 반드시 예외처리를 해야 한다.
      • PrintStream 활용 예제 : 파일에 문자 기록하기
      • PrintWriter 활용 예제 : 파일에 문자 기록하기
  15. Scanner Class
    • Scanner 클래스는 입력 값(문자열, 파일, 입력 스트림)을 정규 표현식으로 구분하여 문자열이나 기본 데이터 타입으로 토큰 할 수 있는 클래스이다. 정규 표현식이란 언어를 표현 할 수 있는 문자식을 말한다.
    • 이렇게 구분된 토큰은 다양한 nextXXX() 메소드를 사용하여 다른 타입의 값으로 바뀌게 된다. 
    1. 생성자
      • Scanner 클래스는 매개변수로 네 가지 타입을 갖는다.
      • 네 가지 타입 - File, InputStream, Readable, String
      • Scanner 클래스는 네 가지 타입을 매개변수로 구분자나 구분 패턴을 사용하여 문자열이나 기본 데이터 타입으로 토큰 할 수 있는 클래스이다.
    2. 주요 메소드
    • 키보드로 입력한 값을 int로 변환한 예
    • File 클래스를 이용한 double로 변환한 예
    • 문자열을 구분 패턴으로 변환한 예
    • 스트림을 이용한 구분 패턴으로 변환한 예
    • Scanner 활용 예제 1 : 키보드로부터 숫자 입력 받기
    • Scanner 활용 예제 2 : 파일로부터 읽어오기
    • Scanner 활용 예제 3 : URL로부터 읽어오기
    • Scanner 활용 예제 4 : String으로부터 읽어오기
  16. 객체의 직렬화
    • 가상머신 안에 존재하는 특정 객체(객체의 메모리와 객체에 대한 정보)를 바이트 형태로 변환하는 것.
    • 객체의 직렬화를 통해 프로그램이 실행되는 동안 생성된 객체를 스트림을 이용해서 지속적으로 보관하거나 전송할 수 있다.
    • 직렬화 가능한 클래스를 만드는 방법
      1. Serializable 인터페이스를 이용
      2. Externalizable 인터페이스를 이용
      • 직렬화 예제 : 객체 직렬화하기
  17. ObjectStream(객체 스트림)
    • ObjectOutputStream과 ObjectInputStream은 각각 객체를 직렬화, 역직렬화하는 메소드를 제공하는 스트림이다.
    • ObjectStream의 주요 생성자
      • ObjectOutputStream(OutputStream os)
      • ObjectInputStream(InputStream is)
    • ObjectStream의 주요 메소드
      • ObjectOutputStream의 void writeObject(Object obj)
        객체를 직렬화하고 스트림을 통해서 기록(전송)한다.
      • ObjectInputStream의 Object readObject()
        스트림을 통해 읽어들인 직렬화된 객체를 역직렬화(객체로 복원)한다.
        반환형이 Object이기 때문에 해당 객체 타입으로 캐스팅해야 한다.
      • 참고 : transient (Serializable 인터페이스를 상속받았을 경우)
        멤버변수를 직렬화 대상에서 제외하고자 할 때 사용한다.
        멤버 변수 앞에 명시한다.
    • ObjectOutputStream 활용예제 : 직렬화도니 객체를 파일에 저장하기


+ Recent posts