JAVA의 입출력
Input 과 Output 을 줄여서 I/O 라고 한다. 이러한 모든 I/O가 Stream(스트림) 을 통해 이루어진다.
File
폴더 읽기 예제
package D16;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
public class FileTest1 {
public static class ImageNameFilter implements FilenameFilter{
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".jpg");
}
}
public static void main(String[] args) {
System.out.println("c: 드라이브의 전체 파일 출력");
File file = new File("c:\\\\");
String[] files = file.list();
for(String filename:files) {
File subFile = new File(file, filename);
if(file.isDirectory()) {
System.out.println("디렉터리 이름: "+filename);
}else {
System.out.println("파일이름 : "+filename+", 파일크기 :" + subFile.length()+"byte");
}
}
System.out.println("c: 드라이브에 이미지 파일만 출력");
String[] imageFiles = file.list(new ImageNameFilter());
for(String fileName : imageFiles) {
File subFile = new File(file, fileName);
System.out.println("파일"+fileName+", 파일크기 :"+subFile.length()+"byte, 파일경로 : "+subFile.getAbsolutePath());
}
File makeFile = new File("c:\\\\data\\\\testFile.txt");
try {
makeFile.createNewFile();
}catch(IOException e) {
e.printStackTrace();
}
if(makeFile.exists()) {
System.out.println("makeFile이 생성됨");
}
File renameFile = new File("c:\\\\data\\\\testFile3.txt");
makeFile.renameTo(renameFile);
if(renameFile.delete()) {
System.out.println("renameFile이 삭제됨");
}
}
}
Stream IO
- 응용 프로그램과 입출력 장치를 연결하는 소프트웨어 모듈
- 스트림의 양끝에는 입출력 장치와 자바 응용프로그램이 연결된다. (java.io.~Stream;)
- 스트림은 단방향이다.
- 스트림을 통해 흘러가는 기본 단위는 바이트나 문자이다.
- 스트림은 선입선출이다.
character Stream
- 문자만 다룬다 문자가 아닌 다른 데이터가 출력되면 보이지 않거나 엉뚱하게 출력된다
- 자바에서 char 타입의 문자 하나의 크기는 2byte 이다.
byte input Stream
byte Stream
- 바이트를 단위로 다루는 스트림
- 문자이든 이미지 바이트든 상관없이 흘려 보낸다.
InputStream
InputStream은 데이터를 바이트 단위로 입력받아 처리하는 클래스이다.
상속받은 클래스들은 다양한 소스에서 바이트 단위 입력을 처리할수 있다.
예를들면 파일, 네트워크, 메모리 등에서 데이터를 읽어 들일수 있다.
inputStream에서 주요 메소드는 read() 메소드는 입력 스트림에서 바이트 데이터를 읽어 들이는 메소드 이다.
import java.io.*;
public class ReadInputExample {
public static void main(String[] args) {
try {
// System.in을 사용하여 사용자로부터 입력받는 InputStream 객체 생성
InputStream input = System.in;
// 사용자로부터 입력받은 데이터를 저장할 byte 배열 생성
byte[] data = new byte[1024];
// 사용자로부터 데이터를 읽어들임
System.out.print("데이터를 입력하세요: ");
int bytesRead = input.read(data, 0, data.length);
// 읽어들인 데이터 출력
System.out.println(new String(data, 0, bytesRead));
// 스트림 닫기
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
System.in 으로 사용자로부터 입력받은 데이터를 읽어들인다.
먼저 inputStream 객체를 생성하고, 사용자로부터 입력받은 데이터를 저장할 byte 배열을 생성한다 그리고 read() 메소드를 사용해 사용자로부터 데이터를 읽어들인 뒤, byte 배열의 내용을 String으로 변환하여 출력한다.
그리고 마지막으로 Stream을 닫아 자원을 반환한다.
FileInputStream
FileInputStream은 파일로부터 데이터를 바이트 단위로 읽어들이는 클래스이다.
파일을 열고 읽기위한 데이터를 제공하면, 해당 파일에서 바이트 단위로 데이터를 읽어들인다.
주요 메소드는 read() 메소드이다.
import java.io.*;
public class ReadFileExample {
public static void main(String[] args) {
try {
// 파일을 열기 위한 FileInputStream 객체 생성
FileInputStream input = new FileInputStream("example.txt");
// 파일에서 데이터를 읽기 위한 byte 배열 생성
byte[] data = new byte[1024];
// 파일에서 데이터를 읽어들임
int bytesRead = input.read(data, 0, data.length);
// 읽어들인 데이터 출력
System.out.println(new String(data, 0, bytesRead));
// 스트림 닫기
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
FileInputStream 사용한 “example.tet” 파일에서 데이터를 읽어 들이는 코드이다.
먼저 FileInputStream 객체를 생성하고, 파일에서 읽어들일 데이터를 저장할 byte 배열을 생성한다.
그리고 read() 메소드를 사용하여 파일에서 데이터를 읽어 들인뒤, byte 배열의 내용을 String 으로 변환 하여 출력한다.
byte output Stream
byte Stream
- 바이트를 단위로 다루는 스트림
- 문자이든 이미지 바이트든 상관없이 흘려 보낸다.
Output Stream
OutputStream 은 데이터를 바이트 단위로 출력하는 클래스이다.
이 클래스를 상속받은 클래스들은 다양한 대상에 바이트 단위를 출력을 처리할수 있다.
예를들어 파일, 네트워크, 메모리 등의 데이터를 사용할수 있다. 주요 메소드는 write() 메소드이다.
출력 스트림에 바이트 데이터를 쓰기 위해 사용한다.
import java.io.*;
public class WriteFileExample {
public static void main(String[] args) {
try {
// 파일을 생성하기 위한 OutputStream 객체 생성
OutputStream output = new FileOutputStream("example.txt");
// 파일에 쓸 데이터 생성
String data = "Hello, World!";
// 데이터를 파일에 씀
output.write(data.getBytes());
// 스트림 닫기
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
OutputStream를 사용하여 “example.txt” 파일에 데이터를 쓴다.
OutputStream객체를 생성하고, 파일에 쓸 데이터를 String으로 생성한다.
그리고 write() 메소드를 사용하여 데이터 파일에 쓴다.
FileOutputStream
FileOutputStream은 파일에 바이트 단위로 데이터를 출력할때 사용한다.
파일을 열고, 출력할 데이터를 제공하면, 해당 파일에 바이트 단위로 데이터를 출력한다.
import java.io.*;
public class WriteFileExample {
public static void main(String[] args) {
try {
// 파일을 생성하기 위한 FileOutputStream 객체 생성
FileOutputStream output = new FileOutputStream("example.txt");
// 파일에 쓸 데이터 생성
String data = "Hello, World!";
// 데이터를 파일에 씀
output.write(data.getBytes());
// 스트림 닫기
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
FileOutputStream을 사용하여 “example.txt” 파일에 데이터를 쓴다.
먼저 FileOutputStream 객체를 생성하고, 파일에 쓸 데이터를 String 으로 생성한다.
그리고 write() 메소드를 사용하여 데이터를 파일에 쓴다.
Buffered I/O
Buffered input, output Stream
Buffered I/O는 입출력 스트림을 사용할 때 버퍼를 추가로 사용하여 입출력 성능을 향상시키는 방법이다.
Buffered I/O 사용하여 버퍼링 기능을 구현할수있다.
이를 통해 입출력 스트림이 번번하게 사용되는 경우에도 데이터의 흐름을 끊지 않고 좀 더 효율적으로 처리할수 있다. BufferedInputStream은 입력 스트림으로부터 데이터를 읽어 들일때 내부 버퍼를 사용하여 읽어들이는 데이터의 양을 줄이고, 데이터를 읽는 속도를 향상시킨다.
BufferedOutputStream은 출력 스트림으로 데이터를 보낼때 내부 버퍼를 사용하여 데이터 전송을 최소화하고, 데이터 전송 속도를 높인다.
import java.io.*;
public class ReadFileExample {
public static void main(String[] args) {
try {
// 파일을 열기 위한 FileInputStream 객체 생성
FileInputStream input = new FileInputStream("example.txt");
// BufferedInputStream으로 input 스트림을 감싸기
BufferedInputStream bufferedInput = new BufferedInputStream(input);
// 파일에서 데이터를 읽기 위한 byte 배열 생성
byte[] data = new byte[1024];
// 파일에서 데이터를 읽어들임
int bytesRead = bufferedInput.read(data, 0, data.length);
// 읽어들인 데이터 출력
System.out.println(new String(data, 0, bytesRead));
// 스트림 닫기
bufferedInput.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
FileInputStream으로 객체를 먼저 생성하고 BufferedInputStream으로 감싸서 내부 버퍼를 사용하도록 한다 그리고 이후에 데이터를 읽어들이는 코드는 이전과 동일하다.
이를 통해 입력스트림에서 읽어들인 데이터를 내부 버퍼에 저장하여, 버퍼가 가득 찰 때 까지 한꺼번에 읽어들이도록 구현할수있다. BufferedOutputStream를 사용한 출력 예시는 입력 예시와 유사하다.
이 경우에는 FileOutputStream 객체를 생성한 후, 이 객체를 BufferedOutputStream으로 감싸서 내부 버퍼링을 사용하도록 한다. 그리고 데이터를 출력할 때는 write() 메소드를 사용하여 데이터를 내부 버퍼에 저장하고, 버퍼가 가득 차거나 스트림이 닫힐 때 버퍼에 있는 데이터를 한꺼번에 출력하도록 구현할수 있다.
'JAVA' 카테고리의 다른 글
[JAVA] 예외처리(try - catch) (0) | 2023.07.19 |
---|---|
[JAVA] Beep (0) | 2023.07.19 |
[JAVA] Thread (0) | 2023.07.19 |
[JAVA] Collection(Map) (0) | 2023.07.19 |
[JAVA] Collection(Stack) (0) | 2023.07.18 |