부트캠프(Java)

자바/스프링 부트캠프 16일차 ( 반복자 , 스트림)

동곤일상 2025. 2. 21. 12:53
반응형

1) Iterator (반복자)  Enumeration 

2) stack 과 Queue

 

3) 입출력 스트림 

텍스트가 아닌 파일은 반드시 FileInputStream , FileOutputStream 이용

 

 

 

 

 

 


1) Iterator (반복자)  Enumeration 

 

* Iterator 인터페이스 : 반복자

 ITerator() : Collection 객체는 Iterator 객체로 변환이 가능함

주요메서드

 boolean HasNext() : 조회할요소가있는가

 Object next(); ㅣ 조회대상 객체리턴

 void remove(); : 조회된 객체를 제거 . next() 실행 이후에가능

 

 

 

 

public class IterartorEx1 {
	public static void main(String[] args) {
		Iterator<Object> it = null;
		ArrayList<Object> list = new ArrayList<Object>();
		HashSet<Object> set = new HashSet<Object>();
		for (int i = 1; i <= 5; i++) {
			list.add(i+10);
			set.add(i*10);
		}
		System.out.println("print 이전의 list : "+list);
		System.out.println("print 이전의 set : "+set);
		
		it = list.iterator(); //Collection의 하위만 사용가능 
		print(it);
		it = set.iterator();
		print(it);
		System.out.println("print 이후의 list : "+list);
		System.out.println("print 이후의 set : "+set);
		
	}
	private static void print(Iterator<Object> e ) {
		while(e.hasNext()) {
			//다음 조회 할 대상이 있니?
			System.out.print(e.next()+",");
			//조회대상 객체반환 
			e.remove();
			//조회된 객체 삭제
		}System.out.println();
		
	}
}

print 이전의 list : [11, 12, 13, 14, 15]

print 이전의 set : [50, 20, 40, 10, 30]

11,12,13,14,15,

50,20,40,10,30,

print 이후의 list : []

print 이후의 set : []

 


 

 Enumeration 인터페이스 :

Iterator 이전의 반복자 Hashtable , Vector에서만 사용가능

 

 메서드

  boolean hasNextElement() : 조회요소가 있는가

  Object nextElement : 조회 대상 객체 리턴

package ex4_Iterator;

import java.util.Enumeration;
import java.util.List;
import java.util.Vector;

public class EnumerationEx1 {
	public static void main(String[] args) {
//		List<Object> fruits = new Vector<>();
		Vector<Object> fruits = new Vector<>();
		fruits.add("Apple");
		fruits.add("Banana");
		fruits.add("Cherry");
		fruits.add("Mango");
		Enumeration<Object> e = fruits.elements();
		//elements() : Vector클래스의 멤버 ( ArrayList등은 사용할수없음)
		System.out.println("과일 목록 : ");
		print(e);
	}

	private static void print(Enumeration<Object> e) {
		while(e.hasMoreElements()) {
			System.out.print(e.nextElement()+",");
			
		}System.out.println();	
	}
}

과일 목록 :

Apple,Banana,Cherry,Mango,

 

 


2) Stack 과 Queue

 

* stack : LIFO( last in first out)

 stack 클래스 : Vector 클래스의 하위클래스 List객체

 주요메서드 :

 push(Object o ) : 객체를 Stack에추가

 Object pop() : 객체를 stack에서 꺼내기

 Object peek() : Stack에서 다음에 꺼낼 데이터를 조회

 

* queue : FIFO( firsti in First out)

인터페이스 LinkedList가 구현클래스임List객체

 offer(Object o ) : 넣기

 Object poll() : 꺼내기

 Object peek() : 객체조회

 

 

* Deque : (ArrayDeque , LinkedList) 성능과 간편함을 잡음

양쪽으로 데이터를 입력하고 출력할 수 있으므로,

스택과 큐의 역할을 모두 수행할 수 있다.

