20일차 2023-04-04

2023. 4. 4. 20:16java

1. 스트림

 

1-1. BufferedRWFileToFile.java

/*

문] 파일(BufferedInOutFileToFile.java)로부터 입력받아서

파일(BufferedInOutFileToFile.txt)로 출력하자.

(단,노드 스트림은 바이트 기반을 사용)

그리고 문자 기반의 필터 스트림(BufferedReader/PrintWriter)을 통해

필터링하자.

*/

버퍼끼우고,근데 버퍼가 문자스트림 입력은 바이트스트림, 그럼 버퍼에 브릿지에 스트림

package io24.filter;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;

public class BufferedRWFileToFile {

	public static void main(String[] args) throws IOException {
		//1]입력 스트림 생성
		BufferedReader br =
				new BufferedReader(
						new InputStreamReader(
								new FileInputStream("src/io24/filter/BufferedInOutFileToFile.java")));
		
		//2]출력 스트림 생성
		PrintWriter pw = new PrintWriter(
							new FileOutputStream("src/io24/filter/BufferedInOutFileToFile.txt"), true);
		//3]br로 읽어서  pw로 출력
		String data;
		while((data=br.readLine()) != null) {
			pw.println(data);
		}
		//4]스트림닫기
		br.close();
		pw.close();
	}////////////////////main

}///////////////////////class

 

1-2. AcademyCollectionBufferedRWLogic.java / Academy.App.java / fileToCollection() 메서드 수정

Academy.App.java 수정

AcademyCollectionBufferedRWLogic.java

복사로 하나 더 만듬

1-3. DataOutputMemoryToFile.java

/*

자바의 각 자료형을

인코딩(필터 사용)해서 파일로 저장하자

데이터 소스: 자바의 각 자료형에 저장된 값(메모리-변수)

데이터 목적지:파일

노드 스트림:FileOutputStream

※DataOutputStream으로 필터링한(인코딩 된) 데이터는

DataInputStream클래스를 사용해서 읽어야 제대로 읽어 온다.

*/

파일을 내보내는데 (FileOutputStream)  메모리에 저장된 변수의 값을 내보낼 것(DataOutputStream)

package io24.filter;

import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class DataOutputMemoryToFile {

	public static void main(String[] args) throws IOException {
		//1]데이타 소스 준비-입력 스트림 불필요
		byte b=100;
		byte[] bArray= {97,98,99,100};
		char ch='가';
		int num =256;
		boolean bool=false;
		String object ="안녕 자바! HELLO JAVA! 123456789";
		//2]출력 스트림 생성
		DataOutputStream dos =
				new DataOutputStream(
						new FileOutputStream("src/io24/filter/javatype.dat"));
		//3]메모리에서 데이타 읽고(변수에 저장된 데이타를)  dos로 출력
		//  자바의 각 자료형에 해당하는 출력용 메소드 사용
		dos.writeByte(b);
		dos.write(bArray);
		dos.writeChar(ch);
		dos.writeInt(num);
		dos.writeBoolean(bool);
		dos.writeUTF(object);
		//4]스트림 닫기 
		dos.close();
	}///////////////////main

}//////////////////////class

 

1-4. DataInputFileToMonitor.java

/*

파일(javatype.dat)에 저장된 자바의 각 자료형 값을 디코딩(필터 사용)해서

자바의 각 자료형(변수)에 저장하자

그리고 확인차 모니터에 출력하자

데이터 소스: 파일

노드 스트림 :FileInputStream

데이타 목적지:자바의 각 변수-메모리

모니터- 노드 스트림:System.out

※DataOutputStream으로 필터링한(암호화된) 데이터는

DataInputStream클래스를 사용해서 읽어야 제대로 읽어 온다.

단, 읽어 올 때는 저장된 자료형 순서대로 읽어 와야 한다.

*/

저장된 데이터를 받음 시스템으로 그래서 입력(FileInputSteam) 근데 그걸 Data필터 사용해야 됨.

단, 저장된 순서대로 지켜서 꺼내야 됨. 아니면 이상한 결괏값을 갖게 됨

package io24.filter;

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;

public class DataInputFileToMonitor {

	public static void main(String[] args) throws IOException {
		//1]입력 스트림 생성
		DataInputStream dis =
				new DataInputStream(
						new FileInputStream("src/io24/filter/javatype.dat"));
		
		//2]dis로 읽어서 자바의 각 자료형에 저장
		//  단, 반드시 DataOutputStream으로 출력할때의
		//  순서를 꼭 지켜야한다.
		byte b = dis.readByte();
		System.out.println(b);
		byte[] bArr = new byte[4];
		dis.read(bArr);
		System.out.println(Arrays.toString(bArr));
		char ch = dis.readChar();
		System.out.println(ch);
		int num = dis.readInt();
		System.out.println(num);
		boolean bool = dis.readBoolean();
		System.out.println(bool);
		String str = dis.readUTF();
		System.out.println(str);
		//읽어올 데이타가 없는 경우
	    //java.io.EOFException예외 발생	
		//dis.readByte();//[x]실행오류 발생
		dis.close();
	}/////////main

}////////////class

 

