본문 바로가기
자바

자바 BufferedInputStream [북붙따라하기]

by 세상 모든 것 들은 그 자신을 위해 존재한다. 2020. 12. 31.

BufferedInputStream  : byte단위로 파일을 읽어 올때 사용하는 버퍼 스트림 입니다.

사용 예제 ) 코드를 복붙 하여 실행해 보시기 바랍니다.

설명은  주석과 코드 아랫부분에  있습니다.

 

import java.io.BufferedInputStream;
import java.io.FileInputStream;

public class Sample2 {

	public static void main(String[] args) {

		///////////////// BufferedInputStream   이용한 파일의 내용을  읽어오는 예제 입니다.
		try {
			// file open..
			FileInputStream fis = new FileInputStream("c:/temp/java/test/test.txt");
			
//////////////////////////직접 코드를 읽어 파일에 접속 하는 것보다 8192바이트의 버퍼를 이용해서 속도를 증가 시킨다.
			BufferedInputStream bis = new BufferedInputStream(fis);
			
			// 파일의 내용을 byte단위로 읽어옵니다.그래서
			// 읽어서 저장할 버퍼 byte 배열 설정
			byte[] byteBuff = new byte[9999];

			// 파일을 읽고 읽은 크기를 nRLen 에 저장한다.
			int nRLen = bis.read(byteBuff);

			// 출력을 위해서 byte배열을 문자열로 변환
			String strBuff = new String(byteBuff, 0, nRLen);

			// 읽은 내용을 출력 합니다.
			System.out.printf("읽은 바이트수[%d] : \n읽은 내용 %s \n", nRLen, strBuff);

			// 사용이 끝나면 파일 스트림을 닫습니다.
			bis.close();
			fis.close();

		} catch (Exception e) {
			System.out.println("읽을 파일이 없습니다. \n 읽을 파일을 만들어 준다음 실행 하세요.\n");
			System.out.println("c:/temp/java/test/test.txt\n");
		}
		
	}

}

//결과는 :

//읽은 바이트수[160] : 
//읽은 내용 테스트 파일의 내용1
//테스트 파일의 내용2
//테스트 파일의 내용3
//테스트 파일의 내용4
//테스트 파일의 내용5
//테스트 파일의 내용6
//테스트 파일의 내용7
//테스트 파일의 내용8

 

BufferedInputStream은 파일을 읽어올때 8192byte의 버퍼를 두고 작업을 하기 때문데

속도가 굉장히 빨라 집니다.파일을 주로 다루는 프로그램을 만들때는 핈수 입니다.

 

기존 코드 에서 한줄추가만 하면 속도가 향상이 됩니다.8192byte를 넘지 않는 파일이라면 무조건 사용을 추천 드립니다.

 

기존코딩

FileInputStream fis = new FileInputStream("c:/temp/java/test/test.txt");
byte[] byteBuff = new byte[9999];
int nRLen = fis.read(byteBuff);
fis.close();            

 

BufferedInputStream  적용후 코딩

FileInputStream fis = new FileInputStream("c:/temp/java/test/test.txt");
BufferedInputStream bis = new BufferedInputStream(fis);	//추가
byte[] byteBuff = new byte[9999];
int nRLen =bis.read(byteBuff);	//fis 에서  bis로 변경
bis.close();	//추가
fis.close();   

설명끝.

 

 

아래는 실전 예제 입니다.

/*
 클라이언트로 부터 온 플래그를 tcpserver에서 플래그별로 분류 해서 파일정보를 보내면 서버에 파일이 있는지 확인하고 없으면 만들고 
 있으면 있는 정보를 돌려준다. 읽기만 하고 기록하지는 않는다.
 */
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class SvrFileRead {
	String strBuff="";
	String strCurrentMsg = null;
	String strFilename;
	
	byte[] byteBuff = new byte[9999];// 사원파일을 읽어들일 바이트 버퍼
	
	int nRLen;
                           //파일이 저장될 디렉토리 이름
	public void sfrFunc(String strDir,String strFileName) throws Exception {
		// 디렉토리가 있는지 확인하고 없으면 만듬
		File dir = new File(strDir);
		if (dir.exists() == false) {
			boolean t = dir.mkdirs();
			if (t == true)
				strCurrentMsg = "디렉토리가 정상적으로 만들어 졌습니다.";
			//System.out.println(strCurrentMsg);
		}

		// 파일이 있는지 확인하고 없으면 만듬
		File file = new File(strFileName);
		boolean trueNewFile = file.createNewFile();
		if (trueNewFile) {
			strCurrentMsg = "파일이 없어  파일을 만들었 습니다.";
			//System.out.println(strCurrentMsg);
		}

		
		// 파일이 존재하면 실행하는 부분
		else if (file.exists() == true) {
			try {
				FileInputStream fis = new FileInputStream(file);
				BufferedInputStream bis = new BufferedInputStream(fis);
				nRLen = bis.read(byteBuff);

				if (nRLen < 0) {
										
					strCurrentMsg = "---파일이 비었습니다--";
					//System.out.println(strCurrentMsg);
					//System.out.println("here");
					
				} else {

					strBuff = new String(byteBuff, 0, nRLen);
					strCurrentMsg = "기존 파일이 존재합니다.";
					//System.out.println(strCurrentMsg);
					//System.out.printf("읽은 바이트수[%d] : 읽은 내용\n[%s]\n", nRLen, strBuff);

				}
				bis.close();
				fis.close();
				
				
				// try 끝
			} catch (FileNotFoundException e) {
				//System.out.println("SfrFileRead 예외 발생 66: " + e.getLocalizedMessage());
				e.printStackTrace();
			}
		}
	}

}

 

 

 

728x90
반응형

댓글