Deque 를 Stack 과 Queue 로 사용하기 위한 메서드 이름까지 제공한다.

offerFirst() : 앞에 추가한다.

offerLast() : 뒤에 추가한다.

pollFirst() : 앞에서 꺼낸다.

pollLast() : 뒤에서 꺼낸다. == pop()

 

public class StackQueueEx1 {
	public static void main(String[] args) {
		String [] cars = {"Sonata","grandeur","K5","G80"};
		Stack<Object> stack = new Stack<>();
		Queue<Object> queue = new LinkedList<>();
		ArrayDeque<Object> deque = new ArrayDeque<>();
		for (String c : cars) {
			stack.push(c);
			queue.offer(c);
			deque.offer(c);
			
		}
			
		System.out.println("스택에 저장된 객체의 갯수 "+stack.size());
		System.out.println("큐에 저장된 객체의 갯수 "+queue.size());
		System.out.println("데크에 저장된 객체의 갯수 "+deque.size());

		System.out.println("stack:"+stack);
		System.out.println("queue:"+queue);
		System.out.println("deque:"+deque);
		System.out.println("--다음에 꺼낼 데이터 조회--");
		//queue와 deque는 앞에서 꺼냄
		System.out.println(stack.peek());
		System.out.println(queue.peek());
		System.out.println(deque.peekLast());
		System.out.println("--------------");
		//꺼낼 데이터조회만 하는거임 객체의변동X
		
		System.out.println(stack.pop());
		System.out.println(queue.poll());
		System.out.println(deque.pollLast());//마지막에넣은걸 뺴
		
		System.out.println("스택에 저장된 객체의 갯수 : "+stack.size());
		System.out.println("큐에 저장된 객체의 갯수 : "+queue.size());
		System.out.println("데크에 저장된 객체의 갯수 : "+deque.size());
	}
}

스택에 저장된 객체의 갯수 4

큐에 저장된 객체의 갯수 4

데크에 저장된 객체의 갯수 4

stack:[Sonata, grandeur, K5, G80]

queue:[Sonata, grandeur, K5, G80]

deque:[Sonata, grandeur, K5, G80]

--다음에 꺼낼 데이터 조회--

G80

Sonata

G80

--------------

G80

Sonata

G80

스택에 저장된 객체의 갯수 : 3

큐에 저장된 객체의 갯수 : 3

데크에 저장된 객체의 갯수 : 3

 


3) 입출력스트림

 

출력스트림 : 외부로데이터전송

입력스트림 : 외부데이터 읽기

 

 

 

입출력스트림
(IO Stream)
입력 바이트 바이트형입력 InputStream
FileInputStream 
(System.in)은 InputStream타입
       ↑(X)  |   ↓  InputStramReader  
문자 문자형입력

Reader
FileReader
출력 바이트 바이트 출력 OutputStream 
FileOutPutStream
System.out 은 바이트형출력
     ↑(X)   |    ↓ OutputStreamWriter  
문자 문자형 출력 Writer
FileWrite

상속여부는 맨뒤에글자를 확인하자 

OutputStreamWriter 는 문자형출력Writer의 자식


* 입출력 스트림 : 데이터의 이동통로 . 단방향 추상클래스

 

* 입력스트림 : 바이트--> 바이트형 입력스트림 : InputStream

* 1byte 단위로읽기

* 동영상 , 이미지 ,텍스트등을 읽기

* 문자형 --> 문자형 입력스트림 : Reader

* 2byte (1char) 단위로읽기

* 텍스트데이터 읽기

 

* 출력스트림 : 바이트-->바이트형 출력스트림 : OutputSteam

* 1bye 단위로 쓰기

* 동영상 이미지 텍스트 등을 쓰기

 

* 문자형--> 문자형 출력스트림 : Writer

* 2byte(1char) 단위로 쓰기

* 텍스트데이터 쓰기