1-5. ObjectOutputMemoryToFile.java

이번엔 (여기선 String 데이터 값을 가진) 객체(pe1, pe2, pe3)를 출력 (파일 생성)(FileOutputStream)이걸 직렬화하기 위한 필터(ObjectOutputStream) , oos.writeObject(pe1);로 txt. 파일 (데이터를 넣은) 생성됨

package io24.filter;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class ObjectOutputMemoryToFile {

	public static void main(String[] args) throws FileNotFoundException, IOException {
		//1]데이타 소스(메모리) 준비-입력 스트림 불필요
		Person pe1 = new Person("가길동", 20, "천호동");
		Person pe2 = new Person("나길동", 30, "잠실동");
		Person pe3 = new Person("다길동", 40, "석촌동");

		//2]필터를 끼운 출력 스트림 생성]
		ObjectOutputStream oos =
				new ObjectOutputStream(
						new FileOutputStream("src/io24/filter/Persons.txt"));
		
		//3]인스턴화된 객체를 oos로 출력
		//사전준비사항:객체를 파일로 저장하려면 먼저 해당 객체는 직렬화가 되있어야 한다
		//          그렇지 않으면 java.io.NotSerializableException예외 발생
		//아래가 직렬화
		oos.writeObject(pe1);
		oos.writeObject(pe2);
		oos.writeObject(pe3);
	}////////////////main

}///////////////////class

 

1-6. ObjectInputFileToMemory.java

이번엔 아까 만든 pe1, pe2, pe3의 데이터 값이 저장된 Persons.txt를 읽어서 콘솔에 찍을 거

읽을 파일(FileInputStream) 쓰고, 그걸 (ObjectInputStream)으로 필터 끼움

package io24.filter;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;

public class ObjectInputFileToMemory {

	public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
		//1]필터를 끼운 입력 스트림 생성
		ObjectInputStream ois =
				new ObjectInputStream(
						new FileInputStream("src/io24/filter/Persons.txt"));
		
		//2]ois로 읽어서 Person타입에 저장
		Object obj=ois.readObject();
		if(obj instanceof Person) {
			Person person1=(Person)obj;
			System.out.println(person1);
		}
		Person person2 =(Person)ois.readObject();
		System.out.println(person2);
		Person person3 =(Person)ois.readObject();
		System.out.println(person3);
		//ois.readObject();//[x]java.io.EOFException		
		ois.close();

	}////////////main

}///////////////class

1-7. MajorMethodOfFile.java

여러 가지 메서드 활용

