[SIST] Java_days28

2022. 3. 29. 19:14·TIL/Java
728x90
반응형

1. 입출력(I/O) - File 클래스를 활용한 예제

예제1) 실행 파일(.exe) 복사하기


예제2) 지정된 파일을 지정된 크기로 잘라서 여러 개의 파일로 저장하기


2. 바이트기반 스트림

- 바이트 배열을 다루는 메모리 스트림

 

- 메모리에 스트림을 만드면 읽기, 쓰기 성능이 빨라진다

 

1) InputStream과 OutputStream

- 모든 바이트기반의 스트림의 조상

[InputStream 메서드]

 

[OutputStream 메서드]


2) ByteArrayInputStream과 ByteArrayOutputStream

- 메모리, 즉 바이트배열에 데이터를 입출력 하는데 사용되는 스트림

 

- 주로 다른 곳에 입출력하기 전에 데이터를 임시로 바이트배열에 담아서 변환 등의 작업에 사용

 

예제)


3) FileInputStream과 FileOutputStream

- 파일을 읽고 쓰는 바이트 스트림

 

- 실행파일, 이미지, 동영상 파일, 텍스트 파일 등 (+ 네트워크 = 전송, ex) 카톡)

 

[FileInputStream과 FileOutputStream 생성자]


3. 바이트기반 보조스트림

1) FilterInputStream과 FilterOutputStream

- 모든 보조스트림의 조상


2) BufferedInputStream과 BufferedOutputStream

- 바이트 스트림의 입출력 효율을 높이기 위해서 사용하는 보조스트림

 

[BufferedInputStream 생성자]

출처 : 자바의 정석

[BufferedOutputStream 생성자와 메서드]

출처 : 자바의 정석


3) DataInputStream과 DataOutputStream

- 데이터를 읽고 쓰는데 byte 단위가 아닌 [기본형]으로 읽고 쓸 수 있는 장점을 가진 바이트 보조 스트림

 

[DataInputStream 생성자와 메서드]

출처 : 자바의 정석

[DataOutputStream 생성자와 메서드]

출처 : 자바의 정석


[FileOutputStream과 DateOutputStream 활용 예제]

FileOutputStream과 DateOutputStream 사용하기 전)

public class Ex04 {

	public static void main(String[] args) {
		String name = "꼬여사";
		int kor = 98, eng = 78, mat = 88;
		int tot = kor + eng + mat;
		double avg = (double)tot / 3;
		boolean gender = false;
		
		// 텍스트 파일 읽기/쓰기 -> 바이트 스트림말고 문자 스트림 사용하면 됌
		// FileReader(읽기), [FileWriter(쓰기(출력))]
		// 위의 한 학생의 성적 정보를 파일로 저장
		String fileName =".\\src\\days28\\student.txt";
		try(FileWriter fw = new FileWriter(fileName, true); // boolean append 매개변수에 값을 주면 파일에 새로운 데이터를 추가 OR 새로운 파일 생성
			BufferedWriter bw = new BufferedWriter(fw); ) { // 보조스트림 8196 byte 버퍼(기본값)
			
			/*
			fw.write(name + "\r\n"); // 스트림에 쓰는 작업
			fw.write(kor + "\r\n");
			fw.write(eng + "\r\n");
			fw.write(mat + "\r\n");
			fw.write(avg + "" + "\r\n");
			fw.write(gender + "" + "\r\n");
			*/
			
			String data = String.format("%s, %d, %d, %d, %d, %.2f, %b\n", name, kor, eng, mat, tot, avg, gender);
			// fw.write(data);
			// fw.flush(); // 스트림에 있는 데이터를 저장
			bw.write(data);
			bw.flush();
		} catch (Exception e) {
			e.printStackTrace();
		} // try
		
		System.out.println("END");

	} // main

} // class

FileOutputStream과 DateOutputStream  사용)


[FileInputStream과 DateInputStream 활용 예제]

FileInputStream과 DataInputStream 사용 전)


FileInputStream과 DataInputStream 사용)


4) SequenceInputStream

- Sequence(순차적) + InputStream(읽기용도의 바이트 스트림) : 순차적으로 바이트 스트림을 읽기 위한 것

 

