Java 10일차 : Util, IO
Util 패키지
- Calendar, Date, Random, StringTokenizer
- StringBuffer, SimpleDateFormat
import java.util.Calendar;
import java.util.Date;
import java.util.Random;
import java.util.StringTokenizer;
public class UtilEx1 {
public static void main(String[] args) {
//1. Calendar
Calendar cal = Calendar.getInstance();
int y = cal.get(Calendar.YEAR);
int m = cal.get(Calendar.MONTH)+1;
int d = cal.get(Calendar.DATE);
System.out.println(y + "년 " + m + "월 " + d + "");
//2. Date - deprecate 권장안함
Date date = new Date();
y = date.getYear() +1900;
m = date.getMonth()+1;
d = date.getDate();
System.out.println(y + "년 " + m + "월 " + d + "");
//3. Random -> Math.random()으로도 가능
Random r = new Random();
int rnd = r.nextInt(10);//0~9까지의 난수 발생
int rnd2 = r.nextInt(100) +1; //1~100
System.out.println(rnd + " " + rnd2);
//4. StringTokenizer : String클래스의 Split과 유사
String str="red,green,blue";
StringTokenizer st = new StringTokenizer(str, ",");
System.out.println(st.countTokens());
while(st.hasMoreTokens()) {
System.out.println(st.nextToken());
}System.out.println(st.countTokens()); //다 읽고나면 countTokens는 0이 된다.
str = "red,green,blue,pink,coral";
StringTokenizer st2 = new StringTokenizer(str, ",");
System.out.println(st2.countTokens());
int n = st2.countTokens(); //변하는 값이므로 미리 얻어놓자
for(int i = 0 ; i < n ; i++ ) {
System.out.println(st2.nextToken());
}
}
}
package test.day0416;
public class StringBufferEx2 {
public static void main(String[] args) {
//문자열에편집기능을 추가한 클래스
String s = "Happy";
StringBuffer sb1 = new StringBuffer();
StringBuffer sb2 = new StringBuffer(s); //String -> StringBuffer로 바로 변환
System.out.println(sb1.length() + " " + sb2.length());
sb1.append("12345");
sb1.append(67890);
System.out.println(sb1);
sb2.append(" nice");
System.out.println(sb2);
sb1.insert(2, "*****"); //2번째부터 *****이 들어감
sb2.insert(3, "banana");
System.out.println(sb1 + ", " + sb2);
//제거해보기
sb1.delete(2,7); //인덱스 2 부터 인덱스 6까지 삭제됨
sb2.delete(2,5);
System.out.println(sb1 + ", " + sb2);
//대치해보기
sb1.replace(3, 6, "***");//인덱스 3부터 5까지 제거되고 *** 가 들어감
System.out.println(sb1);
}
}
package test.day0416;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatEx3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm EEEE");//EEEE : full, EEE: short
System.out.println(new Date());
System.out.println(sdf.format(new Date()));
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd a hh:mm");//a : a.m. or p.m.
System.out.println(sdf2.format(new Date()));
}
}
package test.day0416;
import java.util.List;
import java.util.Vector;
class Fruit{
private String name;
Fruit(){
}
Fruit(String name){
this.name = name;
}
public void write() {
System.out.println("과일이름: " + name);
}
}
class Apple extends Fruit{
int price;
Apple(){
}
Apple(String name, int price){
super(name);
this.price = price;
}
@Override
public void write() {
// TODO Auto-generated method stub
super.write(); //super가 가진 name을 출
System.out.println("가격: " + price);
}
}
public class VectorEx4 {
public static void writeFruit(List<Fruit> list) { //오 이렇게 주는구나
System.out.println("writeFruit method ");
for(Fruit f:list)
f.write();
}
public static void writeApple(List<Apple> list) {
System.out.println("writeApple method");
for(Apple a:list)
a.write();
}
//메서드로 List타입을 인자로 받을때 제네릭스로 모든 클래스타입을 허용하고 싶으면 와일드카드 ? 를 쓰면 된다.
public static void write(List<?> list) {
for(Object ob:list) {
if(ob instanceof Apple) //맞으면 true 반환
((Apple)ob).write(); //강제 형변환
else if(ob instanceof Fruit)
((Fruit)ob).write(); //강제 형변환
}
}
//특정 클래스의 상속자만 받고싶은 경우
public static void write2(List<? extends Fruit> list) {
for(Fruit ob:list)
ob.write();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Apple> list1 = new Vector<Apple>();
List<Fruit> list2 = new Vector<Fruit>();
list1.add(new Apple("apple", 1200));
list1.add(new Apple("orange", 5000));
list1.add(new Apple("kiwi", 2000));
list2.add(new Fruit("사과"));
list2.add(new Fruit("오렌지"));
list2.add(new Fruit("키위"));
writeFruit(list2);
System.out.println();
writeApple(list1);
//와일드 카드를 이용해 출력해보기
System.out.println();
write(list1);
write(list2);
//특정 클래스의 상속자만 받고싶을 경우
write2(list1);
write2(list2);
}
}
package test.day0416;
import java.util.List;
import java.util.Vector;
class Fruit{
private String name;
Fruit(){
}
Fruit(String name){
this.name = name;
}
public void write() {
System.out.println("과일이름: " + name);
}
}
class Apple extends Fruit{
int price;
Apple(){
}
Apple(String name, int price){
super(name);
this.price = price;
}
@Override
public void write() {
// TODO Auto-generated method stub
super.write(); //super가 가진 name을 출
System.out.println("가격: " + price);
}
}
public class VectorEx4 {
public static void writeFruit(List<Fruit> list) { //오 이렇게 주는구나
System.out.println("writeFruit method ");
for(Fruit f:list)
f.write();
}
public static void writeApple(List<Apple> list) {
System.out.println("writeApple method");
for(Apple a:list)
a.write();
}
//메서드로 List타입을 인자로 받을때 제네릭스로 모든 클래스타입을 허용하고 싶으면 와일드카드 ? 를 쓰면 된다.
public static void write(List<?> list) {
for(Object ob:list) {
if(ob instanceof Apple) //맞으면 true 반환
((Apple)ob).write(); //강제 형변환
else if(ob instanceof Fruit)
((Fruit)ob).write(); //강제 형변환
}
}
//특정 클래스의 상속자만 받고싶은 경우
public static void write2(List<? extends Fruit> list) {
for(Fruit ob:list)
ob.write();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Apple> list1 = new Vector<Apple>();
List<Fruit> list2 = new Vector<Fruit>();
list1.add(new Apple("apple", 1200));
list1.add(new Apple("orange", 5000));
list1.add(new Apple("kiwi", 2000));
list2.add(new Fruit("사과"));
list2.add(new Fruit("오렌지"));
list2.add(new Fruit("키위"));
writeFruit(list2);
System.out.println();
writeApple(list1);
//와일드 카드를 이용해 출력해보기
System.out.println();
write(list1);
write(list2);
//특정 클래스의 상속자만 받고싶을 경우
write2(list1);
write2(list2);
}
}
실습문제
클래스명 Stu 클래스 구현(파일 따로 만드세요)
- name 이름, age 나이, blood 혈액형(접근지정자는 모두 private)
- 디폴트 생성자, 3개의 인자를 갖는 생성자
- setter & getter method 구현하기
클래스명 : VectorEx6
- Vector 생성후 생성자를 통해 미리 5개의 stu 데이타를 넣어둔다
실행시
1.추가 2. 삭제 3, 전체출력 4.종료
1 선택시 : 이름,나이,혈액형을 입력받아 벡터에추가하기
2 선택시 : 이름을 검색해서 같은 이름의 데이타 삭제하기
3 선택시 : 벡터의 전체 데이타 출력하기
4 선택시 시스템종료
출력하는 메소드는 writeStu 메소드를 static 으로 만든후 호출하여 출력하기
package test.day0416;
import java.util.Scanner;
import java.util.Vector;
public class VectorEx6 {
public static void stuAdd(Vector<Stu> stu, String name, int age, String blood) {
stu.add(new Stu(name, age, blood));
System.out.println("추가되었습니다.");
}
public static void stuDelete(Vector<Stu> stu, String name) {
int i = 0 ;
int delIndex = 0;
boolean isExist = false;
for(Stu s:stu) {
if(name.equals(s.getName())) {
delIndex = i;
isExist = true;
}
i++;
}
if(isExist) {
stu.remove(delIndex);
System.out.println(name + "이(가) 삭제되었습니다.");
}else {
System.out.println("해당 이름이 존재하지 않습니다.");
}
}
public static void stuList(Vector<Stu> stu) {
System.out.println("이름\t나이 \t혈액형");
System.out.println("=====================");
for(Stu s:stu) {
System.out.println(s.getName() + "\t" + s.getAge() + "\t" + s.getBlood());
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Vector<Stu> stu = new Vector<Stu>();
Scanner sc = new Scanner(System.in);
int menu;
stu.add(new Stu("alice", 17, "A"));
stu.add(new Stu("bob", 55, "B"));
stu.add(new Stu("chris", 24, "AB"));
stu.add(new Stu("david", 87, "O"));
stu.add(new Stu("eva", 4, "AB"));
while(true) {
System.out.println("-------------메뉴-------------");
System.out.println("1.추가\t2.삭제\t3.출력\t4.종료");
menu = sc.nextInt();
switch(menu) {
case 1:
{
sc.nextLine();
System.out.println("이름을 입력하세요.");
String name = sc.nextLine();
System.out.println("나이를 입력하세요.");
int age = sc.nextInt();
sc.nextLine();
System.out.println("혈액형을 입력하세요.");
String blood = sc.nextLine();
stuAdd(stu, name, age, blood);
}
break;
case 2:
sc.nextLine();
System.out.println("삭제할 데이타의 이름을 입력하세요.");
String name = sc.nextLine();
stuDelete(stu, name);
break;
case 3:
stuList(stu);
break;
case 4:
System.out.println("종료합니다.");
System.exit(0);
}
}
}
}
I/O 입출력 클래스
-
~~Stream : byte단위의 입력 클래스들
-
- InputStream
-
~~Reader : char단위의 입력 클래스들
-
- InputStreamReader
- BufferedReader
- FileReader
package test.day0416;
import java.io.IOException;
import java.io.InputStream;
public class StreamEx8 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
InputStream is = System.in;
System.out.println("한글자 입력하기.");
//바이트 단위라서 한글입력시 깨짐(한글은 2바이트임)
int data = is.read();
System.out.println((char)data);
}
}
BufferedReader 에만 줄단위로 읽을수있는 readLine() 이 있다. 단, 생성자가 Reader 타입만 인자로 넣을수 있다
키보드로 데이타를 읽으려면(혹은 네트워크로 데이타를 읽을 경우)
BufferedReader br = null;
InputStreamReader is = null;
InputStreamReader 먼저 생성 후 그 변수를 BufferedReader의 생성자로 보내서 BufferedReader를 생성함.
예시
package test.day0416;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class ReaderEx9 {
public static void main(String[] args) {
// TODO Auto-generated method stub
BufferedReader br = null;
InputStreamReader ir = null;
ir = new InputStreamReader(System.in); // Reader타입을 반환
br = new BufferedReader(ir); //Reader타입으로 변환후 생성
String str="";
System.out.println("문자열을 입력하세요.");
try {
str = br.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try{
br.close();
ir.close();
}catch(IOException e){
}
}
System.out.println(str);
}
}
걍 한줄로 짧게 쓸라믄 요로케
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
파일에서읽으려면
- FileReader를 먼저 생성 후 BufferedReader생성자로 넣어서 생성함
package test.day0416;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException e;
public class FileReaderEx10 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//경로줄땐 /혹은 \\
String filePath = "/Users/jenny/Desktop/Acorn/work/AcornJavaProject/src/test/day0416/UtilEx1.java";
BufferedReader br =null;
FileReader fr = null;
try {
fr = new FileReader(filePath);
System.out.println("파일을 찾았어요.");
//br생성
br = new BufferedReader(fr);
int i = 0;
while(true) {
//파일에서 한줄씩 읽는다.
String line = br.readLine();
//문서의 끝으로 가면 null값을 반환한다.
if(line == null)
break;
//파일에서 읽은 한줄을 출력한다.
System.out.println(i + " " + line);
i++;
}
} catch (FileNotFoundException e) {
System.out.println("파일을 찾을 수 없어요." + e.getMessage());
} catch (IOException e ) {
System.out.println("입력 오류 ");
}finally {
try {
br.close(); //조립은 해체의 반대이다.
fr.close();
}catch(IOException e) {
}
}
}
}
실습문제
- 메모장에 점수를 여러개 입력 후 저장. 그 파일을 읽어서 총 몇개인지 / 총합 / 평균을 구해보자.
package test.day0416;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderEx11 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String filePath = "/Users/jenny/Desktop/Acorn/work/score.txt";
int cnt = 0;
int sum = 0;
double avg = 0;
FileReader fr = null;
BufferedReader br = null;
try {
fr = new FileReader(filePath);
br = new BufferedReader(fr);
while(true) {
String line = br.readLine();
if(line == null)
break;
cnt++;
sum += Integer.parseInt(line);
}
avg = (double)sum/cnt;
System.out.println("cnt: " + cnt + " , sum: " + sum + " , avg: " + avg);
} catch (FileNotFoundException e) {
System.out.println("파일을 찾을 수 없습니다." + e.getMessage());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
br.close(); //조립은 해체의 반대이다.
fr.close();
}catch(IOException e) {
}
}
}
}
- 메모장에 d:/it0312/sinsang.txt로 저장
캔디,17,서울강서구
안소니,20,부산
테리우스,21,제주도
스테아,34,미국
파일에서 위의 데이타를 읽어서 반복 출력하는 프로그램을 작성하시오
package test.day0416;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class TestEx12 {
public static void main(String[] args) {
String filePath = "/Users/jenny/Desktop/Acorn/work/sinsang.txt";
String name ="";
String age ="";
String addr ="";
FileReader fr = null;
BufferedReader br = null;
try {
fr = new FileReader(filePath);
br = new BufferedReader(fr);
while(true) {
String line = br.readLine();
if(line == null)
break;
StringTokenizer st = new StringTokenizer(line, ",");
while(st.hasMoreTokens()) {
name = st.nextToken();
age = st.nextToken();
addr = st.nextToken();
}
System.out.println("이름: " + name + ", 나이: " + age + ", 사는곳: " + addr);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
br.close(); //조립은 해체의 반대이다.
fr.close();
}catch(IOException e) {
}
}
}
}
Comments