package io24.file;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MajorMethodOfFile {
	//문]File클래스의 getName()과 같은 역할을 하는 
    //   나만의 메소드를 정의하자]
	private static String getName(String pathName) {
		//방법1]lastIndexOf 및 substring
		//int beginIndex=pathName.lastIndexOf("\\") !=-1 ? pathName.lastIndexOf("\\")+1:pathName.lastIndexOf("/")+1;
		//return pathName.substring(beginIndex);
		
		//방법2]split 및 정규표현식  
		String[] re=pathName.split("[/\\\\]");
		return re[re.length-1];
	}//////////////

	public static void main(String[] args) {
		/*
		  \:디렉토리의 원도우식 표기법
		  /:디렉토리의 UNIX(LINUX)식 표기법
		*/
		String wExistFile="D:\\CCH\\Workspace\\Java\\Basic\\JavaSEProj\\src\\HelloWorld.java";
		String wNoExistFile="D:\\CCH\\NoExist.txt";
		String uRelativeDir="src/io24/node";
		String uAbsoluteDir="D:/CCH/NODIR";
		//1]File 객체 생성
		//1-1]파일에 대한 정보를 가진 File객체
		File fwExistFile = new File(wExistFile);
		File fwNoExistFile = new File(wNoExistFile);
		//1-2]디렉토리에 대한 정보를 가진 File객체
		File fuRelativeDir = new File(uRelativeDir);
		File fuAbsoluteDir = new File(uAbsoluteDir);
		//2]파일명 혹은 디렉토리명 얻기:String getName()
		System.out.println("fwExistFile의 파일명:"+fwExistFile.getName());
		System.out.println("fwNoExistFile의 파일명:"+fwNoExistFile.getName());
		System.out.println("fuRelativeDir의 디렉토리명:"+fuRelativeDir.getName());
		System.out.println("fuAbsoluteDir의 디렉토리명:"+fuAbsoluteDir.getName());
		System.out.println("[내가 만든 getName()메소드]");
		System.out.println("wExistFile의 파일명:"+getName(wExistFile));
		System.out.println("wNoExistFile의 파일명:"+getName(wNoExistFile));
		System.out.println("uRelativeDir의 디렉토리명:"+getName(uRelativeDir));
		System.out.println("uAbsoluteDir의 디렉토리명:"+getName(uAbsoluteDir));
		/*3] 파일 혹은 디렉토리 여부 판단:
	     boolean isFile() 혹은 boolean isDirectory()
	     isFile():파일이 아니거나 ,파일이 존재하지 않으면 false반환.
		 isDirectory():디렉토리가 아니거나 , 디렉토리가 존재 하지 않으면 false반환.
		 */
		System.out.println(fwExistFile.isFile());
		System.out.println(fwNoExistFile.isFile());
		System.out.println(fuRelativeDir.isFile());
		System.out.println(fuRelativeDir.isDirectory());
		System.out.println(fuAbsoluteDir.isDirectory());
		System.out.println(fwExistFile.isDirectory());
		//4]파일 혹은 디렉토리 존재 여부 판단:boolean exists()
		//※항상 존재 여부 판단후 파일인지 디렉토리인지 판단하자.
		System.out.println(fwExistFile.exists());
		System.out.println(fwNoExistFile.exists());
		System.out.println(fuRelativeDir.exists());
		System.out.println(fuAbsoluteDir.exists());
		System.out.println(fwExistFile.exists() ? fwExistFile.isFile()?"파일이다":"디렉토리다":"존재하지 않는다"  );
		
		//5]파일 혹은 디렉토리의 상대경로(getPath()) / 
		//                   절대경로(getAbsolutePath()) 얻기 		
		//※자바 프로그램에서 상대경로로 표기하고 
		//  절대 경로를 얻고자할때 주로 getAbsolutePath()사용
		System.out.println("fuAbsoluteDir의 상대경로:"+fuAbsoluteDir.getPath());
		System.out.println("fuAbsoluteDir의 절대경로:"+fuAbsoluteDir.getAbsolutePath());
		System.out.println("fuRelativeDir의 상대경로:"+fuRelativeDir.getPath());
		System.out.println("fuRelativeDir의 절대경로:"+fuRelativeDir.getAbsolutePath());
		//6]파일 혹은 디렉토리의 크기 얻기(단위:바이트) :long length()
		/*
		8bit     -> 1BYTE
		1024byte -> 1KB
		1024KB   -> 1MB
		1024MB   -> 1GB
		1024GB   -> 1TB		
		 */
		//디렉토리는 OS에 따라서 
		//0을 반환하거나 일부 크기를
		//반환 할 수도 있다. 파일은 존재하면 해당 크기를 반환
		//존재하지 않으면 0반환.
		/* length()메소드 사용시 크기가 0인경우
		 * -디렉토리(OS에 따라 다름)
		 * -파일형식이지만 파일이 존재 하지 않은경우
		 * -파일이 존재하지만 크기가 0인 경우 
		 */
		//디렉토리 경우 XP는 무조건 0반환,WIN7,WIN10는 크기 반환하지만 실제 크기는 아님
		System.out.println(fwExistFile.length()+"바이트");
		System.out.println(fwNoExistFile.length()+"바이트");
		System.out.println(fuRelativeDir.length()+"바이트");
		System.out.println(fuAbsoluteDir.length()+"바이트");
		//7]상위 부모경로 얻기:getParent()
		/*
		  주로 디렉토리에 적용하는데 파일객체를 생성시
		  상대경로든 절대경로든 여러 경로를 준 경우에 사용
     	 */	
		System.out.println(fwExistFile.getParent());
		System.out.println(fwNoExistFile.getParent());
		System.out.println(fuAbsoluteDir.getParent());
		System.out.println(fuRelativeDir.getParent());
		
		
		File fone = new File("file");
		System.out.println(fone.getParent());
		File ftwo = new File("parent", "child");
		System.out.println(ftwo.getParent());
		
		//8]디렉토리 혹은 파일 삭제:
		//  boolean delete()-삭제 성공시 true,실패시 false
		System.out.println(fwNoExistFile.delete());
		File fexist = new File("D:/CCH/myjar.jar");
		System.out.println(fexist.delete());
		//디렉토리는 안에 비어 있어야 삭제됨.
		System.out.println(fuRelativeDir.delete());
		System.out.println(new File("D:/CCH/TEMP").delete());
		//9]디렉토리 생성:boolean mkdir() /mkdirs();
	    //mkdir():부모 디렉토리 존재 하지 않으면 생성 실패
	    //mkdirs():부모 디렉토리까지 생성해줌.
		File fmkdir = new File("src/io24/node/temp");
		System.out.println(fmkdir.mkdir());
		
		System.out.println(new File("src/io24/mynode/temp").mkdir());
		System.out.println(new File("src/io24/node/nodir/temp").mkdirs());
		//10]읽기/쓰기 가능 판단
		//윈도우계열 OS는 모든 파일이 디폴트로 실행가능.
		File fcan = new File("d:/cch/can.txt");
		System.out.println(fcan.canRead() ?"읽기가능":"읽기불가");
		System.out.println(fcan.canWrite() ? "쓰기가능":"쓰기불가");
		System.out.println(fcan.canExecute()?"실행가능":"실행불가");
		/*11]파일 혹은 디렉토리의 최근 수정된 시간 얻기
		long lastModified():1970년 1월 1일 0시 0분 0초부터 현재까지 
		흘러온 시간을 1000분의 1초단위로 환산해서 long형으로 반환.*/
		long time=fcan.lastModified();
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd a h:mm");
		String lastString= dateFormat.format(new Date(time));
		System.out.println("최근 수정된 시간:"+lastString);
		//12]파일 이름 변경:boolean renameTo(File dest)  
		//   src.renameTo(dest) src와 dest는 둘다 파일객체
		/*
		 * 같은 폴더 안:파일명 변경효과(rename)
		 * 다른 폴더 안으로:파일 이동 효과(cut and paste)
		 */	
		File fchange = new File("d:/cch/change.txt");
		System.out.println(fcan.renameTo(fchange));
		File fmove = new File("d:/cch/교안/move.txt");
		System.out.println(fchange.renameTo(fmove));
		/*13]파일목록 및 디렉토리목록 얻어 오기
		String[] list():해당 디렉토리안에 있는 파일 및 디렉토리명만
		File[] listFiles():해당 디렉토리안에 있는 파일 및 디렉토리에
		대한 파일객체 배열 반환
		*/
		System.out.println("[파일 및 디렉토리명만 반환]");
		String[] names=fuRelativeDir.list();
		for(String name:names) System.out.println(name);
		System.out.println("[File[] 반환]");
		File[] files=fuRelativeDir.listFiles();
		for(File f:files) {
			//파일명 혹은 디렉토리명]
			String name = f.getName();
			//최근 수정된 시간]
			String lastModified=dateFormat.format(new Date(f.lastModified()));
			if(f.isFile()) System.out.print("파일명:"+name);
			else System.out.print("디렉토리명:"+name);
			System.out.println(",최근 수정된 시간:"+lastModified);
		}
	}/////////////main	
}//////////////////class

