열심히 끝까지

디바이스 융합 자바(Java) day15 - forEach문,이터레이터,파일입출력 본문

디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(수업내용)

디바이스 융합 자바(Java) day15 - forEach문,이터레이터,파일입출력

노유림 2022. 6. 27. 16:49

[6/27 시험과 관련된 수업]

[forEach문]
    원래 index로 접근해 출력하는 방법 밖에 없었다.
    근데 forEach문은 단번에 출력하는 것을 가능하게 해준다
    data의 값을 잠시 받아오는 일시적 공간을 만들어 사용
    이 scope가 끝나면 메모리 해제
    콜론 하나로 영역을 두개로 나눈다
    데이터의 집합이면 어떤것이든 사용 가능
     v++과 같은 것이 숫자에 영향을 끼치지 않는다!

[이터레이터]
    Iterator itr = al.iterator(); 
    -> 복사체 
    모든 데이터 집합이면 사용 가능
    iterator라는 메서드는 iterator가 나오는 값, 이름의 클래스(자료형)존재
  ex)
    while(itr.hasNext()) {
         System.out.println(itr.next());
     }

 

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

[오늘 수업]

[파일 입출력]
.txt 사진 동영상 .pdf 문서...

io 패키지에 들어가있고
인자가 없는 생성자가 없었다
 >> 입력된 장소를 넣어주었다!
file 창조하려면?
    file.createNewFile();
 >> 왜 빨간줄???
    >> try-catch로 감싸라!!!
        >> 왜?
             : 자기한테는 문제가 없는데 
               흔한 문제로 용량이 없을까봐..
    >> 이름이 없는 파일을 입력하면 만들어준다!!
    >> 해당 경로에 위치하는 파일이 존재하는지 체크해보는 습관!!
          길러놓는 것이 좋다! 
           => 없으면 새로 만들기 때문에!!

----------위 글의 예제

