본문 바로가기
Language/JAVA

[JAVA] 입출력 스트림 / 파일스트림

by 태옹 2021. 2. 15.

입출력스트림 

 

  문자 스트림

문자만 입출력하는 스트림

Reader/Writer

InputStreamReader/OutputStreamWriter

FileReader/FileWriter

예) 텍스트 파일을 읽는 입력 스트림

 

 

1. FileReader로 텍스트 파일 읽기

FileReader를 이용하여 c:\windows\system.ini 파일을 읽어 화면에 출력하는 프로그램을 작성 (system.ini는 텍스트 파일)

package reader;
import java.io.*;

public class FileReaderEx {
	public static void main(String[] args) {
		FileReader fr = null;
		try {
			fr = new FileReader("c:\\windows\\system.ini");
			int c;
			while((c = fr.read())!=-1) {	// 한 문자씩 파일 끝까지 읽기
				System.out.print((char)c);
			}
		}
		catch(IOException e) {
			System.out.println("입출력 오류");
		}
	}
}

 

2. 키보드 입력을 파일로 저장하기

- Scanner를 이용하여 키보드에서 입력받은 데이터를 c:\Temp\test.txt 파일에 저장 하는 프로그램을 작성

package writer;
import java.io.*;
import java.util.Scanner;

public class FileWriterEx {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		FileWriter fout = null;
		try {
			fout = new FileWriter("c:\\Temp\\test.txt");
			while(true) {
				String line = scan.nextLine();
				if(line.length()==0) 
					break;
				fout.write(line,0,line.length());
				fout.write("\r\n", 0, 2);
			}
			fout.close();
		}catch(IOException e) {
			System.out.println("입출력오류");
		}
		scan.close();
	}
}

 

 

 

  바이트 스트림

입출력되는 데이터를 단순 바이트로 처리

InputStream/OutputStream 

FileInputStream/FileOutputStream

DataInputStream/DataOutputStream

예) 바이너리 파일을 읽는 입력 스트림

 

1. FileOutputStream으로 바이너리 파일 쓰기

- FileOutputStream을 이용하여 byte [] 배열 속에 들어 있는 바이너리 값을 c:\Temp\test.out 파일에 저장 (이 파일은 바이너리 파일이 되므로 메모장으로 볼 수 없음.)

package outputStream;
import java.io.*;

public class FileOutputStreamEx {
	public static void main(String[] args) {
		FileOutputStream fouts = null;
		byte [] b = {7,51,3,4,-1,24};
		try {
			fouts = new FileOutputStream("c:\\Temp\\test.out");
			for(int i=0;i<b.length;i++) {
				fouts.write(b[i]);
			}
		fouts.close();
		}catch(IOException e) {
			System.out.println("c:\\\\Temp\\\\test.out에 저장할 수\r\n"
					+ "없었습니다. 경로명을 확인해 주세요");
			return;
		}
		System.out.println("c:\\Temp\\test.out을 저장하였습니다.");
	}
}

 

2. FileInputStream으로 바이너리 파일 읽기

FileInputStream을 이용하여 c:\Temp\test.out 파일을 읽어 byte [] 배열 속에 저장하고 화면에 출력

package inputStream;
import java.io.*;

public class FileInputStreamEx {
	public static void main(String[] args) {
		FileInputStream fins = null;
		byte[] b = new byte[6]; //byte[] b = {};안됨
		try {
			fins = new FileInputStream("c:\\Temp\\test.out");
			int n=0,c;
			while((c = fins.read())!=-1) {
				b[n] = (byte) c;
				n++;
			}
			System.out.println("c:\\Temp\\test.out에서 읽은 배열을 출력합니다.");
			for(int i=0;i<b.length;i++) {
				System.out.print(b[i]+" ");
			}
			fins.close();
		}catch(IOException e) {
			System.out.println("c:\\Temp\\test.out에서 읽지 못했습니다. 경로명을 체크해보세요");
		}
	}
}

 

버퍼스트림

