입출력스트림
문자 스트림
문자만 입출력하는 스트림
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();
}
}
}
'Language > JAVA' 카테고리의 다른 글
[JAVA] 코테 스터디 코드 리뷰 중 배운 최적화 기법1 (0) | 2022.12.05 |
---|---|
[JAVA] Generic 메소드 작성 (0) | 2021.02.14 |
댓글