package class03;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Test02 {
	public static void main(String[] args) {
		File file = new File("D:\\0607RYO\\resource\\test.txt");
		// 해당 경로에 위치하는 파일이 존재하는지 체크 
		// try-catch로 감싸주어야 한다
		try {
			file.createNewFile();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			System.out.println("로그 : 파일객체생성완료");
		}
		try {
			// 파일 객체를 가지고 와도 괜찮고 경로명을 가져와도 된다.
			// 하나 가져올 것
			// 똑같이 try-catch 가져올 것
			FileInputStream fis = new FileInputStream(file);
			// FileInputStream fis = new FileInputStream("D:\\0607RYO\\resource\\test.txt");
			int data; // fis.read 읽어오는 값 저장
			while((data=fis.read()) != -1) { // fis.read가 뭔가를 읽어드릴 때, int로 받는다.
				// -1이 아니면 불러올 것!
				System.out.print((char)data); // 한글로 읽어올려면 (char)로 형변환
			}
		} catch (Exception e) { // 예외가 더 발생할 수 있으므로 최상위 예외 Exception 출력
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}


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

package class03;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Test022 {
	public static void main(String[] args) {
		File file = new File("D:\\0607RYO\\resource\\test.txt");
		// 해당 파일이 경로에 존재하지 않으면 새로 만들어줌!
		// -> FNE을 줄이는데에 도움이 된다!
		try {
			file.createNewFile();
		}catch(IOException e) {
			e.printStackTrace();
		}
		finally {
			System.out.println("로그 : 파일 객체 생성 완료");
		}
		String msg=""; // scope 올려주기
		try {
			FileInputStream fis = new FileInputStream(file);
			// 해당 파일이 경로에 존재하지 않으면 예외가 발생한다!
			int data;
			while((data=fis.read()) != -1) { // 아스키코드로 읽어온다!
				System.out.println((char)data);
				msg+=(char)data;
			}
		} catch (Exception e) { // 파일이 없으면 에러가 뜬다.
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println();
		System.out.println(msg);
		int res = Integer.parseInt(msg);
		// 문자열 -> 정수로 바꾸어 주는 것
		//    >> Integer.parseInt
		res++;
		System.out.println(res);
	}
}



FileInputStream fis = new FileInputStream(file);
   >>할 때, 데이터를 읽어오는 과정에서 정수형이 아닌
       아스키코드형태로 읽어온다.
          >> 그 형태를 바꾸어서 콘솔에 출력하기 위해서는
               char형변환으로 String 형태의 변수에 저장하고
               그 변수를 가져와서 출력한다.
          >> 그 변수가 문자열 일 때, 문자열이 아닌 정수로
               변수를 가져오고 싶으면 
               Integer.parseInt(변수)로 가져오면 된다
---------------------

package class03;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class Test03 {
	public static void main(String[] args) {
		// 가독성 및 유지보수
		final String path1 = "D:\\0607RYO\\resource\\";
		final String path2 = ".txt";
		try {
			FileOutputStream fos = new FileOutputStream(path1+"test2"+path2, true);
			// 해당 경로에 파일이 없다면, 새로 생성함!
			// 해당 경로에 파일이 있다면, 덮어쓰기가 됨!
			//   >> true 생성자 오버로딩
			//   >> 오버로딩된 생성자를 활용하면 이어쓰기가 가능하다!
			fos.write(65);
			fos.flush(); // 버퍼 비우기
			fos.close(); // 버퍼 닫기
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally {
			System.out.println("fos객체를 통해서 파일 객체 작성 완료");
		}
	}
}



   : 데이터를 읽어올 때, FileInputStream으로 읽어온다.
     읽어오는 방법은 "객체.read()"로 읽어오면 된다.
     >>  이때, 객체.read()는 int 값으로 읽어오기 때문에
            저장값 따로 지정하여 -1이 되면 읽어오는 것을 멈추도록 하고
            한글로 받아오고 싶으면 char로 형변환을 하여 가져온다.
     >> 얼마를 읽어들일지를 몰라서 while문으로 가져온다
          객체.read()값이 data라는 int자료형 객체에 저장되게 한다.
           : 이 때, data의 읽어오는 값이 -1이면 그만 불러오는 것으로 지정
     >> 해당 파일이 경로에 존재하지 않으면 예외가 발생한다!!!

  > FileOutputSream 파일 안에 내용을 작성하고 만들기
     - 반복되는 주소를 상수화!!!
     >> 해당 경로에 파일이 없다면, 새로 생성함!
     >> 해당 경로에 파일이 있다면, 덮어쓰기가 됨!
            >> 실수를 안하도록 주의!!!
     >> true 생성자 오버로딩
     >> 오버로딩된 생성자를 활용하면 이어쓰기가 가능하다!!

   > 파일에 출력할 때도 버퍼가 존재
      >> 그렇기에 버퍼를 비워주는 역할인
           출력입출문객체.flush(); 를 사용한다
      >> 그리고 꼭!!! .close();로 닫아준다.
----------------------

package class03;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class Test05 {
	public static void main(String[] args) {
		final String path = "D:\\0607RYO\\resource\\"; 
		// copy할 파일을 읽어오기
		try {
			FileInputStream fis = new FileInputStream(path+"tm.jpg");
			FileOutputStream fos = new FileOutputStream(path+"tm - 복사본.jpg");		
			byte[] buff = new byte[1000];
			int len;
			while((len = fis.read(buff)) != -1){
				fos.write(buff,0,len);
			}
			fos.flush();
			fos.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally {
			System.out.println("이미지 파일 복사-붙여넣기 완료");
		}
	}
}


  
>> copy할 사진 및 파일을 읽어오는 작업
     > 카피할 사진(당연히 존재하는 장소도 필요!!)과 
        복붙할 장소와 이름이 필요
     > 이때 버퍼라는 바이트가 필요한데
        버퍼가 크면 적게 돌고, 작으면 많이 돈다.
         >> 한번에 읽고 쓸 사이즈를 지정하는 것!
         >> 공간을 크게 잡게 되면 금방 끝나게 되며
              작으면 작은만큼 그 파일과 사진을 불러오는 데에 필요한 시간이 오래 걸린다.
                 => 메모장은 보통 1000~3000byte를 준다.
   위의 예시 활용)
           buff(=1000)사이즈 만큼 fis에서 데이터를 읽어서 fos에 쓴다.
           
              
>> 심화과정 FileWriter/FileReader

   > FileWriter와 BufferWriter가 한 세트고
      FileReader와 BufferReader가 한 세트다

   > 파일을 쓸 때, 
      FileWriter의 객체와 BufferWriter의 객체를 생성해준다.
       >> 여기에 true를 주면 파일 이어서 쓰기가 가능하다!!
            디폴트값은 false인데, false로 하면 파일을 새로 쓴다.
       ex ) FileWriter fw = new FileWriter("test", true);
             BufferWriter bf = new BufferWriter(fw);
       > 당연히 주소값은 지정해주어야 한다...
   > 파일을 가져올 때, 
      FileReader의 객체와 BufferWriter의 객체를 생성해준다.
      >> 여기서는 true혹은 false가 필요없이 읽어온다.
      ex ) FileReader fr = new FileReader("test");
            BufferReader br = new BufferReader(fr);