* InputStreamReader : 바이트형 입력 스트림 -> 문자형 입력스트림 변경 Reader 하위클래스

* OutPutStreamWriter : 바이트형 출력스트림 -> 문자형 출력스트림 변경 Writer 하위클래스

 

* 자바에서 제공되는 표준 입출력스트림

* 표준입력 스트림 : InputStream System.in --> 키보드에서 입력

* 표준출력 스트림 : printStream System.out : 콘솔(화면)으로출력

* 표준오류스트림 : PrintStream System.err ==> 콘솔(화면)으로 출력 , 빨간색 출력

 

 

1 ) 입력스트림(InputStream , Reader)

(IOException 을 던지든 잡든 해야함)

public class InputSteamEx1 {
	public static void main(String[] args) throws IOException{
		InputStream in = System.in;// 키보드입력
		int data=0;
		//in.read() : 1byte 씩 읽기
		while((data=in.read()) != -1) {//ctrl+z (EOF) : 더이상안한다고판단
			System.out.print((char)data+" ");
		}
	}
}
/*
1234
1 2 3 4 
 
 rk
r k 
 
 가나다라
ê ° € ë ‚ ˜ ë ‹ ¤ ë  ¼ 
 
 */
//--------------문자형입력---------------
public class ReaderEx1 {
public static void main(String[] args) throws IOException {
	//InputStreamReader : InputStream객체를 Reader로 변경 스트림
	Reader in = new InputStreamReader(System.in);
	int data=0;
	//in.read : 2byte단위로읽어 (한글같은 char형의 데이터도 문제없이 읽어냄)
	while((data = in.read()) != -1) {
		System.out.print((char)data);
	}
}
}
/*
avc
avc
가나다라
가나다라
*/

 


2 ) 출력스트림(OutputStream , Writer)

public class OutputStreamEx1 {
	public static void main(String[] args) throws IOException {
		//OutputStream : 바이트형 출력
		OutputStream out = System.out;
		out.write('1');out.write('2');out.write('3');
		out.write('a');out.write('b');out.write('c');
		out.write('가');out.write('나');out.write('다');//내가보내는 부분
		//1byte씩만 출력되기때문에 한글이 깨질거다
		
		out.flush();//버퍼의 내용을 강제로 목적지(화면)로보내는 메서드
	}
}

/*
 * OutputStreamEx1 의 데이터를 한글도 꺠지지않도록 프로그램수정
 * OutputStreamWriter 클래스이용
 */
 
public class Exam1_Writer {
	public static void main(String[] args) throws IOException{
		Writer out = new OutputStreamWriter(System.out);
		out.write('1');out.write('2');out.write('3');
		out.write('a');out.write('b');out.write('c');
		out.write('가');out.write('나');out.write('다');//내가보내는 부분 2byte씩 보냄
		out.flush();//한글이깨지지않음 
	}

}

 


3 ) FileInputStream (입력)

 * FileInputStream : 파일내용 읽어 화면에출력 (바이트단위)
 * 
 * 주요메서드
 * int read() : 1바이트읽어서 내용을 리턴
 * int read(byte[] buf) : buf의 크기만큼 읽어서 내용을 buf에 저장.읽은 바이트 수를 리턴해줌
 * int read(byte[] buf,int start, int len) :
 *     len의크기만큼읽어서 buf의 start인덱스 부터  내용을 buf에 저장.읽은 바이트 수를 리턴해줌
 *    
 * int available() : 읽기 가능 바이트 수 return 

package ex3_file;