sol)

+추가 sol)

 

1-8. WindowExplorer.java

위 콘솔을 윈도우 파일폴터의 내용처럼 출력하도록 코드 작성

 

consol 결과

package io24.file;

import java.io.File;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class WindowExplorer {
	private static void printLine(int size,char symbol) {
		for(int i=0;i<size;i++) {
			System.out.print(symbol);
		}
		System.out.println();
	}///////////////////////////
	public static void main(String[] args) {
		
		File f = new File("src/io24/node");		
		//문]윈도우 탐색기처럼 상기 디렉토리 안에 있는
		//   하위디렉토리나 파일을 출력하여라,
		//   단, 디렉토리부터...
		printLine(106, '=');
		System.out.println(String.format("%-50s%-32s%-14s%s","이름","수정한 날짜","유형","크기"));
		printLine(106, '=');
		
		StringBuilder sbDir  = new StringBuilder();
		StringBuilder sbFile = new StringBuilder();
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd a h:mm");
		File[] files=f.listFiles();
		
		NumberFormat nf = NumberFormat.getInstance();
		
		for(File file:files) {
			//파일명 혹은 디렉토리명]
			String name = file.getName();
			//최근 수정된 시간]
			String lastModified=dateFormat.format(new Date(file.lastModified()));
			if(file.isFile()) {//파일인 경우
				//파일 유형]
				String ext=name.substring(name.lastIndexOf(".")+1).toUpperCase();
				//파일 크기]
				int size=(int)Math.ceil(file.length()/1024.0);
				sbFile.append(
						String.format("%-50s%-32s%-14s%sKB%n",
								name,lastModified,ext+" 파일",nf.format(size)));
			}
			else {//디렉토리
				sbDir.append(
						String.format("%-50s%-32s%-14s%n",
								name,lastModified,"파일 폴더"));
			}
			
		}///for
		System.out.println(sbDir+sbFile.toString());	

	}/////////////main

}////////////////class

 

'java' 카테고리의 다른 글

27일차 2023-04-13  (0) 2023.04.13
26일차 2023-04-12  (0) 2023.04.12
19일차 2023-04-03  (0) 2023.04.03
18일차 2023-03-31  (0) 2023.03.31
17일차 2023-03-30  (0) 2023.03.30