~전편에 이어서~

오늘은 Stream을 활용하여 파일을 읽어보자!

 

1. 8bit Stream 활용

영어, 숫자는 1byte이므로 읽혀 지지만, 한글은 2byte 이므로 읽혀 지지 않음

- 방법)

① File에 연결할 수 있는 Stream을 생성

    FileInputStream fis = new FileInputStream(new File(“파일경로”)); //FileNotFoundException 

② 스트림에서 내용 읽기 

     > 스트림에 연결된 파일의 내용을 1byte씩 읽어 들임

     > 읽어들인 데이터가 존재하지 않으면 -1이 나옴.

     > IOException 처리 필요

           int value = 0;

           while ( (value = fis.read()) != -1 ) { // 파일 내용의 크기가 얼마나 될지 모르니 while사용

                    value 사용 }; 

 

# 코딩 # 

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

public class UseStream {

	/**
	 * 8bit Stream 사용하여 text 파일 읽기
	 * @throws IOException
	 */
	public void usestream1() throws IOException {
		FileInputStream fis = new FileInputStream(new File("C:/Users/user/Desktop/tistory/java_test.txt")); // 파일에 스트림 연결
		
		int val = 0; // 스트림에 연결된 파일의 내용을 1byte씩 읽어 들이며 반환형이 int
		
		while ((val = fis.read()) != -1) { // 읽어들인 데이터가 존재하지 않으면 -1이 나옴 -> 데이터가 있을 때까지 읽어들임
			System.out.print((char) val);
		} // end while

		fis.close(); // stream 닫기!

	}// usestream1

- UseStream이라는 Class를 생성한 후 8bit Stream을 사용할 method를 작성했다!

- main method에서 클래스 객체 생성 후 method를 실행하면 아래와 같이 결과가 나온다.

- throws한 IOException은 method수행 시 try~catch로 처리했고,

  경로에 있는 java_test.txt는 'test'라는 영문 글자를 가지고 있당

 

# 출력 결과 #

test


 

2. 16bit Stream 활용

- 16bit Stream은 문자열을 입력받기 위해 고안된 Stream으로

  FileReader(HDD 파일과 연결) BufferedReader(스트림에서 연결된 파일에서 줄 단위로 읽음)를 사용하면 편함

  >> 연결된 파일을 줄 단위로 읽을 수 있음 (readLine())

- 방법)

① File에 연결할 수 있는 Stream을 생성

    FileReader fr = new FileReader(new File(“파일경로”));

② 부족한 기능을 제공하는 스트림 연결 (줄 단위로 읽어들이는 기능)

           BufferedReader br = new BufferedReader( fr );

③ 스트림에서 내용 읽기

       > 스트림에 연결된 파일의 내용을 줄 단위로 읽어 들임

       > 읽어들인 데이터가 존재하지 않으면 null이 나옴.

           String value = “”;

           while ( (value = br.readLine()) != null ) { // 줄 단위로 읽어서 저장하고 읽어들인 줄이 없으면 null이 반환됨

                    value 사용 } ;

 

# 코딩 # 

	/**
	 * 16bit Stream 사용하여 text 파일 읽기
	 * 한글은 16bit Stream으로 해야 깨지지 않음
	 * @throws IOException
	 */
	public void usestream2() throws IOException {
		FileReader fr = new FileReader(new File("C:/Users/user/Desktop/tistory/java_test1.txt"));
		BufferedReader br = new BufferedReader(fr); // BufferedReadr로 line을 읽어들이자. 속도향상! 

		String val = ""; // readLine method의 반환형은 String

		while ((val = br.readLine()) != null) { // 읽어들일 데이터가 없다면 null이 나옴
			System.out.print(val);
		} // end while
		
		br.close(); // 스트림 닫자!
	}// usestream2

- 이번 경로에 있는 java_test1의 내용은 한글이며 출력이 잘 읽히는 것을 확인할 수 있다!

 

# 출력 결과 #

안녕하십니까!반갑습니다.

 

 

 

 

 1. IO(Input/Output) Stream 

- JVM에서 JVM외부에 존재하는 데이터를 읽어들이거나(Input),

  JVM내부의 데이터를 JVM외부로 내보낼 때(Output) 사용하는 기술 (txt, dat만 가능)

- 독자 포맷(hwp,xls,ppt)이 있는 파일은 읽어 들일 수 있지만 내용을 확인할 수 없음

- 독자 포맷의 파일을 생성할 수 없음

- java.io.package에서 관련 클래스를 제공

- 8bit stream(byte 기반)과 16bit stram(문자열 기반)이 제공

