Super Coding Addict
Ch14. 자바 입출력 (3) 본문
< 바이트 단위 입출력 스트림 >
* 바이트 단위 스트림
- InputStream : 바이트단위 입력스트림 최상위 클래스 (FileInputStream, ByteArrayInputStream, FilterInputStream...)
- OutputStream : 바이트단위 출력스트림 최상위 클래스 (FileOutputStream, ByteArrayOutputStream, FilterOutputStream...)
* FileInputStream과 FileOutputStream 사용하기
- 파일의 한 바이트씩 자료를 읽고 쓰는데 사용 --> 한글과 같은 문자는 X (FileReader, FileWriter를 사용해야함)
- 입력 스트림은 파일이 없으면 예외 발생시키는 반면, 출력 스트림은 파일을 생성하여 출력함
- 예제
# FileInputTest1 클래스
package Ch14.stream.inputstream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputTest1 {
public static void main(String[] args) {
FileInputStream fis = null;
try {
fis = new FileInputStream("input.txt");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
fis.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
--> 실제 파일이 없으므로 입력스트림인 FileInputStream이 예외를 발생시킴
--> 따라서 fis를 연 적도 없기에 finally에서 close()을 하려고하면 nullPointException이 떨어지게 된다
이제 input.txt 파일을 실제 패키지 안에 생성한 후 다음과 같이 텍스트를 작성한 후 FileInputStream으로 읽어보자.
package Ch14.stream.inputstream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputTest1 {
public static void main(String[] args) {
FileInputStream fis = null;
try {
fis = new FileInputStream("input.txt");
int i;
while( (i = fis.read()) != -1 ) {
System.out.print((char)i);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
fis.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("end");
}
}
--> 읽고자 하는 파일의 끝에 도달하면 -1을 반환하므로 끝까지 읽기 위해 while안에 조건식을 걸어준다
--> char타입으로 변환하여 출력해보면, FileInputStream은 1바이트씩만 읽어오므로 한글은 읽지 못하고 나머지 문자는 잘 읽는 것을 알 수 있다
# FileInputTest2
package Ch14.stream.inputstream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputTest2 {
public static void main(String[] args) {
try(FileInputStream fis = new FileInputStream("input2.txt")){
//try안에서 리소스 오픈하고 오토클로즈업 --> 클로즈가 불림
int i;
while( (i = fis.read()) != -1 ) {
System.out.print((char)i);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("end");
}
}
input2.txt는 다음과 같다
--> try안에서 리소스를 오픈하고 오토클로즈업을 하므로 클로즈가 불려서 따로 finally 쓰지 X
# FileInputTest3 -- byte[] 단위로 읽기
FileInputSream클래스의 read()메서드를 보면,
1바이트씩 / byte[] array / bite[] array에서 offset을 지정하고 length만큼 읽는 3가지 옵션이 있다
여기서 read(byte[] b)를 사용해보자.
package Ch14.stream.inputstream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputTest3 {
public static void main(String[] args) {
try(FileInputStream fis = new FileInputStream("input2.txt")){
//try안에서 리소스 오픈하고 오토클로즈업 --> 클로즈가 불림
int i;
byte[] bs = new byte[10];
while( (i = fis.read(bs)) != -1 ) {
for(byte b : bs) {
System.out.print((char)b);
}
System.out.println();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//System.out.println("end");
}
}
--> 10바이트씩 array로 읽어오기 때문에 10바이트를 맞춰주기 위해 만약 읽어오는 데이터에서 바이트 수가 부족하다면 가비지로 채워진다 (QRST는 전에 읽었던 데이터로 가비지로 채울 때 쓰임)
--> 따라서 코드를 다음과 같이 바꿔준다
--> 이제 읽어온 개수만큼만 출력하게 되므로, 읽어온 개수인 i도 함께 출력해보면
--> 10개, 10개, 6개를 읽어와 각각 그 개수만큼 찍어주므로 가비지는 더이상 출력되지 않는다
# FileOutputTest 클래스
package Ch14.stream.outputstream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputTest {
public static void main(String[] args) {
try(FileOutputStream fos = new FileOutputStream("output.txt", true)){
fos.write(65);
fos.write(66);
fos.write(67);
}catch(IOException e) {
System.out.println(e);
}
}
}
--> output.txt파일이 없으므로 파일이 생성된 후 write()가 수행된다
--> 인자로 true를 주면 append가 됨
# FiileOutputTest2 클래스 -- FileInputStream과 FileOutputStream 모두 써보기
package Ch14.stream.outputstream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputTest2 {
public static void main(String[] args) {
byte[] bs = new byte[26];
byte data = 65;
for(int i=0; i<bs.length; i++) {
bs[i] = data;
data++;
}
try(FileOutputStream fos = new FileOutputStream("alpha.txt", true);
FileInputStream fis = new FileInputStream("alpha.txt")){
fos.write(bs);
int ch;
while( (ch = fis.read()) != -1) {
System.out.print((char)ch);
}
}catch(IOException e) {
System.out.println(e);
}
}
}
'JAVA 문법' 카테고리의 다른 글
Ch14. 자바 입출력 (5) (0) | 2021.02.18 |
---|---|
Ch14. 자바 입출력 (4) (0) | 2021.02.18 |
Ch14. 자바 입출력 (2) (0) | 2021.02.16 |
Ch14. 자바 입출력 (1) (0) | 2021.02.16 |
Ch15. 자바 Thread 프로그래밍 (5) - multi-thread 프로그래밍 (0) | 2021.02.15 |