import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamEx1 {
	public static void main(String[] args) throws IOException {
		FileInputStream fis = new FileInputStream("src\\ex1\\InputStream\\GG.java");
		int data = 0;
		System.out.println("======= read() 메서드를 이용해 읽기");
		while((data=fis.read()) != -1) {
			System.out.print((char)data);
			//읽을때 1byte씩 읽으므로 파일이 좀 많이깨지는 현상!!
		}
		
		System.out.println("=====read(byte[]) 메서드이용해 읽기 ====");
		fis = new FileInputStream("src\\ex1\\InputStream\\GG.java");
		//다른패키지 or 다른경로상에있는 파일을 불러오려면 전체경로를 입력하자
		//ex) D:/java/Java_study/chap12/src/test_ListSet/Gd.java
		
		byte[] buf = new byte[fis.available()];
		System.out.println("fis.available()"+fis.available());
		
		//fis.available() 읽기가능 바이트수
		//100바이트짜리 파일을 읽지 않은 경우  100
		//100바이트짜리 파일중 1바이트를 읽은경우 99
		while((data=fis.read(buf)) != -1) {
			//fis.read(buf) : fis에서 buf만큼 읽어서 읽은내용은 buf저장 , 실제읽은크기를 리턴
					//data : 실제읽은 바이트 수
			System.out.print(new String(buf,0,data));
			System.out.println("@@ data @@ "+data);//1695 
			//new String(buf,0,data) : buf에 0번인덱스부터 data의크기만큼 문자열객체로생성
			//buf로 읽어낸다면 한번에 읽어내기때문에 훨씬성능이좋음
			
		}
		System.out.println("=======read(byte[],int,int) 메서드 이용 ====");
		fis = new FileInputStream("src\\ex1\\InputStream\\GG.java");
		buf = new byte[fis.available()+1];
		buf[0]='Z';
		while((data=fis.read(buf,1,buf.length-1)) != -1) {
			System.out.print(new String(buf,0,data));
		}
	}


}
======= read() 메서드를 이용해 읽기
package ex1.InputStream;

public class GG {

	//package ex1.InputStream;의 클래스임
}
=====read(byte[]) 메서드이용해 읽기 ====
fis.available()97
package ex1.InputStream;

public class GG {

	//package ex1.InputStream;의 클래스임
}
@@ data @@ 97
=======read(byte[],int,int) 메서드 이용 ====
Zpackage ex1.InputStream;

public class GG {

	//package ex1.InputStream;의 클래스임
}

 

 


4 ) FileReader(입력)

텍스트가 아닌 파일은 반드시 FileInputStream , FileOutputStream 이용 


 * FileReader클래스 : 파일에서 데이터2byte단위로 읽기
 * 
 * int read() : 파일에서 데이터 1char단위로읽기
 * int read(char[] buf) : 파일에서 buf크기만큼을 읽어 buf에 내용저장 ,실제읽은 char수 리턴
 * int read(char[] buf , int start , int len)"
 *  파일에서 len크기만큼 읽어서 buf의 strat인덱스부터 저장 , 실제읽은 char수 리턴
 * 
 * 생성자 : FileNotFoundException(IOException의 하위클래스)예외처리필수
 * read() : IOException예외처리필수

void close()
사용중인 자원을 반납하고, 입력 스트림을 닫는다.
package ex3_file;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class FileReaderEx1 {
	public static void main(String[] args) throws IOException {
		char[] buf = new char[8000];
		int data = 0;
		FileReader fr =  new FileReader("src\\ex1\\InputStream\\GG.java");
		System.out.println("-------read()메서드로 읽기-----");
		while((data=fr.read())!= -1) {
			System.out.print((char)data);
		}
		
		System.out.println("-------read(char[] buf)메서드로 읽기-----");
		fr =  new FileReader("src\\ex1\\InputStream\\GG.java");
		while((data=fr.read(buf))!= -1) {
			//buf에서읽은 데이터 수를 data에 넣어
			System.out.print(new String(buf,0,data));
		}
		
		System.out.println("-------read(char[],int,int)메서드로 읽기-----");
		fr =  new FileReader("src\\ex1\\InputStream\\GG.java");
		while((data=fr.read(buf,0,buf.length))!= -1) {
        //			fr을 buf의 0번부터 buf의크기만큼 넣어
        //넣은 크기 : data
			System.out.print(new String(buf,0,data));
            	System.out.println("data ::::"+data);
		}	
	}
}

 

