데이터의 흐름을 Stream이라고 표현!
단방향 - 읽기/쓰기 클래스가 각각 존재함!!
File 객체
byte 단위(I/O)
문자단위(Reader, Writer)
flush() : 버퍼의 내용을 강제로 출력하여 비움. close()하면 auto-flush 발생!
Byte 단위
InputStream -> FileInputStream -> BufferedInputStream
Output
문자단위
Reader -> FileReader -> BuffredReader
Writer
간단한 파일 입출력 - FileInputStream
위의 예제는 파일의 내용을 출력해주지만, 한글과 같은 2Byte 문자는 정상적으로 출력되지 않는다.
읽은 내용을 Byte 배열에 담아 출력하는 새로운 방식이 있다.
FileInputStream 을 사용해 Byte 배열에 담아, String 객체로 변환하는 예제
그러나 위의 방법을 응용하여 파일 복사를 시도할 경우 정상적으로 이동이 되지 않는다.
이때는 아래와 같은 소스를 사용해서 처리할 수 있다.
그러나 Byte 배열이 1024 바이트여서인지, 1024바이트 내의 오차가 발생한다. ㅠㅠ
파일 복사 예제 - FileInputStream, FileOutputStream
이번에는 동일한 작업을 Buffred 스트림을 사용해서 처리하는 소스를 살펴보자.
대용량 파일일수록 이점이 있다고 한다.
BufferedInputStream, BufferedOutputStream 을 사용한 파일 복사 예제
파일 복사 이외의 경우에 위의 방법을 많이 사용하므로 사용 방법을 간단히 정리해 보았다.
BufferedInputStream 의 가장 기초적인 폼
BufferedOutputStream 의 가장 기초적인 폼
이번에는 Byte 단위가 아니라 Char 단위로 읽어들이는 Reader/Writer를 살펴보자.
그런데, 이런 Reader에도 Buffered 가 존재한다.
BufferedReader에는 한줄씩 읽는 메소드도 있는데, 아래와 같이 활용할 수 있다.
BufferedReader와 BufferedWriter를 사용해서 문자단위로 읽어 복사하는 소스를 살펴보자.
마찬가지로 거의 비슷한 처리 과정을 거치지만, 사용되는 클래스와 메소드가 조금 다르다.
단방향 - 읽기/쓰기 클래스가 각각 존재함!!
File 객체
byte 단위(I/O)
문자단위(Reader, Writer)
flush() : 버퍼의 내용을 강제로 출력하여 비움. close()하면 auto-flush 발생!
Byte 단위
InputStream -> FileInputStream -> BufferedInputStream
Output
문자단위
Reader -> FileReader -> BuffredReader
Writer
간단한 파일 입출력 - FileInputStream
import java.io.FileInputStream;
public class FileInputStreamExam
{
public static void main(String[] args)
{
// 바이트 단위로 파일읽기
String filePath = "src/ex0801/io/FileExam.java"; // 대상 파일
FileInputStream fileStream = null; // 파일 스트림
int i = 0; //한 바이트를 담을 변수
try
{
fileStream = new FileInputStream(filePath);// 파일 스트림 생성
do
{
i = fileStream.read(); //한 바이트 읽기
System.out.print((char) i);
}
while(i != -1);
}
catch (Exception e)
{
System.out.println("파일 입출력 에러!!" + e);
}
finally
{
try
{
fileStream.close();// 파일 닫기. 여기에도 try/catch가 필요하다.
}
catch (Exception e)
{
System.out.println("닫기 실패" + e);
}
}
}
}
위의 예제는 파일의 내용을 출력해주지만, 한글과 같은 2Byte 문자는 정상적으로 출력되지 않는다.
읽은 내용을 Byte 배열에 담아 출력하는 새로운 방식이 있다.
FileInputStream 을 사용해 Byte 배열에 담아, String 객체로 변환하는 예제
import java.io.FileInputStream;
public class FileInputStreamExam
{
public static void main( String[ ] args )
{
// 바이트 단위로 파일읽기
String filePath = "src/ex0801/io/FileExam.java"; // 대상 파일
FileInputStream fileStream = null; // 파일 스트림
try
{
fileStream = new FileInputStream( filePath );// 파일 스트림 생성
//파일 내용을 담을 버퍼(?) 선언
byte[ ] readBuffer = new byte[ fileStream.available( ) ];
while (fileStream.read( readBuffer ) != -1) //
{
}
System.out.println( new String( readBuffer ) ); //출력
}
catch ( Exception e )
{
System.out.println( "파일 입출력 에러!!" + e );
}
finally
{
try
{
fileStream.close( );//파일 닫기. 여기에도 try/catch가 필요하다.
}
catch ( Exception e )
{
System.out.println( "닫기 실패" + e );
}
}
}
}
그러나 위의 방법을 응용하여 파일 복사를 시도할 경우 정상적으로 이동이 되지 않는다.
이때는 아래와 같은 소스를 사용해서 처리할 수 있다.
그러나 Byte 배열이 1024 바이트여서인지, 1024바이트 내의 오차가 발생한다. ㅠㅠ
파일 복사 예제 - FileInputStream, FileOutputStream
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileInputStreamExam
{
public static void main(String[] args)
{
// 바이트 단위로 파일읽기
String filePath = "src/ex0801/io/aaa.zip"; // 대상 파일
FileInputStream inputStream = null; // 파일 읽기 스트림
FileOutputStream outputStream = null; // 파일 쓰기 스트림
try
{
inputStream = new FileInputStream(filePath);// 파일 입력 스트림 생성
outputStream = new FileOutputStream("src/ex0801/io/bb.zip");// 파일 출력 스트림 생성
// 파일 내용을 담을 버퍼(?) 선언
byte[] readBuffer = new byte[1024];
while (inputStream.read(readBuffer, 0, readBuffer.length) != -1)
{
//버퍼 크기만큼 읽을 때마다 출력 스트림에 써준다.
outputStream.write(readBuffer);
}
}
catch (Exception e)
{
System.out.println("파일 입출력 에러!!" + e);
}
finally
{
try
{
// 파일 닫기. 여기에도 try/catch가 필요하다.
inputStream.close();
outputStream.close();
}
catch (Exception e)
{
System.out.println("닫기 실패" + e);
}
}
}
}
이번에는 동일한 작업을 Buffred 스트림을 사용해서 처리하는 소스를 살펴보자.
대용량 파일일수록 이점이 있다고 한다.
BufferedInputStream, BufferedOutputStream 을 사용한 파일 복사 예제
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileInputStreamExam
{
public static void main(String[] args)
{
// 바이트 단위로 파일읽기
String filePath = "src/ex0801/io/이클립스.zip"; // 대상 파일
FileInputStream inputStream = null; // 파일 스트림
FileOutputStream outputStream = null;
BufferedInputStream bufferedInputStream = null; // 버퍼 스트림
BufferedOutputStream bufferedOutputStream = null;
try
{
inputStream = new FileInputStream(filePath);// 파일 입력 스트림 생성
bufferedInputStream = new BufferedInputStream(inputStream);// 파일 출력 스트림 생성
outputStream = new FileOutputStream("src/ex0801/io/bb.zip");
bufferedOutputStream = new BufferedOutputStream(outputStream);
// 파일 내용을 담을 버퍼(?) 선언
byte[] readBuffer = new byte[1024];
while (bufferedInputStream.read(readBuffer, 0, readBuffer.length) != -1)
{
//버퍼 크기만큼 읽을 때마다 출력 스트림에 써준다.
bufferedOutputStream.write(readBuffer);
}
}
catch (Exception e)
{
System.out.println("파일 입출력 에러!!" + e);
}
finally
{
try
{
// 파일 닫기. 여기에도 try/catch가 필요하다.
// 보조스트림을 닫으면 원스트림도 닫힌다.
bufferedInputStream.close();
bufferedOutputStream.close();
}
catch (Exception e)
{
System.out.println("닫기 실패" + e);
}
}
}
}
파일 복사 이외의 경우에 위의 방법을 많이 사용하므로 사용 방법을 간단히 정리해 보았다.
BufferedInputStream 의 가장 기초적인 폼
BufferedInputStream bs = null;
try
{
bs = new BufferedInputStream(new FileInputStream(경로));
byte [] b = new byte [bs.available()]; //임시로 읽는데 쓰는 공간
System.out.println(b.length);
while( bs.read(b) != -1) {}
System.out.println(new String(b)); //필요에 따라 스트링객체로 변환
}
catch (Exception e)
{
System.out.println(e);
}
finally
{
try
{
bs.close(); //반드시 닫는다.
}
catch (Exception e)
{
System.out.println(e);
}
}
BufferedOutputStream 의 가장 기초적인 폼
BufferedOutputStream bs = null;
try
{
bs = new BufferedOutputStream(new FileOutputStream(경로));
bs.write(text.getText().getBytes()); //Byte형으로만 넣을 수 있음
}
catch (Exception e)
{
System.out.println(e);
}
finally
{
try
{
bs.close(); //반드시 닫는다.
}
catch (Exception e)
{
System.out.println(e);
}
}
이번에는 Byte 단위가 아니라 Char 단위로 읽어들이는 Reader/Writer를 살펴보자.
import java.io.FileReader;
public class ReaderWriter
{
public static void main(String[] args)
{
FileReader fileReader = null;
try
{
fileReader = new FileReader("src/ex0801/io/FileExam.java");
int i = 0;
while (i != -1)
{
i = fileReader.read();
System.out.print((char) i);
}
}
catch (Exception e)
{
System.out.println("오류" + e);
}
finally
{
try
{
fileReader.close();
}
catch (Exception e)
{
System.out.println("파일 닫기 오류" + e);
}
}
}
}
그런데, 이런 Reader에도 Buffered 가 존재한다.
BufferedReader에는 한줄씩 읽는 메소드도 있는데, 아래와 같이 활용할 수 있다.
import java.io.BufferedReader;
import java.io.FileReader;
public class BufferedReaderWriter
{
public static void main(String[] args)
{
FileReader fileReader = null;
BufferedReader bufferedReader = null;
try
{
fileReader = new FileReader("src/ex0801/io/FileExam.java");
bufferedReader = new BufferedReader(fileReader);
String string = new String(); //임시 변수
do
{
//한줄씩 읽기
string = bufferedReader.readLine();
System.out.println(string);
}
while(string != null); //파일 끝이면 null을 반환한다.
}
catch (Exception e)
{
System.out.println("오류" + e);
}
finally
{
try
{
bufferedReader.close();
}
catch (Exception e)
{
System.out.println("파일 닫기 오류" + e);
}
}
}
}
BufferedReader와 BufferedWriter를 사용해서 문자단위로 읽어 복사하는 소스를 살펴보자.
마찬가지로 거의 비슷한 처리 과정을 거치지만, 사용되는 클래스와 메소드가 조금 다르다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
public class BufferedReaderWriter
{
public static void main(String[] args)
{
FileReader fileReader = null;
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
try
{
fileReader = new FileReader("src/ex0801/io/FileExam.java");
bufferedReader = new BufferedReader(fileReader);
//bufferedWriter = new BufferedWriter(new FileWriter("src/ex0801/io/aaa.txt"));
//true를 두번째 인수를 넣으면 이어서 저장됨.
//또 특별히 FileWriter 객체를 따로 생성하지 않고 바로 생성하여 파라메터로 넣어줌.
bufferedWriter = new BufferedWriter(new FileWriter("/aaa.txt", true));
String string = new String(); //임시 변수
do
{
//한줄씩 읽기
string = bufferedReader.readLine();
//끝이 아닌경우, 새 파일에 내용 복사하여 쓰기
if(string != null)
{
bufferedWriter.write(string);
bufferedWriter.newLine(); //한줄 개행
System.out.println(string);
}
}
while(string != null); //파일 끝이면 null을 반환한다.
}
catch (Exception e)
{
System.out.println("오류" + e);
}
finally
{
try
{
bufferedReader.close();
bufferedWriter.close();
}
catch (Exception e)
{
System.out.println("파일 닫기 오류" + e);
}
}
}
}