어떤 데이터를 입출력하느냐에 따라서 두가지로 나뉜다.
바이트 스트림 : 그림, 문자, 멀티미디어 등 모든 종류의 데이터를 입출력할 때 사용
문자 스트림 : 문자만 입출력할 때 사용
아래는 OutputStream 클래스의 주요 메소드
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class WriteExample {
public static void main(String[] args) {
try {
OutputStream os = new FileOutputStream("C:/Temp/test1.db");
byte a = 10;
byte b = 20;
byte c = 30;
os.write(a);
os.write(b);
os.write(c);
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class WriteExample {
public static void main(String[] args) {
try {
OutputStream os = new FileOutputStream("C:/Temp/test2.db");
byte[] array = {10, 20, 30};
os.write(array); // 일부 출력시 os.write(array, 1, 3);
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
InputStream is = ...;
while(true) {
int data == is.read(); //1 바이트를 읽고 리턴
if (data == -1) break; //-1을 리턴했을 경우 while문 종료
}
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class ReadExample {
public static void main(String[] args) {
try {
InputStream is = new FileInputStream("C:/Temp/test1.db");
while (true) {
int data = is.read();
if (data == -1) break;
System.out.println(data);
}
is.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class ReadExample {
public static void main(String[] args) {
try {
InputStream is = new FileInputStream("C:/Temp/test2.db");
byte[] data = new byte[100];
while (true) {
int num = is.read(data);
if (num == -1) break;
;
for (int i = 0; i < num; i++) {
System.out.println(data[i]);
}
}
is.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
public class CopyExample {
public static void main(String[] args) throws Exception {
String originalFileName = "C:/Temp/test.jpg";
String targetFileName = "C:/Temp/test2.jpg";
//입출력 스트림 생성
InputStream is = new FileInputStream(originalFileName);
OutputStream os = new FileOutputStream(targetFileName);
byte[] data = new byte[1024]; //읽은 바이트를 저장할 때 배열 생성
while (true) {
int num = is.read(data); //최대 1024 바이트를 읽고 배열에 저장, 읽은 바이트는 리턴
if (num == -1) break;
os.write(data, 0, num);
} os.flush();
os.close();
is.close();
System.out.println("복사 완료");
}
}
Java9 이후 transferTo() 메소드 사용가능.
byte[] data = new byte[1024];
while (true) {
int num = is.read(data);
if (num == -1) break;
os.write(data, 0, num);
} //7줄이
is.transferTo(os);//한줄로 대체 가능
InputStream is = new FileInputStream(" ... ");
InputStreamReader reader = new InputStreamReader( is );
// 보조 스트림을 연결하는 코드
//보조 스트림은 또 다른 보조 스트림과 연결하여 스트림 체인으로 구성가능
BufferedReader br = new BufferedReader( reader );
보조스트림 사진
InputStreamReader 보조 스트림을 연결
InputStream is = new FileInputStream("C:/Temp/test.txt");
Reader reader = new InputStreamReader(is);
똑같이 OutputStreamWriter 보조 스트림을 연결
OutputStream os = new FileOutputStream("C:/Temp/test.txt");
Writer writer = new OutputStreamWriter(os);
BufferedInputStream bis = new BufferedInputStream(바이트 입력 스트림);
BufferedOutputStream bos = new BufferedOutputStream(바이트 출력 스트림);
BufferedReader br = new BufferedReader(문자 입력 스트림);
BufferedWriter bw = new BufferedWriter(문자 출력 스트림);
BufferedReader br = new BufferedReader(new FileReader( "..." ));
while(true) {
String str = br.readLine(); // 파일에서 한 행씩 읽음
if(str == null) break; // 더 이상 읽을 행이 없을 경우 while문 종료
}
DataInputStream dis = new DataInputStream(바이트 입력 스트림);
DataOutputStream dos = new DataOutputStream(바이트 출력 스트림);
아래는 DataInputStream DataOutputStream이 제공하는 메소드
메소드 사용시 주의사항이 있는데, 데이터 타입의 크긱가 모두 다르므로 DataOutputStream으로 출력한 데이터를 다시 DataInputStream으로 읽어 올 때에는 출력한 순서와 동일한 순서로 읽어야 한다는 것이다. 예를 들어출력할 때의 순서가 int -> Boolean -> double이라면 읽을 때도 그대로여야 한다.
//연결 구조
PrintStream ps = new PrintStream(바이트 출력 스트림);
PrintWriter pw = new PrintWriter(문자 출력 스트림);
// ObjectInputStream과 ObjectOutputStream 보조 스트림을 연결하는 코드이다.
ObjectInputStream ois = new ObjectInputStream(바이트 입력 스트림);
ObjectOutputStream oos = new ObjectOutputStream(바이트 출력 스트림);
// ObjectOutputStream으로 객체를 직렬화하기 위해서는 writeObject() 메소드 사용
oos.writeObject(객체);
//반대로 ObjectInputStream의 readObject() 메소드는 읽은 바이트를 역직렬화해서 객체로 생성한다.
//readObject() 메소드의 리턴 타입은 Object이므로 구체적 타입으로 강제 타입 변환해야 한다.
객체타입 변수 = (객체타입) ois.readObject();
public class Member implements Serializable {
int field1;
int field2;
}
public class Member implements Serializable
int field1;
int field2;
int field3;
}
이런 식으로 클래스 내용이 다르더라도 직렬화된 필드를 공통으로 포함하고 있다면 역직렬화할 수 있는 방법이 있다. 두 클래스가 동일한 serialVersionUID 상수값을 가지고 있으면 된다.
public class Member implements Serializable {
static final long serialVersionUID = 1;
int field1;
int field2;
}
public class Member implements Serializable
static final long serialVersionUID = 1;
int field1;
int field2;
int field3;
}
File file = new File("경로");
//File 클래스로부터 File 객체를 생성하는 방법
boolean isExist = file.exists();
exists() false 경우
exists() true 경우
Path path = Paths.get(String first, String ... more )
get() 메소드의 매개값은 파일 경로인데 전체 경로를 한번에 지정, 상위 디렉토리와 하위 디렉토리를 나열 지정해도 상관없다.
new FileReader(filePath);
new BufferedReader(fr);
rowData = br.readLine();
if(rowData == null) {
break;
}
System.out.println(++rowNumber + ": " + rowData);
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Scanner;
public class Example {
public static void main(String[] args) {
try {
Scanner scanner = new Scanner(System.in);
//경로 입력 받기
System.out.print("원본 파일 경로: ");
String originalFilePath = scanner.nextLine();
System.out.print("복사 파일 경로: ");
String targetFilePath = scanner.nextLine();
//원본 파일 존재 여부 확인
File originalFile = new File(originalFilePath);
if (!originalFile.exists()) {
System.out.println("원본 파일이 존재하지 않습니다.");
System.exit(0);
}
//복사 파일 경로상에 없는 모든 디렉토리 생성
File targetFile = new File(targetFilePath);
File parentFile = targetFile.getParentFile();
if (!parentFile.exists()) {
parentFile.mkdirs();
}
//입출력 스트림 얻기
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(originalFilePath));
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(targetFilePath));
//파일 데이터를 읽고 출력하기 byte[] data = new byte[1024]; int num = -1;
while (true) {
num = bis.read(data);
if (num ==-1)break;
bos.write(data, 0, num);
}
System.out.println("복사가 성공되었습니다.");
//입출력 스트림 닫기 bis.close(); bos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
아니 나만 답지 없으면 못푸나?