- 단방향 스트림 (읽기 스트림은 읽기만 가능하고, 쓰기 스트림은 쓰기만 가능)

- 스트림은 연결해서 사용할 수 있음 (FileReader랑 BufferedReader 같이 사용하는 등)

- Stream은 사용 후 꼭 close()! // 스트림을 끊어서 메모리 누수(memory leak)을 막자

 

 1) 8bit Stream 

- byte 기반 스트림

- 모든 data를 읽고 쓸 수 있는 스트림

- 한 byte씩만 읽어들일 수 있음

- 파일 복사에 많이 씀

- 16bit Stream보다 속도가 빠름 / 단, 한 번에 보내고 받는 양은 적음

- 부모클래스는 java.io.InputStream, java.io.OutputStream

읽기 스트림 - InputStream
FileInputStream 파일에서 읽어 들이는 일
DatainputStream 자바의 기본 데이터형으로 읽어 들일 때
ObjectInputStream 객체를 읽어 들일 때

 

쓰기 스트림 - OutputStream
FileOutputStream 파일로 내보내는 일
DataOutputStream 자바의 기본 데이터형을 내보내는 일
ObjectOutputStream 객체를 내보내는 일

 

 2) 16bit Stream 

- 문자열 기반 스트림

- 문자열만 읽고 쓸 수 있는 스트림

- 문자열을 입력받기 위해서 고안한 Stream

- 8bit 보다 속도가 느림 / 단, 한 번에 보내고 받는 양은 큼

- 부모클래스는  java.io.Reader, java.io.Writer

읽기 스트림 - Reader
FileReader 파일에서 읽어 들이는 일
BufferedReader 16bit 스트림의 속도 향상을 위해 만들어진 Stream
InputStreamReader 8bit 스트림과 16bit 스트림을 연결할 때 사용

 

쓰기 스트림 - Writer
FileWriter 파일로 내보내는 일
BufferedWriter 쓰기속도 향상
OutputStreamWriter 8bit 스크림과 16bit 스트림을 연결할 때 사용

 

 

 2. java.io.File 

- HDD(하드디스크)에 존재하는 파일의 정보를 얻을 때, directory를 생성할 때, 파일 삭제할 때 사용

 

- 사용법)

 

<-- 파일 정보 -->

① 객체 생성 :

    File file = new File (“경로”); // C:/dev/env.bat

② 하기 method 활용

    - 절대경로 얻기 :

      > 파일에 접근할 수 있는 두가지 경로 : C:/dev/env.bat or c:/dev/env.bat – 드라이브 문자 대소문자 상관없음

      > String str = file.getAbsolutePath();

    - 규범경로 얻기 :

      > 파일에 접근할 수 있는 하나의 경로 : C:/dev/env.bat – 드라이브 문자 항상 대문자

      > try {String path = file.getCannonicalPath(); // IOException 존재하므로 try~catch

         } catch (IOException ie) {  }

    - 경로 얻기 : String path = file.getPath();

    - 디렉토리명 얻기 : String directory = file.getParent() ; // C:/dev/

    - 파일명 얻기 : String fileName = file.getName(); / env.bat

    - 파일인지? : boolean flag = file.isFile();

    - 폴더인지? : boolean flag = file.isDirectory();

    - 읽기 가능? : boolean flag = file.canRead();

    - 쓰기 가능? : boolean flag = file.canWrite();

    - 실행 가능? : boolean flag = file.canExecute();

    - 숨김파일 : boolean flag = file. isHidden();

    - 마지막 수정일자 : long modified = file.lastmodified();

    - 파일 있는지 : file.exists();

 

<-- Directory 생성 -->

① 객체 생성 : 생성할 폴더명을 가진 File 생성

    FIle file = new File (“e:/dev/temp1”)

② 폴더 생성 : 폴더가 존재하면 false 반환, 존재하지 않으면 폴더를 생성하고 true 반환

    file.mkdir(); // 상위폴더가 존재하지 않으면 폴더를 생성할 수 없음 // dev 폴더 없으면 생성 불가 

    file.mkdirs(); // 상위폴더가 존재하지 않으면 상위 폴더부터 폴더를 생성함 // dev부터 만들고 temp1 생성

 

<-- 파일 삭제 -->

① 삭제할 파일명으로 File을 생성

     File file = new File(“경로”);

② 파일 삭제

           file.delete();

 

<-- 파일명 변경 -->

① 원본 파일명으로 File을 생성

           File file = new File (“경로”);

② 변경할 파일명으로 File 생성

           File refile = new File (“변경할 경로”);

③ 변경할 이름을 설정 : file.renameTo(refile);

+ Recent posts