- 여러 개의 입력 스트림을 연속적으로 연결해서 하나의 스트림으로 처리하고자 할 때 사용한다.

  ( 분리된 파일을 하나로 합칠 때 사용 - SequenceInputStream sis = new SequenceInputStream(en); )

 

[SequenceInputStream 생성자와 메서드]

출처 : 자바의 정석


[개념 설명 예제]

public class Ex05 {

	public static void main(String[] args) {
		// 2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf
		// 2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.1
		// 2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.2
		// 2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.3
		// 2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.4
		// 2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.5 .. 11번까지
		
		try {
			FileInputStream fis1 = new FileInputStream("2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.1");
			/*
			int b;
			while ((b = fis1.read()) != -1) {
				// 읽어와서 출력 또는 파일로 저장 작업 코딩...
			}
			*/
			FileInputStream fis2 = new FileInputStream("2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.2");
			/*
			while ((b = fis2.read()) != -1) {
				// 읽어와서 출력 또는 파일로 저장 작업 코딩...
			}
			*/
			FileInputStream fis3 = new FileInputStream("2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.3");
			/*
			while ((b = fis3.read()) != -1) {
				// 읽어와서 출력 또는 파일로 저장 작업 코딩...
			}
			*/
			FileInputStream fis4 = new FileInputStream("2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.4");
			FileInputStream fis5 = new FileInputStream("2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.5");
			FileInputStream fis6 = new FileInputStream("2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.6");
			FileInputStream fis7 = new FileInputStream("2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.7");
			FileInputStream fis8 = new FileInputStream("2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.8");
			FileInputStream fis9 = new FileInputStream("2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.9");
			FileInputStream fis10 = new FileInputStream("2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.10");
			FileInputStream fis11 = new FileInputStream("2022년 정기 기사 2회 수험표 프린트 _ Q-net.pdf_.11");
			
			// 순서가 있는 List 인터페이스를 구현한 컬랙션 클래스 사용 + 동기화처리유무 판단
			// ArrayList
			Vector<FileInputStream> vt = new Vector<FileInputStream>();
			vt.addElement(fis1);
			vt.addElement(fis2);
			vt.addElement(fis3);
			vt.addElement(fis4);
			vt.addElement(fis5);
			vt.addElement(fis6);
			vt.addElement(fis7);
			vt.addElement(fis8);
			vt.addElement(fis9);
			vt.addElement(fis10);
			vt.addElement(fis11);
			
			Enumeration<FileInputStream> en = vt.elements();
			
			// [분리된 파일을 합치는 코딩을 할 때 SequenceInputStream 사용하면 편리!]
			// SequenceInputStream sis = new SequenceInputStream(Enumeration <? extends InputStream> e);
			SequenceInputStream sis = new SequenceInputStream(en);
			int b;
			while((b = sis.read()) != -1) {
				// 읽어와서 출력 또는 파일로 저장하는 코딩...
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	} // main

} // class​

[SequenceInputStream 활용 예제]

- 연속적인 바이트 배열을 SequenceInputStream 사용하여 처리

 

- SequenceInputStream 사용하려고하니 InputStream 타입의 Enumeration(열거형)을 달라고 함

 

- 그래서 바이트 배열을 ByteArrayInputStream으로 바꾸고 Vector(또는 ArrayList) 컬렉션 클래스를 생성해 add() 메서드로 추가

 

- elements() 메서드로 요소를 가져와 Enumeration 생성하여 SequenceInputStream의 매개변수로 할당


5) PrintStream 바이트 스트림

- print(), println(), printf() 메서드가 오버로딩 되어져 있다.

 

- JDK 1.1에서부터 PrintStream보다 향상된 스트림 : PrintWriter

  향상된 기능은? 다양한 언어로 출력이 가능하다.

 

[PrintStream 생성자와 메서드]

출처 : 자바의 정석

[날짜와 시간에 사용되는 옵션]

출처 : 자바의 정석


[PrintStream 활용 예제]


4. 문자기반 스트림

1) Reader와 Writer

- 문자 기반 스트림의 부모(최상위)

