System.in은 InputStream 타입이고 System.out은 PrintStream 타입입니다.
콘솔은 시스템을 사용하기 위해 키보드로 입력을 받고 모니터로 출력하는 소프트웨어를 말합니다.
1. System.in 필드
자바는 콘솔에서 키보드의 데이터를 입력받을 수 있도록 System 클래스의 in 정적 필드를 제공합니다. System.in은 InputStream 타입의 필드이므로 다음과 같이 InputStream 변수로 참조가 가능합니다.
InputStream is - System.in;
키보드로부터 어떤 키가 입력되었는지 확인하려면 InputStream의 read() 메소드로 1byte를 읽으면 됩니다. 리턴된 int 값에는 해당 키의 코드가 저장되어 있습니다.
int keyCode = is.read();
키보드로부터 라인 단위 문자열 얻기
| package sec06.exam06; | |
| import java.io.*; | |
| public class Hello { | |
| public static void main(String[] args) throws Exception { | |
| InputStream is = System.in; | |
| Reader reader = new InputStreamReader(is); | |
| BufferedReader br = new BufferedReader(reader); | |
| while(true) { | |
| System.out.print("입력하세요: "); | |
| String lineStr = br.readLine(); //라인 단위로 문자열 읽 | |
| if(lineStr.equals("q") | lineStr.equals("quit")) break; | |
| System.out.print("입력된 내용:" + lineStr); | |
| System.out.println(); | |
| } | |
| br.close(); | |
| } | |
| } |
결과:
입력하세요: System.in에
입력된 내용:System.in에
입력하세요: 보조 스트림을 연결해서
입력된 내용:보조 스트림을 연결해서
입력하세요: 편리하게 라인 단위로 입력 받을 수 있습니다.
입력된 내용:편리하게 라인 단위로 입력 받을 수 있습니다.
입력하세요: q
2. Scanner 클래스
Scanner 클래스는 입출력 스트림도 아니고, 보조 스트림도 아닙니다. Scanner는 문자 파일이나 바이트 기반 입력 스트림에서 라인 단위 문자열을 쉽게 읽도록 하기 위해 java.util 패키지에서 제공하는 클래스입니다. System.in에서 살펴보았듯이 라인 단위로 읽기 위해 여러 가지 보조 스트림을 연결하는 작업이 필요했습니다. 하지만 Scanner는 이러한 보조 스트림 없이 매우 쉽게 라인 단위 문자열을 읽기 위해 nextLine() 메소드를 제공합니다.
Scanner scanner = new Scanner(System.in); // 바이트 기반 입력 스트림으로부터 Scanner 생성
String inputData = scanner.nextLine(); // enter 이전까지 입력된 행단위 문자열을 읽음
예제
| public class Product { | |
| private int pno; | |
| private String name; | |
| private String price; | |
| private String stock; | |
| public int getPno() { | |
| return pno; | |
| } | |
| public void setPno(int pno) { | |
| this.pno = pno; | |
| } | |
| public String getName() { | |
| return name; | |
| } | |
| public void setName(String name) { | |
| this.name = name; | |
| } | |
| public String getPrice() { | |
| return price; | |
| } | |
| public void setPrice(String price) { | |
| this.price = price; | |
| } | |
| public String getStock() { | |
| return stock; | |
| } | |
| public void setStock(String stock) { | |
| this.stock = stock; | |
| } | |
| } |
| package sec06.exam06; | |
| import java.util.*; | |
| public class ProductStorage { | |
| private List<Product> list = new ArrayList<>(); | |
| private Scanner scanner = new Scanner(System.in); | |
| private int counter; | |
| public void showMenu() { | |
| while(true) { | |
| System.out.println("--------------------------"); | |
| System.out.println("1. 등록 | 2. 목록 | 3. 종료"); | |
| System.out.println("--------------------------"); | |
| System.out.print("선택: "); | |
| String selectNo = scanner.nextLine(); | |
| switch(selectNo) { | |
| case "1": registerProduct(); break; | |
| case "2": showProduct(); break; | |
| case "3": return; | |
| } | |
| } | |
| } | |
| public void registerProduct() { | |
| try { | |
| Product product = new Product(); | |
| product.setPno(++counter); | |
| System.out.print("상품명: "); | |
| product.setName("상품명: " + scanner.nextLine()); | |
| System.out.print("가격: "); | |
| product.setPrice("가격: " + scanner.nextLine()); | |
| System.out.print("재고: "); | |
| product.setStock("재고: " + scanner.nextLine()); | |
| list.add(product); | |
| } catch(Exception e) { | |
| System.out.println("등록 에러: " + e.getMessage()); | |
| } | |
| } | |
| public void showProduct() { | |
| for(Product p : list) { | |
| System.out.println(p.getPno() + "\t" + p.getName() + "\t" | |
| + p.getPrice() + "\t" + p.getStock()); | |
| } | |
| } | |
| } |
| package sec06.exam06; | |
| public class Hello { | |
| public static void main(String[] args) throws Exception { | |
| ProductStorage ps = new ProductStorage(); | |
| ps.showMenu(); | |
| } | |
| } |
결과:
1. 등록 | 2. 목록 | 3. 종료
--------------------------
선택: 1
상품명: 마우스
가격: 10000
재고: 5
--------------------------
1. 등록 | 2. 목록 | 3. 종료
--------------------------
선택: 1
상품명: 키보드
가격: 130000
재고: 8
--------------------------
1. 등록 | 2. 목록 | 3. 종료
--------------------------
선택: 2
1 상품명: 마우스 가격: 10000 재고: 5
2 상품명: 키보드 가격: 130000 재고: 8
--------------------------
1. 등록 | 2. 목록 | 3. 종료
--------------------------
선택: 3
3. File 클래스
java.io 패키지에서 제공하는 File 클래스는 파일 및 폴더 정보를 제공해주는 역할을 합니다.
File file = new File("파일 경로");
경로 구분자는 유닉스, 리눅스에서는 \를 사용하고 윈도우에서는 \, / 모두 사용합니다.
파일 객체를 생성했다고 해서 파일이나 폴더가 생성되는 것은 아닙니다. 그리고 제공되는 문자열 경로에 실제 파일이나 폴더가 없더라도 예외가 발생하지 않습니다. 해당 경로에 실제로 파일이나 폴더가 있는지 알고 싶다면 File 객체를 생성한 후 exists() 메소드를 호출하면 됩니다.
boolean isExist = file.exists();
리턴 값이 false라면 다음 메소드로 파일 또는 폴더를 생성할 수 있습니다.
| 리턴 타입 | 메소드 | 설명 |
| bool | createNewFile() | 새로운 파일을 생성 |
| bool | mkdir() - makedirectory | 새로운 폴더를 생성 |
| bool | mkdirs() | 경로상에 없는 모든 폴더를 생성 |
exists() 메소드의 리턴값이 true라면 다음 메소드를 사용할 수 있습니다.
| 리턴 타입 | 메소드 | 설명 |
| bool | delete() | 파일 또는 폴더 삭제 |
| bool | canExecute() | 실행할 수 있는 파일인지 여부 확인 |
| bool | canRead() | 읽을 수 있는 파일인지 여부 확인 |
| bool | canWrite() | 수정 및 저장할 수 있는 파일이지 여부 확인 |
| String | getName() | 파일의 이름을 리턴 |
| String | getParent() | 부모 폴더 리턴 |
| File | getParentFile() | 부모폴더를 File 객체로 생성 후 리턴 |
| String | getPath() | 전체 경로를 리턴 |
| bool | isDirectory() | 폴더인지 여부 확인 |
| bool | isFile() | 파일인지 여부 확인 |
| bool | isHidden() | 숨김 파일인지 여부 확인 |
| long | lastModified() | 마지막 수정 날짜 및 시간 리턴 |
| long | length() | 파일의 크기 리턴 |
| String[] | list() | 폴더에 포함된 파일 및 서브 폴더 목록 전부를 String 배열로 리턴 |
| String[] | list(FilenameFilter filter) | 폴더에 포함된 파일 및 서브 폴더 목록 중에 FilenameFilter에 맞는 것만 String 배열로 리턴 |
| File[] | listFiles() | 폴더에 포함된 파일 및 서브 폴더 목록 전부를 File 배열로 리턴 |
| File[] | listFiles(FilenameFilter filter) | 폴더에 포함된 파일 및 서브 폴더 목록 중에 FilenameFilter에 맞는 것만 File 배열로 리턴 |
다음은 temp 폴더에 images 폴더와 파일 1,2,3을 생성하고 temp 폴더에 있는 파일 목록을 출력하는 예제입니다.
| package sec06.exam06; | |
| import java.io.File; | |
| import java.text.SimpleDateFormat; | |
| public class Hello { | |
| public static void main(String[] args) throws Exception { | |
| File dir = new File("temp/images"); //파일 객체 생성 | |
| File file1 = new File("temp/file1.txt"); | |
| File file2 = new File("temp/file2.txt"); | |
| File file3 = new File("temp/file3.txt"); | |
| if(dir.exists() == false) {dir.mkdirs(); } // 경로 상에 없는 모든 폴더 생성 | |
| if(file1.exists() == false) { file1.createNewFile(); } //파일이 존재하지 않으면 생성 | |
| if(file2.exists() == false) { file2.createNewFile(); } | |
| if(file3.exists() == false) { file3.createNewFile(); } | |
| File temp = new File("temp"); //temp 폴더의 내용 목록을 File 배열로 얻음 | |
| File[] contents = temp.listFiles(); | |
| System.out.println("최종 수정 시간\t\t형태\t\t크기\t이름"); | |
| System.out.println("-----------------------------------------------------------"); | |
| SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd a HH:mm"); | |
| for(File file : contents) { | |
| System.out.print(sdf.format(file.lastModified())); | |
| if(file.isDirectory()) { | |
| System.out.print("\t<DIR>\t\t\t" + file.getName()); | |
| } else { | |
| System.out.print("\t\t\t" + file.length() + "\t" + file.getName()); | |
| } | |
| System.out.println(); | |
| } | |
| } | |
| } |
결과:
최종 수정 시간 형태 크기 이름
-----------------------------------------------------------
2021-02-01 오후 15:17 0 file2.txt
2021-02-01 오후 15:17 0 file3.txt
2021-02-01 오후 15:20 31 file1.txt
2021-02-01 오후 15:17 <DIR> images
* 파일 또는 폴더의 정보를 얻기 위해 File 객체를 단독으로 사용할 수 있지만, 파일 입출력 스트림 객체를 생성할 때 경로 정보를 제공할 목적으로도 사용합니다.
//첫번째 방법
File file = new File("temp/images/file1");
FileInputStream fis = new FileInputStream(file);
'java' 카테고리의 다른 글
| 보조 스트림 (0) | 2021.02.01 |
|---|---|
| java 입출력 스트림 (0) | 2021.01.30 |
| java 스택, 큐 (0) | 2021.01.30 |
| java 컬렉션 프레임워크 (0) | 2021.01.29 |
| 스레드 제어 (0) | 2021.01.29 |