19日目I/O!


(バッファは一時メモリ領域)

文字ベースのストリーム


トップレベルの入力ストリームリーダー


-文字ベースの入力フローとして抽象化された最上位クラス

----------------------------파일읽어서 문자로 반환 ----------------------------

	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

トップレベル出力ストリームライタ


-文字ベースの出力ストリームとして抽象化された最上位クラス

-----------------------------하나씩 출력하기-------------------------

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
慣例:文とクラス宣言のインポート-フィールド宣言-メソデン宣言の各スペース

コンソールI/O


オペレーティングシステムは、プロセスに
  • 3種類のリソースを割り当てます(絶対に閉じることはできません).
  • (1)標準入力


    -System.in


    1)InputStreamタイプへの入力を許可する変数
    2)読み出しバイトはキーボード上のASCIIコード(ASCIIコード)
    3)Askyコードから文字を変換する
    4)キーボードから入力したハングルの例
    read()メソッド1バイトのみ読み込み->エラー
    すべてのコンテンツをバイト配列として受信し、Stringオブジェクトを作成して読み込みます.

    (2)標準出力


    -System.out


    1)PrintStreamタイプの出力ストリーム
    タイプをOutputStreamに変換できます
    2)Askyコードを出力すると、コンソールから文字が出力されます
    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)標準エラー


    -System.err


    1)Java 6から、コンソールから入力文字列を簡単に読み取る機能を提供
    eclipseからSystemへ.コンソール()はnullを返します
    コマンドプロンプトで実行する必要があります
    2)コンソールクラスの読み出し方法
    --------------------------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類


    -コンソールクラスの欠点


    文字列は読み取り可能ですが、デフォルトタイプ(整数、実数)の値は直接読み込めません.
    -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
    

    ファイルI/O


    (1)ファイルクラス


    -ファイルシステム内のファイルを表すクラス
    ファイルサイズ、ファイル属性、ファイル名などの情報を提供
    ファイルの作成と削除機能の提供
    ディレクトリを作成し、ディレクトリに存在するファイルのリストを取得する機能を提供します.
    --------------------------------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