-------read()메서드로 읽기-----

package ex1.InputStream;

 

public class GG {

 

//package ex1.InputStream;의 클래스임

}

-------read(char[] buf)메서드로 읽기-----

package ex1.InputStream;

 

public class GG {

 

//package ex1.InputStream;의 클래스임

}

-------read(char[],int,int)메서드로 읽기-----

package ex1.InputStream;

 

public class GG {

 

//package ex1.InputStream;의 클래스임

}

data ::::87

 

 


5 ) FileOutputStream(출력)

 

 * FileOutputStream 예제 : 파일에 데이터 저장.
 * 주요메서드
 * void write(int data): 1byte를 출력.
 * void write(byte[] buf): buf의 내용을 출력
 * void write(byte[] buf,int start, int len): buf의 start 인덱스 부터 len크기만큼 내용 출력
 * 
 * 생성자 : FileNotFoundException 예외처리 필수. IOException 의 하위 클래스
 *       => 파일의 생성 권한이 없는 경우 예외 발생.
 * write() : IOException 예외처리 필수

void close()
사용중인 자원을 반납하고, 출력 스트림을 닫는다.
package ex3_file;

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

public class FileOutputStreamEx1 {
	public static void main(String[] args) throws IOException {
		System.out.println("out.txt 파일에 내용이 저장됩니다.");
//		FileOutputStream fos = new FileOutputStream("out.txt");
		FileOutputStream fos = new FileOutputStream("out.txt",true);
		
		
		/*
		 * fos : out.txt 파일에 내용을 쓸수 있는 바이트형출력스트림
		 *   out.txt 파일이 없으면 out.txt 파일을 생성하여 내용 출력
		 *   out.txt 파일이 있으면 out.txt 파일에 내용 출력. 기존의 내용 사라짐. 최종결과만 출력
		 * 
		 * new FileOutputStream("out.txt")  : out.txt 파일에 내용 출력.최종내용만남음
		 * new FileOutputStream("out.txt",true) : out.txt 파일에 내용 출력. 
		 *                                    기존내용에 새로운 내용을 추가함 
		 */
		fos.write('1');fos.write('2');fos.write('3');
		fos.write('a');fos.write('b');fos.write('c');
		fos.write('가');fos.write('나');fos.write('다');
		//String.getBytes() : 문자열을 byte[]로 리턴		
		byte[] buf = "\nFileOutputStream 예제입니다.\n".getBytes();
		fos.write(buf); //buf의 내용을 out.txt파일에 출력
		fos.write(buf,5,6); //buf의 내용 중 5번인덱스부터 6개의 바이트를 출력
		fos.flush();
	}
}

1byte씩 출력해주다보니 한글이깨진다


6 ) FileWriter ( 출력 )

텍스트가 아닌 파일은 반드시 FileInputStream , FileOutputStream 이용 

 * FileWriter 클래스를 이용하여 FileOutputStreamEx1.java의 내용을 out2.txt 파일에 저장하기
 * 주요메서드
 * void write(int data): 1char를 출력.
 * void write(char[] buf): buf의 내용을 출력
 * void write(char[] buf,int start, int len): buf의 start 인덱스 부터 len크기만큼 내용 출력
 * void write(String str) : str문자열의 내용을 출력

void close()
사용중인 자원을 반납하고, 출력 스트림을 닫는다.
package ex3_file;


import java.io.FileWriter;
import java.io.IOException;

