본문 바로가기

java

입출력 관련 API

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;
}
}
view raw Product 객체 hosted with ❤ by GitHub
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();
}
}
view raw 실행 hosted with ❤ by GitHub

결과:

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