열심히 끝까지
디바이스 융합 자바(Java) day15 - forEach문,이터레이터,파일입출력 본문
디바이스 융합 자바(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);
'디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(수업내용)' 카테고리의 다른 글
디바이스 융합 자바(Java) day16 - MVC기본,자판기 프로그램 with MVC (0) | 2022.06.28 |
---|---|
디바이스 융합 자바(Java) day15-1 - MVC 기초개념 (0) | 2022.06.27 |
디바이스 융합 자바(Java) day14 - 예외,예외처리,버퍼,스레드 (0) | 2022.06.24 |
디바이스 융합 자바(Java) day13 - 컬렉션 프레임워크(List,Set,Map) (0) | 2022.06.23 |
디바이스 융합 자바(Java) day12 - 동적바인딩(본인우선찾기),추상클래스,추상메서드 (0) | 2022.06.22 |