- char 배열을 다루는 스트림

[Reader 메서드]

출처 : 자바의 정석

[Writer 메서드]

출처 : 자바의 정석


2) FileReader와 FileWriter

- 파일로부터 텍스트 데이터를 읽고, 쓰는데 사용

 

- 사용방법은 FileInputStream/FileOutputStream과 다르지 않음


3) PipedReader와 PipedWriter

- 프로세스 간의 데이터 전송 -> 쓰레드 배워야 테스트 가능해서 이정도만 알고 넘어가기


4) StringReader와 StringWriter 메모리 스트림

- 문자열을 다루는 메모리 스트림

 

- StringBuffer getBuffer() : StirngWriter에 출력한 데이터가 저장된 StringBuffer를 반환

- String toString() : StirngWriter에 출력된(StringBuffer 저장된) 문자열을 반환


[StringReader 활용 예제]

String source =	"package days28;\r\n"
				+ "\r\n"
				+ "import java.io.File;\r\n"
				+ "import java.io.FileInputStream;\r\n"
				+ "import java.io.FileOutputStream;\r\n"
				+ "import java.io.PrintStream;\r\n"
				+ "\r\n"
				+ "/**\r\n"
				+ " * @author Yelin\r\n"
				+ " * @date 2022. 3. 29. - 오전 9:03:19\r\n"
				+ " * @subject 실행파일 복사하기(교재에는 없음)\r\n"
				+ " * @content 실행파일은 문자 스트림으로 읽으면 안됨X 2바이트씩 읽으면 데이터를 못가져옴\r\n"
				+ " * 				int read(), 읽을게 없으면 -1 반환\r\n"
				+ " * \r\n"
				+ " * \r\n"
				+ " */\r\n"
				+ "public class Ex01 {\r\n"
				+ "	\r\n"
				+ "	public static void main(String[] args) {\r\n"
				+ "		String pathname = \"C:\\\\Program Files (x86)\\\\CBT\\\\CBT.exe\";\r\n"
				+ "		String copyPathname = \"C:\\\\Users\\\\Yelin Park\\\\Documents\\\\CBT.exe\";\r\n"
				+ "		\r\n"
				+ "		fileCopy_byteStream(pathname, copyPathname);\r\n"
				+ "\r\n"
				+ "	} // main\r\n"
				+ "\r\n"
				+ "	private static void fileCopy_byteStream(String pathname, String copyPathname) {\r\n"
				+ "		long start = System.nanoTime();\r\n"
				+ "		\r\n"
				+ "		File f1 = new File(pathname);\r\n"
				+ "		PrintStream ps = System.out; // 화면에 출력하는 스트림 객체, 바이트 스트림\r\n"
				+ "		try(FileInputStream fis = new FileInputStream(f1);\r\n"
				+ "			FileOutputStream fos = new FileOutputStream(copyPathname); ) {\r\n"
				+ "			int b;\r\n"
				+ "			while( (b = fis.read()) != -1) {\r\n"
				+ "				// ps.write(b);\r\n"
				+ "				// ps.print(b); // 한바이트씩 출력\r\n"
				+ "				fos.write(b); // 파일로 복사\r\n"
				+ "			}\r\n"
				+ "		} catch (Exception e) {\r\n"
				+ "			e.printStackTrace();\r\n"
				+ "		}\r\n"
				+ "		\r\n"
				+ "		long end = System.nanoTime();\r\n"
				+ "		System.out.println(\"> 처리 시간 : \" + (end-start) + \"ns - 파일(\" + f1.length() + \"bytes) 복사 완료!!\");\r\n"
				+ "		\r\n"
				+ "	} // fileCopy_byteStream\r\n"
				+ "\r\n"
				+ "} // class";

[문제1] source 문자열의 11번째 라인의 문자열 출력


[문제2] source 문자열의 11번째 라인의 5번째 문자 출력


5. 문자기반 보조스트림

1) BufferedReader와 BufferedWriter

- 버퍼를 이용해서 입출력의 효율을 높일 수 있도록 해주는 역할

 

- 데이터를 라인단위( readLine() )로 읽을 수 있고, 줄바꿈( newLine() ) 해주는 메서드를 가지고 있음


