2020.11.03 고급자바 수업노트

*하나의 스트림으로 입출력을 동시에 수행 할 수 없다. ( 단방향 통신 ) 

- 입출력을 동시에 수행하려면 , 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();
}

}
}





댓글