BufferedStream
1byte기반 스트림
필터 스트림
기능 : 데이터들을 메모리 버퍼에 차곡차곡 모아서 한거번에 읽어들이고, 내보냄
키보드로 입력받은 내용을 콘솔에 내보내보자
데이터소스 : 키보드 (System.in) ==> BufferedInputStream
데이터 목적지1: 콘솔(System.out) ==> BufferedOutpuStream
데이터 목적지2: 파일(result.txt:/ FileOutputStream) ===> BufferedOutputStream
package io.day02;
import java.io.*;
public class BIStream {
public static void main(String[] args) throws IOException {
String file = "result2.txt";
BufferedInputStream bis = new BufferedInputStream(System.in);
BufferedOutputStream bos = new BufferedOutputStream(System.out);
BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream("result.txt",true));
int n=0, count=0;
while((n=bis.read())!=-1) {
bos.write(n);
bos.flush();//버퍼 또는 스트림에 남아있는 데이터를 밀어내기 해줌
fos.write(n);
fos.flush();
}
bos.close();
bis.close();
fos.close();
}
}
ObjectStream
객체를 파일로 저장하고, 저장된 파일을 객체로 다시 복원해보자.
ObjectOutputStream/ ObjectInputStream
- 1byte기반 스트림
직렬화하는 방법. java.io.Serializable 인터페이스를 상속받도록 한다.
Serializable 인터페이스에는 특별한 추상메소는 없으며, 단순히 직렬화 가능한 데이터라고 표시하는 기능을 하는 인터페이스이다.
transient를 사용하면 데이터를 숨길 수 있다.
package io.day02;
import java.io.Serializable;
public class Employee implements Serializable{
private String name;
transient private int salary;
private String job;
public Employee() {
}
public Employee(String name, int salary, String job) {
super();
this.name=name;
this.salary=salary;
this.job=job;
}
public void print() {
System.out.println("---record for"+name+"---");
System.out.printf("Name: %s\n",name);
System.out.println(salary);
System.out.println(job);
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
package io.day02;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import javax.swing.JButton;
import javax.swing.JFrame;
public class SaveEmployee{
public static void main(String[] args) throws IOException
{
Employee e1 = new Employee("King",5000,"President");
Employee e2 = new Employee("Scott",4000,"Manager");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.txt"));;
oos.writeObject(e1);
oos.writeObject(e2);
JFrame f = new JFrame("스트림테스트");
f.getContentPane().add(new JButton("OK"));
oos.writeObject(f);
oos.writeUTF("Hi");
java.util.Date today = new java.util.Date();
oos.writeObject(today);
System.out.println("obj.txt파일에 쓰기 완료!!");
oos.flush();
oos.close();
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
package io.day02;
import java.io.*;
import javax.swing.JFrame;
public class ReadEmployee {
public static void main(String[] args) throws IOException, ClassNotFoundException{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.txt"));
Object o1 = ois.readObject();
Employee e1= (Employee)o1;
Employee e2= (Employee)ois.readObject();
e1.print();
e2.print();
JFrame f=(JFrame)ois.readObject();
f.pack();
f.setVisible(true);
String str=ois.readUTF();
System.out.println(str);
}
}
FileReader
- 2byte기반 스트림
- 파일과 노드 연결을 하는 스트림
2byte단위로 읽은 것을 1byte단위로 쓰면 한글이 깨진다.
파일을 읽어서 콘솔에 출력하기
src/io/day02/Employee.java
FileWriter
write(byte[] data)
write(int data)
write(char[] data)
write(String str)
package io.day02;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import javax.swing.JOptionPane;
public class FileReaderTest {
public static void main(String[] args)
throws IOException
{
String file = JOptionPane.showInputDialog("읽을 파일명을 입력하세요");
if(file==null) return;
FileReader fr = new FileReader(file);
OutputStreamWriter ow = new OutputStreamWriter(System.out);
int n=0;
while((n=fr.read())!=-1) {
ow.write(n);
ow.flush();
}
ow.close();
fr.close();
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
package io.day02;
import java.io.*;
public class FileWriterTest {
public static void main(String[] args) throws IOException{
FileWriter fw = new FileWriter("data2.txt");
for(int i=1;i<11;i++) {
fw.write("줄번호: "+i+"\n");
fw.flush();
}
fw.close();
}
}
FileReader, FileCopy를 이용해서 데이터를 copy할 수 있다.
하지만 2byte이기 때문에 char 배열을 사용해야한다.
package io.day02;
//Employee.java파일을 카피하여 Employee_copy.txt파일로 내보내세요
import java.io.*;
public class FileCopy {
public static void main(String[] args) throws IOException{
String file="src/io/day02/Employee.java";
String file2="src/io/day02/Employee_copy.txt";
FileReader fr = new FileReader(file);
FileWriter fw = new FileWriter(file2);
// int n=0;
// while((n=fr.read())!=-1) {
// fw.write(n);
// }
// fw.close();
// fr.close();
// System.out.println("파일 카피 완료");
int n=0;
char buf[] = new char[1000];
while((n=fr.read(buf))!=-1) {
fw.write(buf,0,n);
fw.flush();
}
fw.close();
fr.close();
System.out.println("파일 카피 완료2");
}
}
File
파일에 대한 정보를 알아내거나, 새로운 파일 or 디렉토리 생성, 수정, 삭제시 사용
package io.day02;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
public class FileTest {
public static void main(String[] args) {
File f1 = new File("src/io/day02/Employee.java");
long fsize = f1.length();
System.out.println("파일 크기: "+fsize+"bytes");
System.out.println("파일 크기: "+f1.getName());
System.out.println("파일 절대경로: "+f1.getAbsolutePath());
System.out.println("파일 상대경로: "+f1.getPath());
System.out.println("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ");
File f2 = new File("sample");
boolean b = f2.exists();
//파일 or 디렉토리가 존재하면 true ,아니면 false를 반환
System.out.println("sample 디렉토리 존재 여부 "+b);
if(!b) {
//advance에 sample이 만들어짐
boolean c = f2.mkdir();
System.out.println("Directory 생성여부 "+c);
}
File f3 = new File("example","day01");
//위 디렉토리 생성
//example이 상위 day01이 하위 mkdirs()를 사용해야한다.
f3.mkdirs();
//디렉토리명 수정
//파일 또는 dir 이름 변경
f3.renameTo(new File("example","day02"));
//디렉토리 삭제
boolean d = f2.delete();
System.out.println("삭제 여부 "+ d);
//String[] list() : 특정 디렉토리의 파일 목록을 String 배열로 반환함
//File[] listFiles() : 특정 디렉토리의 파일목록을 File 배열로 반환함
/*1 c:/myjava 디렉토리에 있는 파일 도는 디렉토리 목록을 가져와 출력
*
*2 c:/myjava 디렉토리에 있는 파일 또는 디렉토리 목록을 가져와 출력하되
* 해당 파일명과 파일크기 파일의 마지막 수정일을 함께 출력
* */
File ff = new File("c:/myjava");
String [] fl = ff.list();
for(int i=0;i<fl.length;i++) {
System.out.println(fl[i]);
}
File [] fl2 = ff.listFiles();
for(int i=0;i<fl2.length;i++) {
System.out.println(fl2[i].getAbsolutePath());
System.out.println(fl2[i].getName());
System.out.println(fl2[i].length());
long s =fl2[i].lastModified();
Date ls = new Date(s);
SimpleDateFormat sdf
=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String time2 = sdf.format(ls);
System.out.println(time2);
}
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
JS배열
for문, for in 문, forEach함수
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>배열</h1>
<script>
//배열 선언, 생성, 초기화
//1 리터럴을 이용한 배열 생성, 초기화
var arr=[10,20,30];
//2
var arr2=new Array(3);
arr2[0]="Hello";
arr2[1]="JavaScript";
arr2[2]="!!";
//3
var arr3=new Array(90,88,92,100);
function print(val){
document.write("<h3>"+val+"</h3>");
}
//arr for 문으로 출력
for(var i=0;i<3;i++){
print(arr[i]);
}
//arr2에 저장된 값을 for in 루프를 이용해 출력
for(var a in arr2){
print(arr2[a]);
}
//arr3에 저장된 값을 forEach함수를 이용해 출력
//forEach(함수(요소, 인덱스))
print("<hr color='red'")
arr3.forEach(function(val, i){
//배열에 저장된 요소 ==> val에 들어감
//배열의 인덱스는 ==> i에 담김
print(val+"=>"+i);
})
</script>
</body>
</html>
배열의 함수
join, push, pop, unshift, shift, concat splice, slice
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>배열의 함수</h1>
<script>
function print(val){
document.write(val);
}
var fruits = ["바나나","사과","Grape","Kiwi"];
//http://www.w3schools.com
//1 join(연결문자) : 배열 요소에 연결문자를 붙여 한 개의 문장열로
// 만들어 반환한다.
var str=fruits.join("@");
print(str+"<br>");
//2 push(새 요소) : 배열의 마지막에 새로운 요소를 추가한다.
//3 pop(): 배열의 마지막 요소를 삭제하고 삭제한 요소를 반환한다.
fruits.push("수박");
print(fruits+"<br>");
var x=fruits.pop();
print(x+"<br>");
//4 unshift() : 배열의 맨 앞에 새로운 요소를 추가
//5 shift() : 배열의 맨 앞에 요소를 제거
fruits.unshift("Lemon");
print(fruits+"<br>");
fruits.shift();
print(fruits+"<br>");
//6 concat() : 배열 여러개를 합쳐서 하나의 배열을 만들어 반환
var drinks=["콜라","포도주스"];
var z= fruits.concat(drinks);
print(z+"<br>");
//7 splice(start, count, [,새로추가할 요소]) : start 위치에서 count수만큼 삭제 새로운 요소를 그 위치에 삽입
z.splice(4,1,"사이다");
print(z+"<br>");
//8 slice(start, end) : start부터 end 까지 잘라내어 새로운 배열을 만듦
//원본은 그대로
q=z.slice(0,3);
print(q);
</script>
</body>
</html>
sort, reverse
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>배열 정렬(sort(), reverse())</h1>
<script>
var arr= ["Banana","Orange","Apple","Mango"];
function print(val){
document.write(val+"<br>");
}
print(arr);
print("<hr color='gray'>")
//알파벳 오름차순 정렬
arr.sort();
print(arr);
print("<hr color='skyblue'>")
//알파벳 내림차순 정렬
arr.reverse();
print(arr);
var score = [45,75,23,88,100,92];
//배열 요소를 문자열로 간주하여 오름차순 정렬을 함
print(score);
//내림차순 정렬
score.sort(function(a,b){return b-a});
print(score);
//오름차순 정렬
score.sort(function(a,b){return a-b});
print(score);
</script>
</body>
</html>
객체 정렬
반환값에 따라 정렬을 한다. 양수를 반환하면 서로의 위치를 바꿔주고 0이나 음수면 그대로 둔다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>배열의 정렬</h1>
<script>
//1. 자바스크립트 객체1
var student = new Object();
student.name="홍길동";
student.score=95;
student.info = function(){
var str="이름: "+this.name;
str+=", 점수: "+this.score+"<br>";
return str;
}
document.write(student.info());
//2. 자바스크립트 객체2
var student2={
name:'김학생',
score: 88,
info: function(){
var str="이름: "+this.name;
str+=", 점수: "+this.score;
return str;
}
};
document.write(student2.info());
</script>
<hr color='red'>
<script>
var persons=[
{name:'김사랑',age:22},
{name:'최사랑',age:27},
{name:'오사랑',age:39},
{name:'홍사랑',age:45},
{name:'성사랑',age:20}
];
//문제1 persons 배열에 저장된 요소들의 정보를 출력
function print(arr){
arr.forEach(function(obj,i){
document.write("이름 : "+obj.name+", 나이"+obj.age+"<br>");
});
}
print(persons);
document.write("<hr color='red'>");
//문제2 persons를 이름 가나다 순으로 정렬해 출력
persons.sort(function(a, b){
var x = a.name.toLowerCase();
var y = b.name.toLowerCase();
if (x < y) {return -1;}
if (x > y) {return 1;}
return 0;
});
print(persons);
document.write("<hr color='red'>");
//문제3 persons를 나이가 가장 많은 사람 순으로 출력
persons.sort(function(a,b){return b.age-a.age});
print(persons);
document.write("<hr color='red'>");
</script>
</body>
</html>