본문 바로가기
Java

[Java] 데이터 입출력(1) FileInputStream, DataInputStream, FileOutputStream, DataOutputStream

by happyhelen 2021. 8. 9.

입력 (Input) : 파일 읽기, 이미지 & 동영상 불러오기

출력 (Output) : 파일 쓰기, 이미지 & 동영상 내보내기

 

데이터가 오고 가는 길인 stream 으로 프로그램과 입/출력 대상을 연결한다

 

InputStream & OutputStream 은 추상클래스로 추상메소드를 갖고있다

InputStream 으로 프로그램에 입력하고 OutputStream 으로 프로그램에서 출력한다

 

InputStream 클래스                   OutputStream 클래스

 - FileInputStream                      - FileOutputStream

 - DataInputStream                    - DataOutputStream

 - BufferedInputStream               - BufferedOutputStream

 

FileInputStream & FileOutputStream 

1byte 단위로 데이터를 읽어들인다


input

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class No16_stream_Input {

	public static void main(String[] args) {
		// read()
		/*
		InputStream inputStream = null;
		
		try {
			inputStream = new FileInputStream("C:\\Users\\1\\HelloWorld.txt");
			int data = 0;
			
			while(true) {
				try {
					data = inputStream.read(); // 1byte단위로 읽어들어오기, 읽을게 없으면 -1이 담긴다
				} catch (IOException e) {
					e.printStackTrace();
				}
				if(data == -1) break; // -1이 담기면 빠져나오기
				System.out.println("data: "+ data); // 아스키코드로 출력됨
			}
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			try {
				if(inputStream != null) inputStream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		*/
		
		// read(byte[]) 정한 바이트배열의 크기만큼 묶어서 불러오기때문에 속도 빠름
		// 마지막에 바이트배열의 크기보다 부족한 데이터가있으면 data 는 남은 데이터 수, 부족한 데이터는 이전의 데이터를 그대로 가져옴
		InputStream inputStream = null;
		try {
			inputStream = new FileInputStream("C:\\Users\\1\\HelloWorld.txt");
			int data =0;
			byte[] bytearr = new byte[3]; // 바이트배열 생성
			while(true) {
				try {
					data = inputStream.read(bytearr);
				} catch (IOException e) {
					e.printStackTrace();
				}
				if(data == -1) break;
				System.out.println("data: "+ data);
				for(int i=0; i<bytearr.length; i++) {
					System.out.println("bytearr["+i+"] : "+bytearr[i]);
				}
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			try {
				if(inputStream != null) inputStream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
            
		}
	}
}

 

 

output

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class No16_stream_Output {

	public static void main(String[] args) {
		/*
		//write()
		FileOutputStream outputStream = null;
		try {
			// 기존에 있으면 덮어씌우고, 없으면 새로생성함
			outputStream = new FileOutputStream("C:\\Users\\1\\Hellojava.txt"); 
			String data = "Hello java world!!";
			byte[] arr = data.getBytes(); // data에서 byte를 get해서 -> arr 배열
			
			try {
				outputStream.write(arr); // arr 배열의 byte를 output
			} catch (IOException e) {
				e.printStackTrace();
			} 
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			
			try {
				if(outputStream != null) outputStream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		*/
		
		//write(배열, 시작, 길이)
				FileOutputStream outputStream = null;
				try {
					// 기존에 있으면 덮어씌우고, 없으면 새로생성함
					outputStream = new FileOutputStream("C:\\Users\\1\\HelloWorld.txt"); 
					String data = "Hello awesome world!!";
					byte[] arr = data.getBytes(); // data에서 byte를 get해서 -> arr 배열
					
					try {
						outputStream.write(arr, 2, 10); // index2부터 10개
					} catch (IOException e) {
						e.printStackTrace();
					} 
				} catch (FileNotFoundException e) {
					e.printStackTrace();
				} finally {
					
					try {
						if(outputStream != null) outputStream.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
		}
}

 

 

copy

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;


public class No16_stream_Copy {

	public static void main(String[] args) {
		InputStream inputS = null;
		OutputStream outputS = null;
		
		try {
			inputS = new FileInputStream("C:\\Users\\1\\Hellojava.txt"); // 이거를
			outputS = new FileOutputStream("C:\\Users\\1\\HellojavaCopy.txt"); // 여기에 => 복사
			
			byte[] arr = new byte[3]; // 3개씩 읽어올것
			
			while(true) {
				int len = inputS.read(arr);
				if(len == -1) break; // 더이상 읽을 데이터가 없을때까지
				outputS.write(arr, 0, len); // 처음부터 3개씩 write
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(inputS != null) {
				try {
					inputS.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			if(outputS != null) {
				try {
					outputS.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}

	}

}

 

 


byte 단위보다 문자단위로 input, output, copy 하기 = DataInputStream, DataOutputStream 활용

 

output

import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class No16_stream_DataOutput {

	public static void main(String[] args) {
		String str = "Hello Java World!@";
		OutputStream outputS = null;
		DataOutputStream dataOutputS = null;
		
		try {
			outputS = new FileOutputStream("C:\\Users\\1\\HelloOutput.txt");
			dataOutputS = new DataOutputStream(outputS); // FileoutputStream을 매개변수로 활용한다
			
			dataOutputS.writeUTF(str); // 문자열이니까 UTF로 write
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(dataOutputS != null) dataOutputS.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
			
			try {
				if(outputS != null) outputS.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}

}

 

 

copy

 

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;


public class No16_stream_DataStreamCopy {

	public static void main(String[] args) {
		// 파일복사하기(문자단위로)
		InputStream inputS = null;
		DataInputStream dataInputS = null;
		OutputStream outputS = null;
		DataOutputStream dataOutputS = null;
		
		try {
			inputS = new FileInputStream("C:\\Users\\1\\Hellojava.txt");
			dataInputS = new DataInputStream(inputS); // byte단위보다 문자단위로 다루기 위해 업그레이드
			
			String str = dataInputS.readUTF(); // 문자단위로 읽고
			
			outputS = new FileOutputStream("C:\\Users\\1\\HellojavaCopy2.txt");
			dataOutputS = new DataOutputStream(outputS);
			
			dataOutputS.writeUTF(str); // 문자단위로 쓴다
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// EOFException 이유 : UTF로 쓰인 파일만 UTF로 읽어올 수 있기때문 -> writeUTF()로 파일 작성 먼저하고 읽으면 ok
			try {
				if(inputS != null) inputS.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
			
			try {
				if(dataInputS != null) dataInputS.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
			
			try {
				if(outputS != null) outputS.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
			
			try {
				if(dataOutputS != null) dataOutputS.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}

}

'Java' 카테고리의 다른 글

[Java] 네트워킹  (0) 2021.08.17
[Java] 데이터 입출력(2) BufferedReader, BufferedWriter  (0) 2021.08.09
[Java] 예외처리  (0) 2021.08.02
[Java] Collections(1)_List 인터페이스  (0) 2021.08.02
[Java] StringBuffer, StringBuilder  (0) 2021.08.01