public class Exam1 {
	public static void main(String[] args) throws IOException {
		System.out.println("out.txt 파일에 내용이 저장됩니다.");
		FileWriter fos = new FileWriter("out2.txt",true);
		//fos: out2.txt 파일에 내용을 저장 할 수 있는 출력스트림
		
		fos.write('1');fos.write('2');fos.write('3');
		fos.write('a');fos.write('b');fos.write('c');
		fos.write('가');fos.write('나');fos.write('다');
		//char단위로 읽기때문에 한글이깨지지않음
		
		//String.toCharArray : 문자열을 char형 배열로 바꿔줌	
		char[] buf = "\nFileOutputStream 예제입니다.\n".toCharArray();
		fos.write(buf); //buf의 내용을 out.txt파일에 출력
		fos.write(buf,5,6); //buf의 내용 중 5번인덱스부터 6개의 바이트를 출력
        fos.write("\nFileWrite는 문자열 출력이가능해요!!\n");
		fos.flush();
        fos.close();
	}
}

123abc가나다

FileOutputStream 예제입니다.

Output

FileWrite는 문자열 출력이가능해요!!

FileWriter의 write는 1char(2byte)씩

출력하니 한글이 깨지지않음

 


OutPutSteam, FileWriter(예제)

package ex3_file;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Scanner;

/*
 * 화면에서 exit 값을 입력할때 까지 내용을 입력받아 data.txt 파일에 저장하기
 * [결과]
 * data.txt 파일에 저장할 내용을 입력하세요(종료:exit)
 * aaaa
 * bbbb
 * exit
 */
public class Exam2 {
	public static void main(String[] args) throws IOException {
		Scanner scan = new Scanner(System.in);
		FileOutputStream fw =  new FileOutputStream("data.txt",true);
		while(true) {
			System.out.print("내용입력 : ");
			String next = scan.nextLine();
			if(next.equals("exit")) {
				break;
			}
			fw.write((next+"\n").getBytes());
		}
		fw.close();
		
		//-----------------------
//		FileWriter fw =  new FileWriter("data.txt");
//		while(true) {
//			System.out.print("내용입력 : ");
//			String next = scan.next();
//			if(next.equals("exit")) {
//				break;
//			}
//			fw.write(next);
		//Write는 문자열자체를 읽기때문에 byte로변환해줄필요없음
//			
//		}
//		fw.close();
	}

}


예제

 

/*
 * InputStreamEx1.java 파일을 읽어서 InputStreamEx1.bak 파일로생성해보자
 * FileInputStream클래스로 구현

FileReader로도 구현해보자

*/

package ex3_file;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class Exam3 {
	public static void main(String[] args) throws IOException{
		FileInputStream fi = new FileInputStream("src\\ex3_file\\FileInputStreamEx1.java");
		FileOutputStream fw = new FileOutputStream("InputStreamEx1.bak");
		int data=0;
		byte [] buf = new byte[fi.available()];
        //fi.available() :fi 의 읽기가능한 byte 수
        
		while((data=fi.read(buf))!=-1) {
        //fi의내용을 buf에 넣는다 
        //넣은 숫자를 data에 리턴
			fw.write(buf);//fw에 byte단위로 출력
		}
		fi.close();
		fw.flush();
		fw.close();
		System.out.println("프로그램종료1");
		
		FileReader fr = new FileReader("src\\ex3_file\\GG.java");
		Writer w = new FileWriter("GG.bak");
		char [] c = new char[2000];
		int data2 =0;
		while((data2=fr.read(c,0,c.length))!=-1) {
			System.out.println("data2 : "+data2);
			w.write(c);
		}
		fr.close();
		w.flush();
		w.close();
		System.out.println("프로그램종료");
		

	}

}

내용이 너무길어 생략!!

 


예제)

 * 화면에서 파일명을 입력받아서 해당 파일의 내용을 화면에 출력하기.
 * 만약 파일이 없는 경우는 '해당 파일 없음' 을 출력하기
 * 한글은 깨지지 않아야 함.
 * FileInputStream 사용하기

 

잘못된 예)

package test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;


