*하나의 스트림으로 입출력을 동시에 수행 할 수 없다. ( 단방향 통신 )
- 입출력을 동시에 수행하려면 , 2개의 스트림이 필요하다.
1)바이트기반 스트림
2)문자기반 스트림
InputStream
int read(byte[] b ) -> 반환값 : 실제 읽어온 배열의 길이만큼
int read(byte[] b , int off, int len ) -> int off 가 읽어올 변수 off 번째 위치에서부터 저장한다. -> 위치까지
감안해서 저장하고 싶을 때
OutputStream
abstract void wirte ( int b ) -> b값만 출력
void write(byte[] b ) -> 배열 전체 데이터 한꺼번에 출력
void write ( byte[] b , int off, int len ) off 번째에서 len 만큼만 출력하기
inputStream
int acailable() : 포인터가 끝나고 얼마나 더 남았는지
void close () : 사용하던 자원 반납 : 운영체제가 사용할때 다른프로그램이 와서 사용못하게, 동기화같이 하는데
프로그램 사용이 끝났다는 것을 알려줘서 다른프로그램이 사용할 수 있도록 하기 위해
void mark () : 포인터의 자리 표시
void reset () : mark() 하고 계속 읽다가 reset 을 만나면 다시 mark() 표시해놓은데로 돌아옴
markSuppoted() 는 mark 가 사용에 따라 지원이 안될때 mark() 기능을 사용할 수 있는지 아닌지 검사
: true , false 로 반환
long skip(long n ) : 건너뛰어서 읽기 ( read)
outputStream
close () : 출력스트림을 더이상 사용하지 않겠다.
flush () :
버퍼에 가득차야 작업을 한다. -> 마지막에 가면 가득차지 않을 수 있다.
그러면 -> 프로그램이 끝나면 데이터 몇개는 출력이 덜 된상태..
출력 버퍼에 남아있는 데이터를 강제로 ( 버퍼가 가득 안차도 ) 출력해주는것
보통 close() 를 호출하면 flush 도 자동으로 호출해주는 경우가 많다. (안써도 큰 지장이 없다. )
FileInputStream 과 FileOutputStream
FileInputStream () 괄호 안에 String name 이나 File file 인데, 여기에는 이름과 경로가 들어가 있는것.
-----------------------------------------------------------------------------------------------------
ByteArrayIOTest01
package kr.or.ddit.basic;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Arrays;
public class ByteArrayIOTest01 {
public static void main(String[] args) {
//byte 배열의 데이터를 입력 스트림으로 읽어서 출력 스트림으로 출력하는 예제
byte[] inSrc = {0,1,2,3,4,5,6,7,8,9} ; // -1 이 될 때
byte[] outSrc = null;
//입력용 스트림 객체 생성 바이트
ByteArrayInputStream input = new ByteArrayInputStream(inSrc);
//출력용 스트림 객체 생성
ByteArrayOutputStream output = new ByteArrayOutputStream();
int data; // 읽어온 자료가 저장될 변수
// read() 메서드는 ==> 더 이상 읽어올 자료가 없으면 -1 을 반환한다.
while ( ( data = input.read() ) != -1 ) { //한번에 1바이트씩 읽어서 처리하는 것
//읽어온 데이터를 사용하여 처리하는 내용을 기술한다. // -1 이 아니면 자료를 읽어온것을 data에 저장된 상태이겠지?
//출력해볼까
output.write(data); // 출력용 스트림을 이용하여 읽어온 데이터를 출력한다.
}
//출력된 스트림 값을 배열로 변환하기
outSrc = output.toByteArray();
try {
input.close();
output.close();
//사용했던 자원 ( 스트림 객체 ) 를 반납한다.
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(" inSrc => " + Arrays.toString(inSrc));
System.out.println("outScr => " + Arrays.toString(outSrc));
}
}
-----------------------------------------------------------------------------------------------------
ByteArrayIOTest02
package kr.or.ddit.basic;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Arrays;
public class ByteArrayIOTest02 {
//byte 로 만들면 배열이 4길이니까 10개중에 2개가 남고 2 + 2개 더 추가(원래있던애 6,7 을 다시한번 출력한다. ) -> 주의할것 .
// byte 배열로 읽어올 때는 총 길이만큼만 가지고 와서 출력을 해야된다.
public static void main(String[] args) {
byte[] inSrc = {0,1,2,3,4,5,6,7,8,9} ;
byte[] outSrc = null ;
byte[] temp = new byte[4]; // 4짜리 배열 생성
ByteArrayInputStream input = new ByteArrayInputStream(inSrc);
ByteArrayOutputStream output = new ByteArrayOutputStream();
try {
// 읽어올 데이터가 있는지 확인
while ( input.available() > 0 ) {
/* input.read(temp);
//temp 배열의 데이터를 출력 스트림으로 출력한다.
output.write(temp); 이거는 문제 발생소지가 있다 ( 배열 길이 ) */
int len = input.read(temp); // 반환갓 : 실제 읽어온 데이터의 byte 수를 반환한다.
//실제로는 6,7 남아있는데 출력할때는 길이만큼만 출력하니까 결과값이 같아짐 (inSrc, outSrc )
//읽어온 데이터가 저장된 temp 배열에서 0 번째부터 읽어온 개수만큼 출력한다.
output.write(temp, 0, len);
System.out.println("반복문 안에서 temp => " + Arrays.toString(temp));
}
outSrc = output.toByteArray();
System.out.println();
System.out.println(" inSrc => " + Arrays.toString(inSrc));
System.out.println(" outSrc => " + Arrays.toString(outSrc));
input.close();
output.close();
} catch (Exception e) {
}
}
}
-----------------------------------------------------------------------------------------------------
FileOTest01
package kr.or.ddit.basic;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class FileIOTest01 {
public static void main(String[] args) {
//FileInputStream 객체를 이용한 파일 내용 읽기 try catch 구문을 사용해야 한다.
try {
/*//읽어올 파일을 매개값으로 받는 FileInputStream 객체 생성하기
FileInputStream fin1 = new FileInputStream("d:/D_Other/text.txt"); */
//방법2
File file = new File("d:/D_Other/text.txt");
FileInputStream fin = new FileInputStream(file);
int c ; // 읽어온 데이터가 저장될 변수
while ((c = fin.read() ) != -1 ) {
//읽어온 데이터를 화면에 출력하기
System.out.print((char)c);
}
fin.close(); // 스트림 닫기
} catch (IOException e) {
System.out.println("입출력 오류입니다..");
e.printStackTrace();
}
}
}
-----------------------------------------------------------------------------------------------------
FileOTest02
package kr.or.ddit.basic;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileIOTest02 {
public static void main(String[] args) {
//파일에 데이터를 출력하기
try {
File file = new File("d:/D_Other/out.txt"); //없는 파일은 만들어주고 파일이 있으면 덮어쓴다 ( outputstream 은 )
//출력용 파일 스트림객체 생성
FileOutputStream fout = new FileOutputStream(file);
/*방법2
* FileOutputStream fout = new FileOutputStream("d:/D_Other/out.txt"); */
for ( char ch = 'A' ; ch <= 'Z' ; ch++) {
fout.write(ch); //출력스트림을 이용해서 파일에 출력하기
}
System.out.println("출력 작업완료 ~~ " ) ;
fout.close(); //스트림 닫기
//저장된 파일 내용을 읽어와 화면에 출력하기
System.out.println();
System.out.println("읽어온 파일내용");
FileInputStream fin = new FileInputStream(file);
int c ;
while(true) {
c = fin.read();
if(c == -1 ) {
break;
}
System.out.print((char)c);
}
} catch (IOException e) {
}
}
}
-----------------------------------------------------------------------------------------------------
FileIOTest03
package kr.or.ddit.basic;
import java.io.FileReader;
import java.io.IOException;
public class FileIOTest03 {
public static void main(String[] args) {
//문자 기반의 스트림을 사용하여 파일 내용 읽어오기
//문자단위로 읽는다.
try {
FileReader fr = new FileReader("d:/D_Other/test.txt");
int c ;
while ( ( c = fr.read()) != -1 ) {
System.out.print((char)c);
}
fr.close(); // 스트림 닫기
} catch (IOException e) {
}
}
}
-----------------------------------------------------------------------------------------------------
FileIOTest 04
package kr.or.ddit.basic;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
public class FileIOTest04 {
//콘솔에서 사용자가 입력한 내용을 그대로 파일에 저장하기
// 콘솔 : 기본적인 입출력 장치
public static void main(String[] args) {
try {
// System.out => 콘솔(표준 입출력장치) 출력장치 => 바이트 기반 출력용 스트림
// System.in => 콘솔(표준 입출력장치 ) 입력장치 => 바이트 기반 입력용 스트림
// 바이트 기반의 스트림을 문자 기반의 스트림으로 변환해주는 스트림 객체 생성
//콘솔로 입력한 데이터를 가져오기 위한 스트림 객체
InputStreamReader isr = new InputStreamReader(System.in);
// () 속에 있는 바이트기반 스트림을 -> 문자기반의 스트림으로 바꿔줌
//파일로 저장하는 문자 기반 스트림 객체 생성
FileWriter fw = new FileWriter("d:/D_Other/testChar.txt");
System.out.println("아무 내용이나 입력하세요.(입력의 끝은 ctrl + z 키 입니다.)");
int c ; // int 는 4 바이트 char 형은 2 바이트 한글자는 2바이트
while((c = isr.read()) != -1 ) {
fw.write(c); //콘솔로 입력한 갓을 파일로 출력한다.
}
isr.close();
fw.close();
} catch (IOException e) {
}
}
}
-----------------------------------------------------------------------------------------------------
FileCopyTest
package kr.or.ddit.basic;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
/*
*
*
* 'd:/D_Other/' 폴더에 있는 극한직업.jpg 파일을 d:/D_Other /연습용 폴더에
* '극한직업_복사본.jpg 이름으로 복사하는 프로그램을 작성하시오.
*
*
*
*
*/
public class FileCopyTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
/* File file = new File ("d:/D_Other/극한직업.jpg");
//파일 객체생성
File file2 = new File ("d:/D_Other/연습용/극한직업복사본.jpg"); */
try {
File file = new File ("d:/D_Other/극한직업.jpg");
//파일 객체생성
File file2 = new File ("d:/D_Other/연습용/극한직업.jpg");
FileInputStream poster = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(file2);
int c ;
while((c = poster.read() ) != -1 ) {
fos.write(c);
}
poster.close();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
댓글
댓글 쓰기