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

좋은 웹페이지 즐겨찾기