2) InputStreamReader와 OutputStreamWriter

- 바이트스트림 + 문자스트림을 연결해주는 역할의 문자스트림 -> 즉, 바이트스트림을 문자스트림으로 변환해준다.

 

- 바이트기반 스트림의 데이터를 지정된 인코딩의 문자데이터로 변환하는 작업 수행

 

- 키보드로부터 입력 시 System 클래스 필요 -> in : 입력 / out : 출력 스트림

  입력 : System.in / 출력 : System.out
 

[InputStreamReader 생성자와 메서드]

출처 : 자바의 정석

[OutputStreamReader 생성자와 메서드]

출처 : 자바의 정석

- 인코딩 관련 내용


[InputStreamReader 활용 예제] 한글 한 글자를 받아서 출력하기 / 문자열 출력하기

InputStreamReader 사용 전) 한글이 아닌 한 문자 출력가능


다른 방식 풀이) 한글 한 문자를 받아서 출력


InputStreamReader 사용1) 한글 한 문자를 받아서 출력

- 'a' 엔터 -> System.in으로 바이트스트림 반환 -> InputStreamReader으로 문자열 스트림 반환 -> ['a'][][][] BufferedReader 보조스트림이 라인 단위로 가져옴


InputStreamReader 사용2) 문자열 읽는 방법 포함


6. 표준 입출력

1) System.in / System.out / System.err

- 표준 입력장치(키보드) -> 표준 입력 == System.in == InputStream

- 표준 출력장치(모니터, 프린터기) -> 표준 출력 == System.out == PrintStream

 

(1) System.in - 콘솔로부터 데이터를 입력받는데 사용

(2) System.out - 콘솔로부터 데이터를 출력하는데 사용

(3) System.err - 콘솔로부터 데이터를 출력하는데 사용


코드 예시)


2) RandomAccessFile

- 파일을 다루는 스트림

 

- 파일의 어느 위치에나 읽기/쓰기 작업 가능한 스트림

 

- 읽기 + 쓰기 가능

 

[RandomAccessFile 생성자와 메서드]

출처 : 자바의 정석


 

[RandomAccessFile 활용 예제1]


[RandomAccessFile 활용 예제2]

 

<위치 확인>

728x90
반응형

'TIL > Java' 카테고리의 다른 글

[Java] StringUtils 클래스  (0) 2022.10.04
[SIST] Java_days29  (0) 2022.03.31
[SIST] Java_days27  (0) 2022.03.28
[SIST] Java_days26  (0) 2022.03.25
[SIST] Java_days25  (0) 2022.03.24
'TIL/Java' 카테고리의 다른 글
  • [Java] StringUtils 클래스
  • [SIST] Java_days29
  • [SIST] Java_days27
  • [SIST] Java_days26
야리니
야리니
오늘보다 내일 더 성장하는 개발자가 되기 위한 야리니 블로그입니다 :)
    반응형
    250x250
  • 야리니
    야리니의 step by step
    야리니
  • 링크

    • GitHub
    • Linkedin
  • 전체
    오늘
    어제
    • 분류 전체보기 (477)
      • TIL (379)
        • Java (97)
        • Kotlin (28)
        • JPA (16)
        • Spring (37)
        • Oracle (22)
        • JDBC (7)
        • Web(HTML, CSS, JS, jQuery) (90)
        • View Template (31)
        • AWS (7)
        • HTTP (7)
        • CS (5)
        • Linux, Unix (2)
        • Python (20)
      • Trouble Shooting(Error) (37)
      • Algorithm (15)
      • Git,GitHub (8)
      • Diary (23)
      • 독서 (9)
      • Etc (6)
        • Mac (1)
        • 학원준비과정 (2)
  • 블로그 메뉴

    • 방명록
    • 태그
  • 공지사항

    • 안녕하세요 :)
  • 인기 글

  • 태그

    oracle
    CSS
    java기초
    코틀린
    HTML
    java
    Kotlin
    국비지원학원
    쌍용교육센터
    백엔드 개발자
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
야리니
[SIST] Java_days28
상단으로

티스토리툴바