19일차 입출력!
(버퍼는 임시메모리 공간)
문자 기반 스트림
최상위 클래스 입력 스트림 Reader
-문자 기반 입력 스트림의 최상위 클래스로 추상 클래스
----------------------------파일읽어서 문자로 반환 ----------------------------
public static void main(String[] args) throws Exception {
@Cleanup
Reader reader = new FileReader("C:/Temp/test.txt");
int readData;
while(true) {
readData = reader.read();
if(readData == -1) {
break;
}//if
System.out.println((char) readData);
}//while
}//main
-------------------------------배열에 담아서 반환 및 cleanup에 대해----------------------
package thisjava;
import java.io.FileReader;
import java.io.Reader;
import lombok.Cleanup;
public class ReadExample2 {
public static void main(String[] args) throws Exception {
// @Cleanup Resource1 res1 = new Resource1();
// @Cleanup Resource2 res2 = new Resource2(); // 이게 먼저 닫힘
//
// @Cleanup("shutdown") Resource1 res3 = new Resource1(); // 다른메소드로 지정
// @Cleanup("shutdown") Resource2 res4 = new Resource2(); // 이게 먼저 닫힘
@Cleanup
Reader reader = new FileReader("C:/Temp/test.txt");
int readCharNo;
char[] cbuf = new char[20];
while(true) {
readCharNo = reader.read(cbuf);
if(readCharNo == -1) {
break;
}//if
System.out.println(new String(cbuf, 0, readCharNo));
}//while
}//main
}// end class
//----------------그냥 read와 무관한 close 실험 예제 ---------------------------
class Resource1 implements AutoCloseable{
@Override
public void close() throws Exception {
// TODO Auto-generated method stub
System.out.println("Resource1::close() invoked");
}//close
public void shutdown() throws Exception{
System.out.println("Resource1::close() invoked");
}//shutdown
}//class
class Resource2 implements AutoCloseable{
@Override
public void close() throws Exception {
// TODO Auto-generated method stub
System.out.println("Resource2::close() invoked");
}//close
public void shutdown() throws Exception{
System.out.println("Resource2::close() invoked");
}//shutdown
}//class
------------------------------------배열에 담을 때 제한주기 --------------------------
public static void main(String[] args) throws Exception {
@Cleanup
Reader reader = new FileReader("C:/Temp/test.txt");
char[] cbuf = new char[4];
reader.read(cbuf, 1, 2);
System.out.println(Arrays.toString(cbuf));
//available(); 문자기반에서는 제공되지 않는 파일사이즈를 알려주는 메소드
}//main
최상위 클래스 출력 스트림 Writer
-문자 기반 출력 스트림의 최상위 클래스로 추상 클래스
-----------------------------하나씩 출력하기-------------------------
public class WriterExample1 {
public static void main(String[] args) throws Exception {
// Reader/Writer 이든, 객체를 생성하는 싯점에 , 지정된 경로의 파일을 open(연결)
//OutputStream/Writer 모두, 두번째 생성자 매개변수(append)를 true로 지정하지 않으면
// 파일의 내용을 싹~ 지워버린다.
@Cleanup
Writer writer =new FileWriter("C:/Temp/test.txt", true);
char[] data = "홍길동".toCharArray();
for(int i=0; i<data.length; i++) {
writer.write(data[i]); // 메모리에 있는 출력버퍼(8k)에 고속쓰기
}// for
for(char output:data) {
writer.write(output);
}// 향상된 for문
writer.flush();
}// main
----------------------뭉탱이로 출력 및 try with finally 블럭의 제한성 설명 -----------------------------
public class WriterExample2 {
public static void main(String[] args) throws Exception {
Writer writer =new FileWriter("C:/Temp/test.txt");
try(writer){
char[] data = "홍길동".toCharArray();
writer.write(data);
} finally { // JVM이 99% 보장 System.exit() << finally오기 전 이거 만나면 실행없이 얄짤없이 종료
// writer.flush(); // 다른블럭 try에서 writer이 끝나서 flush를 불러오지 못함
}// try - with - finally
}// main
}// class
----------------------<String에 담아서 구간정해 출력> -----------------------
public class WriterExample4 {
public static void main(String[] args) throws Exception {
Writer writer =new FileWriter("C:/Temp/test.txt");
String data = "안녕 자바 프로그램";
writer.write(data);
writer.write(data,1,2);
writer.flush();
writer.close();
//결과 : 안녕 자바 프로그램녕
//바이트 타입 Write에는 String 으로 담는 것 없음
}// main
}// class
관례:임포트문과 클래스 선언부 - 필드선언부 - 메소든 선언부 다 각각 2칸씩 띄어쓰라
콘솔입출력
- 3가지 자원을 운영체제가 할당 - To process (절대 닫으면 안된다.)
(1) 표준입력(Standard Input)
-System.in
1)InputStream 타입의 입력 스트림 - InputStream 변수 대입 가능
2)읽은 byte는 키보드의 아스키 코드(ascii code)
3)아스키 코드로부터 문자 변환
4)키보드로부터 입력된 한글 읽기 예제
read()메소드는 1바이트씩만 읽음 -> 오류 발생
전체 내용을 바이트 배열로 받아 String 객체 생성 후 읽기
(2) 표준출력(Standard Output)
-System.out
1)PrintStream 타입의 출력 스트림
OutputStream으로 타입 변환 가능
2)아스키 코드를 출력하면 콘솔에는 문자가 출력
3)문자열을 출력하려면 바이트 배열을 얻어야 한다
--------------------------in을 이용한 입력값 받기 기본--------------------------------
public static void main(String[] args) throws Exception {
//console view에서 표준 출력을 이용한 메뉴출력
System.out.println("===== 메뉴 =======");
System.out.println("1. 예금 조회");
System.out.println("2. 예금 출금");
System.out.println("3. 예금 입금");
System.out.println("4. 종료 하기");
System.out.println("메뉴를 선택하세요:");
// 표준입력을 이용한, 사용자의 키보드 입력 받자!
InputStream is = System.in;
char inputChar = (char)is.read(); //Blocking I/O
switch(inputChar) {
case '1' :
System.out.println("예금 조회를 선택하셨습니다."); break;
case '2' :
System.out.println("예금 출금를 선택하셨습니다."); break;
case '3' :
System.out.println("예금 입금를 선택하셨습니다."); break;
case '4' :
System.out.println("종료를 선택하셨습니다."); break;
}// switch
}// main
---------------------------in으로 받고 배열에 담고 out으로 출력--------------------
public static void main(String[] args) throws Exception {
InputStream is = System.in;
byte[] datas = new byte[100];
//100개 넘어가면 오류는 보내져서 안뜨는데 하고싶은말까지 같이 입력되더라
System.out.println("이름: ");
int nameBytes = is.read(datas);
System.out.println(Arrays.toString(datas));
String name = new String(datas, 0, nameBytes-2);
System.out.print("하고 싶은 말: ");
int commentBytes = is.read(datas);
System.out.println(Arrays.toString(datas));
String comment = new String(datas, 0, commentBytes-2); // enter키 2개 입력된거 개수 빼는 것
System.out.println("입력한 이름: " + name);
System.out.println("입력한 하고 싶은 말: " + comment);
}//main
(3) 표준에러(Standard Error)
-System.err
1)자바6부터 콘솔에서 입력된 문자열을 쉽게 읽을 수 있도록 제공
이클립스에서 System.console()은 null 리턴
명령 프롬프트에서 반드시 실행
2)Console 클래스의 읽기 메소드
--------------------------outputStream 오버플로우 / err 조금 ----------------------
public static void main(String[] args) throws Exception {
OutputStream os = System.out;
for(byte b = 48; b < 58; b+=2) {
os.write(b);
}//for
os.write(300); //오버플로우
os.write(600); //오버플로우
// --
for(byte b = 97; b < 123 ; b+=1 ) {
os.write(b);
}//for
os.write(10);
// ---
String hangool = "가나라다라마바사아자차카타파하";
byte[] hangoolBytes = hangool.getBytes();
os.write(hangoolBytes);
os.flush();
System.err.print("test"); //빨간색 글씨로 표시
}//main
(4)Scanner 클래스
-Console 클래스의 단점
문자열은 읽을 수 있지만 기본 타입(정수, 실수) 값을 바로 읽을 수 없음
-java.util.Scanner
콘솔로부터 기본 타입의 값을 바로 읽을 수 있음
----------------------------scanner로 입력 받기 ----------------------------
public static void main(String[] args) {
@Cleanup
Scanner scanner = new Scanner(System.in);
System.out.println("문자열 입력> "); // Prompt Message
String inputString = scanner.nextLine(); //scanner가 엔터알아서 때어줌
System.out.println(inputString);
System.out.println();
// ---
System.out.println("정수 입력> ");
int inputInt = scanner.nextInt();
System.out.println(inputInt);
System.out.println();
// ----
System.out.println("실수 입력> ");
double inputDouble = scanner.nextDouble();
System.out.println(inputDouble);
}//main
파일 입출력
(1)File 클래스
-파일 시스템의 파일을 표현하는 클래스
파일 크기, 파일 속성, 파일 이름 등의 정보 제공
파일 생성 및 삭제 기능 제공
디렉토리 생성, 디렉토리에 존재하는 파일 리스트 얻어내는 기능 제공
--------------------------------File 메소드 사용 --------------------------------------
package thisjava;
import java.io.File;
import java.net.URI;
import java.text.SimpleDateFormat;
import java.util.Date;
public class FileEx {
//도스창에서, 특정 디렉토리의 dir 명령수행결과와 비슷한 화면을 만들어 내는 예제
public static void main(String[] args) throws Exception{
//지정된 경로가 존재하든 안하든 없으면 만들어줌
File dir =new File("C:/Temp/Dir");
File file1 =new File("C:/Temp/file1.txt");
File file2 =new File("C:/Temp/file2.txt");
System.out.println("1.dir: "+ dir);
System.out.println("2.file1: "+ file1);
System.out.println("3.file2: "+ file2);
//경로를 URI 형식으로도 지정가능
File file3 =new File(new URI("file:///C:/Temp/file3.txt"));
// --
if(dir.exists() == false) {dir.mkdir();} //mkdirs():중간중간 없으면 비어있는 경로를 다 만들어라
//인스턴스가 가리키고 있는 경로대로 디렉토리를 만듭니다.
if(file1.exists() == false) {file1.createNewFile();}
//인스턴스가 가리키고 있는 이름대로 파일을 생성합니다.
if(file2.exists() == false) {file2.createNewFile();}
// ---
File temp = new File("C:/Temp");
//웹프로그래밍이나 클라우드 파일 시스템 작업 할 때 필요
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd a HH:mm"); //중요
File[] contents = temp.listFiles(); // 파일의 목록을 전부 file배열로 반환
System.out.println("날짜 시간 형태 크기 이름 ");
System.out.println("------------------------------------------------------------- ");
//파일을 다 한번씩 디렉토리인지 아닌지 파악하고 크기랑 이름이랑 수정날짜를 출력한다.
for (File file : contents) {
System.out.println(sdf.format (new Date(file.lastModified()))); // 마지막 수정날짜를 형식에 맞게 담는다.
if(file.isDirectory()) { //디렉토리인지 여부를 판단한다.
System.out.println("\t<DIR>\t\t" + file.length()+ "\t" + file.getName());
} else {
System.out.println("\t\t\t" + file.length()+ "\t" + file.getName());
} // if else
System.out.println();
} // for
}//main
}//class
-------------------------번외 시간 클래스들 -------------------------------
public static void main(String[] args) {
Date now = new Date();
System.out.println(now);
// 1970.01.01 00:00:00 ~ 현재날짜와 시간까지 흐른 1/1000 초를 long으로 변환
long nowTime = now.getTime(); //이 메소드 말고 다른 메서드는 다 꽂힌 무언가가 있는데 사용하지말라는 뜻
System.out.println(nowTime);
// ------
// 해당 형식에 맞춰서 시간을 반환해줌
// 대문자M: 월, 소문자m:분, H:24시간형식 / h:12시간형식 -> 다 정해져있음.
String format = "yyyy-MM-dd HH:mm:ss";
DateFormat df; // 현재의 날짜 시간정보를 가지고 사용할 수 있게 해주는 클래스
df = new SimpleDateFormat(format);
System.out.println(df.format(now));
// 고유한 id를 형성해줌 범용 / 고유 식별자는 소프트웨어 구축에 쓰이는 식별자 표준
UUID uuid = UUID.randomUUID();
System.out.println(uuid);
}//main
Author And Source
이 문제에 관하여(19일차 입출력!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@koo9b9h/19일차-입출력저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)