무작정 개발.Vlog

[JAVA+국비교육] 입출력 Stream

by 무작정 개발
반응형
2022.01.12(17일 차)

 

오늘은 Stream에 대해 배웠다. 정확히는 입출력 Stream이다. 자바의 정석의 챕터를 보면 Stream이 2개인 것을 알 수 있는데, 두 Stream이 같은 용어를 쓰지만 다른 개념이라고 나와있다.

 

오늘의 수업 내용

 

입출력 Stream(스트림)의 종류

Java.io 패키지에는 여러 가지 종류의 스트림 클래스를 제공하고 있는데 스트림 클래스는 크게 두 종류로 구분됨.

 

(byte) 바이트 기반 스트림

  • InputStream - 입력 스트림
  • OutputStream - 출력 스트림

(character) 문자 기반 스트림

  • Reader - 입력 스트림
  • Writer - 출력 스트림

입출력 Stream

종류가 다양하게 데이터 입출력 시 모든 데이터를 형태와 관계없이 일련 된 흐름으로 전송하는 것 ( 파이프라인 개념)

package com.day16;

import java.io.IOException;

//Stream
//데이터 입출력 시 모든 데이터를 형태와 관계없이 일련된 흐름으로 전송하는 것 - 파이프라인

//in 
public class Test1 {

	public static void main(String[] args) throws IOException {
		
		int data;
		
		System.out.print("문자 입력 : "); // dfd235
					//System.in,read가 자바에서 제공하는 입력 Stream
		while((data = System.in.read()) != -1) {// 1바이트 문자 1개를 읽어옴
			
			char ch = (char)data;
			System.out.print(ch);
		}
		
	}

}

FileInputStream - 파일을 찾아서 읽는 스트림

package com.day16;

import java.io.FileInputStream;

//매우중요
//파일 읽어오기 - FileInputStream - 1바이트씩 쓰고 1바이트씩 읽기
public class Test5 {

	public static void main(String[] args) {
		
		try {
			
			//파일을 읽어서 fis에 넣었음
			FileInputStream fis = new FileInputStream("c:\\doc\\test.txt");
			
			int data;
			
			//파일에 몇자가 들어간지 모르니 while문으로
			while((data = fis.read()) != -1) {
				
				
				//이렇게하면 파일이 깨짐
				//System.out.print((char)data);
				
				//이클립스는 기본적으로 인코딩이 ANSI이다.
				System.out.write(data); // 엔터를 기준으로 읽어옴
				System.out.flush(); // 안나온 것들 강제로 빼줌
			}
			
			fis.close();
			
			
		} catch (Exception e) {
			
			System.out.println(e.toString());
		}

	}

}

FileOutputStream - 파일을 생성할 때 사용하는 스트림

package com.day16;

import java.io.FileOutputStream;

//FileOutputStream - 파일을 내보낼 때 쓴다.


public class Test6 {

	public static void main(String[] args) {
		
		try {
			
			FileOutputStream fos = new FileOutputStream("c:\\doc\\out1.txt");
			
			int data;
			System.out.print("문자열 : "); //abcd
			
			while((data = System.in.read()) != -1) {
				
				fos.write(data);
			}
			
			fos.close();
			
			
			
			
		} catch (Exception e) {
			// TODO: handle exception
		}

	}

}

파일 복사하기

ackage com.day16;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Scanner;

//파일 복사
//원본 파일? c:\\doc\\test.txt
//대상 파일? c:\\doc\\out2.txt
//복사완료
public class Test7 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int data; //int로 한 이유는 read가 int형으로 받기때문
		String file1, file2;
		
		try {
			
			System.out.print("원본 파일?");
			file1 = sc.next();
			System.out.print("대상 파일?");
			file2 = sc.next();
			
			FileInputStream fis = new FileInputStream(file1);
			FileOutputStream fos = new FileOutputStream(file2);
			
			//1바이트 씩 읽어내서 
			while((data = fis.read()) != -1) {
				
				//여기서 읽어오면서 복사되고 데이터가 fos가 들어간다. fos에 데이터가 들어가면 덮어씌어지는데 그게 복사
				fos.write(data);//읽어옴
				fos.flush();//남은거 강제로 읽고
			}
			
			fis.close();
			fos.close(); //닫아주고
			System.out.print("파일복사완료");
			
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

}

FileInputStream : 파일을 읽어온다

FileOutputStream : 파일을 내보낸다.


File 클래스

package com.day16;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Test8 {
	
	public boolean fileCopy(String str1, String str2) {
		
		//File클래스는 삭제는 가능하나 수정은 불가능
		File f = new File(str1);
		
		//if문은 대부분 부정으로
		if(!f.exists()) { //경로 찾아가봐서 파일이 없으면 실행하지마
			return false;
		}
		
		try {
			//파일을 받을 때 사용하는 코딩 
			FileInputStream fis = new FileInputStream(f); //str1
			FileOutputStream fos = new FileOutputStream(str2);
			//여기부터 - 파일을에 있는 내용을 읽어내고 내용을 수정해서 내보낼때 쓰는 코딩 중요!
			int data = 0;
			byte[] buffer = new byte[1024];
			
			while((data = fis.read(buffer, 0, 1024)) != -1) { // buffer에서 0번째부터 1024크기까지 읽자.
				fos.write(buffer, 0, data); // buffer에서 0부터 data크기만큼 내보내라
			}
			///여기까지-----------------------------------------
			fis.close(); //close를 쓰는 이유는 길어질 때 쓰레기값이 생기니까 닫아준다.
			fos.close();
			
		} catch (Exception e) {
			// TODO: handle exception
		}
		return true;
		
	}

	public static void main(String[] args) {
		
		Test8 ob = new Test8();
		
		if(ob.fileCopy("c:\\doc\\test.txt", "c:\\doc\\out6.txt")) {
			System.out.println("파일복사 성공!!");
		} else {
			System.out.println("파일복사 실패!!");
		}
			
	}

}
package com.day16;

import java.io.File;
import java.io.IOException;
import java.util.Date;

//File 클래스
//파일 및 폴더를 관리할 수 있도록 기능을 제공해주는 클래스
//파일의 복사 또는 이름변경 등의 조작을 할 경우에만 사용될 뿐( 내용 수정만 불가능)
//파일의 내용을 입출력 하기위한 메서드를 제공하지는 않는다.

public class Test12 {

	public static void main(String[] args) throws IOException {
		
		File f = new File("c:\\doc\\test.txt");
		
		System.out.println("파일명 : " + f.getName());
		System.out.println("파일 길이 : " + f.length());
		System.out.println("파일경로 : " + f.getAbsolutePath());
		System.out.println("표준경로 : " + f.getCanonicalPath()); //예외처리 해줘야함
		System.out.println("만든날 : " + new Date(f.lastModified()));
		System.out.println("파일 패스 : " + f.getParent());
		System.out.println("읽기속성 : " + f.canRead());
		System.out.println("쓰기속성 : " + f.canWrite());

	}

}

 

 

반응형

블로그의 정보

무작정 개발

무작정 개발

활동하기