
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FilterStreamTest {
public static void main(String[] args) {
method1();
method2();
}
private static void method1() {
try(FileReader reader = new FileReader("big_input.txt");
FileWriter writer = new FileWriter("big_input2.txt") ){
int c; // 문자 전달 바구니
long start = System.nanoTime();
while ((c = reader.read()) != -1) {
writer.write(c);
}
long end = System.nanoTime();
System.out.println("복사 끝 : " + (end-start) );
} catch (IOException e) {
}
}
private static void method2() {
// BufferedReader, BufferedWriter 사용
try(BufferedReader reader = new BufferedReader(new FileReader("big_input.txt"));
BufferedWriter writer = new BufferedWriter(new FileWriter("big_input2.txt")) ){
// BufferedReader는 주로 line 단위로 입력을 받는다.
// 크기를 벗어나도 제대로 읽힌다.
String line;
long start = System.nanoTime();
while((line = reader.readLine()) != null) {
writer.write(line);
writer.newLine(); // newLine을 항상 작성해줘야 한다.
}
long end = System.nanoTime();
System.out.println("복사 끝 : " + (end-start) );
} catch (IOException e) {
}
}
}
복사 끝 : 39238000
복사 끝 : 6641800
시간이 buffered를 사용하면 훨씬 단축되게 된다.
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;
import jdk.internal.org.jline.utils.InputStreamReader;
public class inputTest {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// System.in : 표준 입력
// InputStreamReader : byte로 받은 내용을 char 로 변경
// BufferedReader : 효율성을 위해 buffer 기능을 추가
int N = Integer.parseInt(br.readLine());
int[] nums = new int[N];
for (int i = 0; i< N; i++) {
nums[i] = Integer.parseInt(br.readLine());
}
System.out.println(Arrays.toString(nums));
// 파일을 통해 입력을 받으려면
// System.setIn(new FileInputStream("input.txt"));
// BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//
// BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("input.txt")));
// 스캐너를 통한 입력
}
}
BufferedReader와 Scanner의 비교
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
public class ScannerTest {
public static void main(String[] args) {
method1();
method2();
}
// BufferedReader 사용하는 경우
private static void method1() {
// BufferedReader, BufferedWriter 사용
try(BufferedReader reader = new BufferedReader(new FileReader("big_input.txt")) ){
// BufferedReader는 주로 line 단위로 입력을 받는다.
// 크기를 벗어나도 제대로 읽힌다.
String line;
long start = System.nanoTime();
while((line = reader.readLine()) != null) {
int num = Integer.parseInt(line);
}
long end = System.nanoTime();
System.out.println("BufferedReader 끝 : " + (end-start) );
} catch (IOException e) {
}
}
private static void method2() {
try(Scanner sc = new Scanner (new FileInputStream("big_input.txt")) ){
long start = System.nanoTime();
while(sc.hasNext()) {
int num = sc.nextInt();
}
long end = System.nanoTime();
System.out.println("Scanner 끝 : " + (end-start) );
} catch(IOException e) {
}
}
}
BufferedReader 끝 : 10419300
Scanner 끝 : 47386000
ObjectOutputStream : 객체를 바이트 스트림으로 변환 ObjectInputStream : 바이트 스트림을 객체로 복원import java.io.Serializable;
public class Person implements Serializable {
private String name;
private int age;
Person(){}
Person(String name, int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class SerializationTest {
public static void main(String[] args) {
Person p = new Person("luna", 5);
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("luna.dat"))){
oos.writeObject(p);
// person 에서 인터페이스 구현하지 않으면 오류가 뜬다.
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class SerializationTest1 {
public static void main(String[] args) {
try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream("luna.dat"))){
// 갖고 올 때는 object 만 가능
Object obj = ois.readObject();
System.out.println(obj); // Person [name=luna, age=5] : toString 이 나오게 된다.
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
// 다만 설계도 person을 수정한 후 역직렬화를 하면 오류가 된다.
// 과거의 직렬화를 역직렬화 하려면, 과거의 설계도가 필히 필요하다.
}
}
}
implements Serializable 작성하기 전

작성을 하고 난 후에는 아무 반응은 없지만, 지정한 파일이 보여진다.

serialVersionUID 를 별도로 정의할 것인지에 대해서 물어보게 된다.

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
public class SerializationTest2 {
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
list.add(new Person("daisy", 3));
list.add(new Person("max", 4));
try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("list.dat"))){
oos.writeObject(list);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream("list.dat"))){
Object obj = ois.readObject();
List<Person> list2 = (List<Person>) obj;
System.out.println(list2);
// 출력값 : [Person [name=daisy, age=3], Person [name=max, age=4]]
} catch (IOException | ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
list 로도 outputstream 을 사용할 수 있다.