public class Test1 {
	public static void main(String[] args) throws IOException {
		Scanner scan = new Scanner(System.in);
		System.out.println("파일명 입력 :   ");
		String file = scan.next();
		
		try {
			int data=0;
		FileInputStream fi = new FileInputStream(file);
		while((data=fi.read())!=-1) {
			System.out.print((char)data);
		}
		}
		catch(FileNotFoundException e) {
			System.out.println("존재하지않는 파일");
		}
	}
}

 FileInputStrema의 fi.read() 는 1byte씩밖에 읽어오지못함

 

방안 1 , 2)

read(byte[])의 방법을 사용해보고

FileReader를 사용

package test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

public class Test1 {
	public static void main(String[] args) throws IOException {
		Scanner scan = new Scanner(System.in);
		System.out.println("파일명 입력 :   ");
		String file = scan.next();
		
		try {
			int data=0;
			int data2=0;
		FileInputStream fi = new FileInputStream(file);
		FileReader fr =  new FileReader(file);
		byte[] buf1 = new byte[fi.available()];//fi의 읽을 수 있는크기의 byte배열
		char[] c = new char[3000];
		
		System.out.println("= = = FileInputStream사용 = = =");
		System.out.println("FileInputStream.read(byte[] buf)");
		while((data=fi.read(buf1))!=-1) {
			System.out.print(new String(buf1,0,data));
		}
		
		System.out.println("===Reader 사용 ===");
		System.out.println("Reader는 char형을 사용함");
		while((data2=fr.read(c))!= -1) {
			System.out.printf(new String(c,0,data2));
		}
		
		
		}
		catch(FileNotFoundException e) {
			System.out.println("존재하지않는 파일");
		}
	}
}

파일명 입력 :

D:\java\Java_study\chap13_\data.txt

= = = FileInputStream사용 = = =

FileInputStream.read(byte[] buf)

하이

===Reader 사용 ===

Reader는 char형을 사용함

하이

파일명 입력 :

g

존재하지않는 파일

FileNotFoundException을 catch해서 예외처리를해줌

 


예제 2)

2. 
 bin/ex1_inputstream/InputStreamEx1.class 파일은 이진 파일이다. 
 이파일을 읽어서 16진수로 출력하기
 
 [결과]
CA FE BA BE 00 00 00 34 00 8E 07 00 02 01 00 17 
63 68 61 70 31 35 2F 50 72 69 6E 74 53 74 72 65 
61 6D 54 65 73 74 32 07 00 04 01 00 10 6A 61 76 
61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 01 00 06 
3C 69 6E 69 74 3E 01 00 03 28 29 56 01 00 04 43 
6F 64 65 0A 00 03 00 09 0C 00 05 00 06 01 00 0F 

package test;

import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;



public class Test2 {
	public static void main(String[] args) throws IOException {
		FileInputStream r = new FileInputStream("bin\\ex1\\InputStream\\InputStreamEx1.class");
		int data =0;
		int i=0;
		
		
		while((data = r.read())!= -1) {
			++i;
			String hexString = Integer.toHexString(data).toUpperCase();
			System.out.printf("%3s",hexString+" ");
		
			if(i%16==0) {
				System.out.println();
			}
			
		}
	}
}

FileInputStream.read() 를 사용한다면

1바이트씩의 데이터를 읽어 data에 저장할것이다.

그럴때마다 int타입의 data를 Integer.toHexString을 이용해

16진수로 계속 출력해줌

(16번째루프마다 \n )


예제3)

1. 반복문을 이용하여

파일명을 입력받아서 해당 파일이 존재하면 해당파일명.bak 파일 복사하기

파일명에 exit 가 입력되면, 프로그램 종료.

해당 파일이 없으면 해당 파일이 없습니다. 메세지 출력

[결과]

파일명을 입력하세요(종료:exit)

aaa.txt

aaa.txt=>aaa.bak 복사완료

파일명을 입력하세요(종료:exit)

bbb.txt

복사할 파일이 없습니다.

파일명을 입력하세요(종료:exit)

exit

 

package test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.util.Scanner;