1. 버퍼 스트림을 이용한 출력

버퍼 크기를 5, 표준 출력 스트림(System.out)과 연결한 버퍼 출력 스트림을 생성. c:\Temp\test2.txt 파일을 저장된 영문 텍스트를 읽어 버퍼 출력 스트림을 통해 출력

package buffered;
import java.io.*;
import java.util.Scanner;

public class BufferedIOEx {
	public static void main(String[] args) {
		FileReader fin = null;
		BufferedOutputStream bouts = null;
		int c;
		try {
			fin = new FileReader("c:\\Temp\\test2.txt");
			bouts = new BufferedOutputStream(System.out, 5);
			while((c=fin.read())!=-1) {
				bouts.write(c);	//버퍼가 꽉 찰 때 문자가 화면에 출력
			}
			new Scanner(System.in).nextLine(); //<Enter> 키 기다림
			bouts.flush();	//버퍼에 남아있는 문자를 강제로 출력
			fin.close();
			bouts.close();
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
}

 

 

 

파일스트림

1. 텍스트 파일 복사

문자 스트림 FileReader와 FileWriter를 이용하여 c:\windows\system.ini를 c:\Temp\system.txt 파일로 복사하는 프로그램을 작성

package fileClass;
import java.io.*;

public class TextCopyEx {
	public static void main(String[] args) {
		File src = new File("c:\\windows\\system.ini");
		File dest = new File("c:\\Temp\\system.txt");
		int c;
		try {
			FileReader fr = new FileReader(src);
			FileWriter fw = new FileWriter(dest);
			while((c=fr.read())!=-1) {
				fw.write((char)c);
			}
			fr.close();
			fw.close();
			System.out.println(src.getPath()+ "를 " + dest.getPath()+ "로 복사하였습니다.");
		}catch(IOException e) {
			
		}
	}

}

 

2. 바이너리 파일 복사

바이트 스트림을 이용하여 바이너리 파일을 복사하는 프로그램을 작성

package fileClass;
import java.io.*;

public class BinaryCopyEx {
	public static void main(String[] args) {
		File src = new File("C:\\Windows\\Web\\Wallpaper\\Samsung\\Samsung_wallpaper.jpg");
		File dest = new File("C:\\Temp\\copyimg.jpg"); //복사파일 이름 지정
		int c;
		try {
			FileInputStream fin = new FileInputStream(src);
			FileOutputStream fout = new FileOutputStream(dest);
			
			while((c=fin.read())!=-1) {
				fout.write((byte)c);
			}
			
			fin.close();
			fout.close();
			System.out.println(src.getPath()+ "를 " +
					dest.getPath()+ "로 복사하였습니다.");
		}catch(IOException e) {
			System.out.println("파일 복사 오류");
		}
	}
}
//시간 좀 걸림! print뜰 때 까지 기다리기

 

3. 블록 단위로 바이너리 파일 고속 복사

2번을 10KB 단위로 읽고 쓰도록 수정하여 고속으로 파일을 복사

package fileClass;
import java.io.*;

public class BlockBinaryCopyEx {
	public static void main(String[] args) {
		File src = new File("C:\\Windows\\Web\\Wallpaper\\Theme1\\img1.jpg");
		File dest = new File("C:\\Temp\\flower.jpg"); //복사파일 이름 지정
		try {
			FileInputStream fin = new FileInputStream(src);
			FileOutputStream fout = new FileOutputStream(dest);
			byte[] buf = new byte[1024*10];  // 10KB 버퍼
			
			while(true) {
				int n = fin.read(buf);		// 버퍼 크기만큼 읽기. n은 실제 읽은 바이트
				fout.write(buf,0,n);	// buf[0]부터 n 바이트 쓰기
				if(n<buf.length)
					break;
			}
			fin.close();
			fout.close();
			System.out.println( src.getPath() + "를 " + dest.getPath() + "로 복사하였습니다.");

		}catch(IOException e) {
			e.printStackTrace();
		}
	}

}

 

댓글