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) {
      }
    }
  }
}

실습문제

  1. 메모장에 점수를 여러개 입력 후 저장. 그 파일을 읽어서 총 몇개인지 / 총합 / 평균을 구해보자.
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) {
      }
    }
  }
}
  1. 메모장에 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) {
      }
    }
  }
}

Categories:

Updated:

Comments