public class Test3_A {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		while(true) {
			System.out.println("파일명을 입력하세요 (종료 exit)");
			
			try {
				String file = scan.next();
				if(file.equalsIgnoreCase("exit")) {
					System.out.println("종료");
					break;
				}
				int lastIndexOf = file.lastIndexOf(".");
				if(lastIndexOf==-1) {
					System.out.println("확장자가 없어요");
					continue;
				}
				String bak = file.substring(0, lastIndexOf)+".bak";
				
//				String[] split = file.split("\\.");//정규식을 이용해 .을 문자로인식하게해야함
//				String bak = split[0]+".bak";//.txt앞의 파일명을 따옴
				
				Reader r =new FileReader(file);
				
//				FileInputStream r = new FileInputStream(file);
				int data=0;
				char[] a = new char[2000];
//				byte[] a = new byte[r.available()];

				Writer w  =  new FileWriter(bak);
//				FileOutputStream w =  new FileOutputStream(file+".bak");
				while((data=r.read(a))!= -1) {
					w.write(a,0,data);
				}
				r.close();
				w.flush();
				w.close();
				System.out.println(file+"--> "+bak+" 복사완료");

			} catch (IOException e) {
				System.out.println("파일이 없어요");
			}
		}
	}
}

try-catch문으로 파일이존재하지 않았을 때

터지는 예외를 잡아주자

1.파일명입력받기 

2. 파일명에서 "."의 인덱스를 반환 

@없다면

확장자가 잘못됐어요 출력 후

  continue(반복문 현재단계종료후 첨부터시작)

 

 @있다면 r = FileReader or FileiInputStream에 넣어주고

               ".bak"을 추가한 반환값을

w = FileWrite or FileOutputStream 에 집어넣자

 

4.그 후 read(char[] or byte[])메서드를 이용해 값을 전부 배열에넣어줌

while((data=r.read(a))

 

그 배열의 0번인덱스부터 data(실제 읽은 수)까지 write해줌

w.write(a,0,data)

r.close , w.flush , w.close 후 복사문을 출력한 후 끝내자

(스트림을사용했다면 항상 닫자)

파일명을 입력하세요 (종료 exit)

dd

파일명을 입력하세요 (종료 exit)

data.txt

data.txt--> data 복사완료

파일명을 입력하세요 (종료 exit)


예제4)

텍스트가 아닌 파일은 반드시 FileInputStream , FileOutputStream 이용 


* apple.gif 파일을 읽어서, apple2.gif 파일로 복사하기


 * gif같은 파일은 바이너리파일임 (byte로 읽고써야함)
 * FileInput , FileOutput 사용하자

(1byte씩 읽고 쓰는 방식)

package test;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOError;
import java.io.IOException;
import java.io.Writer;

public class Test4 {
	public static void main(String[] args) throws IOException{
		 FileInputStream fr  = new FileInputStream("D:\\java\\apple.gif");
		 FileOutputStream w = new FileOutputStream("apple2.gif");
		 FileOutputStream w2 = new FileOutputStream("apple3.gif");
		int data=0;
		int data2=0;
		byte[] a = new byte[fr.available()];
		
		while((data=fr.read())!= -1) {
			w.write(data);
		}
		fr = new FileInputStream("D:\\java\\apple.gif");
		while((data2=fr.read(a,0,a.length))!= -1) {
			w2.write(a,0,data2);
		}
		
		fr.close();
		w.flush();
		w2.flush();
		w.close();
		w2.close();
	}
}

난 2가지방법을 이용했다

그냥 읽어오는방법 :

read() 의 반환값(data)들을

모두 write(data);

 

 

fr 의 읽기 가능한 크기의 byte배열 a 생성 

(byte [] a = new byte[fr.available();]

 

fr.read(a,0,a.length); 로 

모든값을 읽어 

a배열의 0번인덱스부터a의크기만큼 채워줌

 

그 후

write(a);