File 처리/입출력스트림
by #독개#File클래스 (파일&디렉토리 경로/생성/삭제/수정/존재여부/숨김파일체크)
File a = new file("c:/haker/i2sec.txt") //파일을 지칭
파일 입출력IO
바이트 단위 입출력 스트림 : 그림, 멀티미디어, 문자등 모든 종류의 데이터들을 주고받을 수 있다.
문자 단위 입출력 스트림 : 오로지 문자만 주고받을 수 있게 특화되어 있다.
(바이트로 받으면 문자로 출력하려면 String으로 바꾸고 출력해야하지만 문자단위는 문자로 주고받을수
있다)
★ 스트림 (Stream) 이란?
- 입력/출력 스트림의 기준은 온전히 자기자신이다!
간단한게 말해서 스트림이란 '자료의 입출력을 도와주는 중간매개체' 입니다. 스트림은 입력과 출력을 도와주는 매개역할을 하는 것이니, 입력과 출력이 관련된 곳이면 어디서든 동작합니다. 스트림을 더 쉽게 설명할 때 아래와 같이 비유하곤 합니다.
- 스트림은 데이터를 읽고 기록하는 중간역할을 한다.
- 스트림은 빨대다.
- 빨대는 음료수를 마시는 중간역할을 한다.
- 빨대는 입에 있는 음료수를 다시 내뱉는 중간역할을 한다.
- 스트림은 단 방향 빨대이다. 음료수를 내뱉고 다시 마시려면 빨대가 2개 필요하다.
조금 지저분한 비유이긴 하지만;; 이것을 다시 입력/출력 스트림으로 나누어 비교해보면 아래와 같습니다.
- 입력 스트림 비교
- 입력 스트림은 데이터를 먼저 스트림으로 읽어 들인다. 그리고 스트림에 존재하는 데이터를 하나씩 읽어 들일 수 있다.
- 음료수를 마실 때 빨대를 이용하여 음료수를 빨대에 모으고 빨대에 들어있는 음료수를 흡입한다. 그러면 음료수가 입안으로 들어 올 것이다.
- 출력 스트림 비교
- 출력 스트림으로 데이터를 보낸다. 출력 스트림에 보낸 데이터를 비워 버린다. 그렇게 되면 출력 스트림에 존재하던 데이터가 모두 목표지점에 저장된다.
- 입 안에 있던 음료수를 빨대로 일단 보낸다. 빨대에 들어있는 음료수를 불어 버린다. 그렇게 되면 음료수는 다시 컵 안으로 들어가게 된다.
(스트림에 먼저 받아서 넣어두고 하나씩 가지고 올수 있구나!)
- 목표로 하는 데이터를 정한다.
- 데이터에 맞는 스트림을 생성한다.(파일인지,네트워크인지,배열인지등등)
- 스트림 클래스의 멤버 메소드를 이용하여 쉽게 데이터를 핸들한다.
★ 자바 스트림
어떤 목표 지점에서 데이터를 읽어 들이고, 목표 지점에 기록하는 것을 데이터의 Input, Output 작업이라고 합니다. 기본적으로 우리는 모니터로 입출력하는 것을 배웠습니다. 가장 많이 사용하는 System.out.println에서 out은 콘솔 화면에 데이터를 출력하는 것을 담당하고, System.in은 키보드의 입력을 담당하고 있습니다. 여기서 in과 out같이 데이터를 받고 출력하는 작업을 도와주는 중간 흐름 역할을 스트림이라고 부릅니다.
◆ 자바입출력 스트림의 구성도
InputStream/OutputStream & Reader/Writer 는 최상위 추상화클래스다 그래서 직접적으로 객체화해서 사용하지못하고
InputStream a = new FileInputStream("C:\test.jpg"); 이런식으로 하위 스트림클래스로 객체화해서 대입해야한다.
그래야 InputStream이 가지고있는 메소드를 사용할수있다.
ex) a.read();
◆ 바이트 스트림의 구성도
◆ 입력 스트림 계열의 멤버 메소드
read()
리턴 : 읽은 값 (int)
더이상 읽을것이 없으면 -1을 리턴한다
read(byte[] b)
리턴 : 배열에 저장한 바이트 갯수 (int)
더이상 읽을것이 없으면 -1을 리턴한다
read(byte[], int off, int len)
리턴 : 배열에 저장한 바이트 갯수 (int) //만약 len개를 읽지 못하는 상황(읽을바이트가 2개밖에안남음) 이러면 2를반환
close(); 스트림닫기 (반드시 스트림 열었으면 닫아줘야한다!!)
◆ 출력 스트림 계열의 멤버 메소드
출력에서 중요한게 write한다고 바로 파일로 출력을 하는게아니라 버퍼라는 곳에 저장이 된다. 이 버퍼가 꽉차야지만 출력하는 쪽으로 데이터를 보내는데,
즉 write(a); 한다고 바로 쓰여지는게아니라 버퍼에 저장이되고 이걸 flush(); 해줘야만 출력쪽으로 보내준다 보면된다.
wirte(int b) : 1개 출력
int b라서 4바이트지 만 마지막 바이트에만 저장되어있으니 이것만 보낸다. (우리 read도 int라 4바이트공간을 불러오지만 실제로 1개만쓰잖아) - 자바에서 낭비가심하군
write(byte[] b) : 모두 출력
byte[] b;
write(b[1]); 이렇게 한바이트씩 출력했다면 //이걸로 다출력하려면 for문을 구현해야하니 귀찮자나
wirte(b); 이건 배열을 한번에 다 출력하는 기능
write(byte[] b , int off, int len)
◆ 스트림의 종류와 설명
문자 스트림 클래스 | 바이트 스트림 클래스 | 설명 |
Reader | InputStream | 문자/바이트 입력 스트림을 위한 추상클래스 |
BufferedReader | BufferedInputStream | 문자/바이트 버퍼 입력, 라인 해석 |
LineNumberReader | LineNumberInputStream | 문자/바이트 입력시, 라인 번호를 유지 |
CharArrayReader | LineNumberInputStream | 문자/바이트 배열에서 읽어들임 |
InputStreamReader |
| 바이트 스트림을 문자 스트림으로 변환 |
FileReader | FileInputStream | 파일에서바이트를읽어들여문자/바이트스트림으로 변환 |
FilterReader | FilterInputStream | 필터적용(filtered)문자/바이트입력을위한추상클래스 |
PushbackReader | PushbackInputStream | 읽어들인 문자/바이트를 되돌림(pushback) |
PipedReader | PipedInputStream | PipedWriter/PipedOutputStream에서 읽어들임 |
StringReader | StringBufferInputStream | 문자열에서 읽어들임 |
Writer | OutputStream | 문자 출력 스트림을 위한 추상클래스 |
BufferedWriter | BufferedOutputStream | 문자/바이트 스트림에 버퍼 출력, BufferedWriter는 플랫폼에서 사용하는 라인 구분자(line separator) 사용 |
CharArrayWriter | ByteArrayOutputStream | 문자/바이트 스트림에 문자/바이트 배열 출력 |
FilterWriter | FilterOutputStream | 필터적용(filtered)문자/바이트출력을위한추상클래스 |
OutputStreamWriter |
| 문자 스트림을 바이트 스트림으로 변환 |
FileWriter | FileOutputStream | 문자/바이트 스트림을 문자/바이트 파일로 변환 |
PrintWriter | PrintStream | Writer/Streamdp 값과 객체를 프린트 |
PipedWriter | PipedOutputStream | PipedReader/PipedOutputStream에 출력 |
StringWriter |
| 문자열 출력 |
외우는건 말도안되고 ㅋㅋ 찾아서 쓰자 그때그때
보조 스트림
출력시에 메모리에 꽉차면 원래 목적지로 전송해주는데 덜찼을때 내보내줄라면 flush();해야한다.
사용하지않았을때 : 1169ms
사용했을때 : 23ms
System.in으로 콘솔창에서 입력받아 InputStream에 바이트로 저장한뒤 이걸-> InputStreamReader로 문자로전환해서 저장
-> BufferedReader에 저장해서 속도향상
BufferedReader에서 readLine();한줄씩 읽어오는 메소드 가능 이거 자주쓴다!
FileInputStream(파일 입출력 byte 읽기)
FileoutputStream(파일 입출력 byte 쓰기)
RandomAccessFile(파일 입출력 byte 읽기&쓰기)
- 읽기와 쓰기를 동시에 사용이 가능
- 파일의 원하는 지점에 접근이 가능
- 파일 모드 r 또는 rw 를 인자로 전달 해야 함
기본적으로 write는 덮어쓰기다(포인터 위치 자리부터 시작)
getfilePointer(); : 파일 포인터 위치 반환
seek(7); 파일 포인터위치 7로이동
public class Main {
public static void main(String[] args) {
String path = "c:\\test\\a.txt";
RandomAccessFile file;
try {
file = new RandomAccessFile(path, "rw");
System.out.println(file.readLine()); // 개행을 만나기 전까지 읽고 String반환
System.out.println(file.getFilePointer()); //파일포인터 위치를 long으로 반환
file.seek(7); //파일포인터 위치를 7로 이동
file.write("77777".getBytes()); //"7777"을 byte로 바꾼값을 파일에씀 파일엔 문자로나오네
file.close();
}catch(Exception e) {
e.getStackTrace();
}
}
}
FileReader(파일 입출력 char 읽기)
- 문자열 그대로 핸들링해서 println을 사용해서 바로 출력이 가능하다
FileWriter(파일 입출력 char 쓰기)
- 문자열을 입력하여 파일 내용쓰기 가능
외부명령어
- 윈도우 cmd창에 명령어 실행 하는거
ProcessBuilder pb = new ProcessBuilder("ipconfig");
윈도우 cmd창에 명령어 실행 하고 결과를 출력
윈도우 프로세스 관련 명령어
조회 |
tasklist |
이름검색 |
tasklist /fi "imagename eq cmd.exe" |
PID검색 |
tasklist /fi "pid eq 4428" |
PID종료 |
taskkill /f /pid 1044 |
이름종료 |
taskkill /f /im hxd.exe |
tasklist로 검색할때 젤뒤에 /svc /fo csv (콤마기준으로 출력됨) 윈도우api기능인듯 | |
'🔥 프로그래밍 학습 > JAVA' 카테고리의 다른 글
| 메소드 (0) | 2020.06.02 |
|---|---|
| 쓰레드 (0) | 2020.06.02 |
| 예외처리 try-catch (0) | 2020.05.25 |
| 추상화 클래스 , 인터페이스 (0) | 2020.05.25 |
| 자바 분석할것2 (0) | 2020.05.25 |
블로그의 정보
독한 개발자
#독개#