2023. 4. 4. 20:16ㆍjava
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
위 콘솔을 윈도우 파일폴터의 내용처럼 출력하도록 코드 작성
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 |