독개

File 처리/입출력스트림

by #독개#


File클래스 (파일&디렉토리  경로/생성/삭제/수정/존재여부/숨김파일체크)


File a = new file("c:/haker/i2sec.txt")            //파일을 지칭

File b = new file("c:/haker")                       //폴더까지면 폴더를 지칭

File c = new file("c:/haker/i3sec.txt")


파일 입출력IO

- 자바 입출력은 바이트(16진수값)단위와 문자 단위로 나뉨

바이트 단위 입출력 스트림 : 그림, 멀티미디어, 문자등 모든 종류의 데이터들을 주고받을 수 있다.

문자 단위 입출력 스트림 : 오로지 문자만 주고받을 수 있게 특화되어 있다.

(바이트로 받으면 문자로 출력하려면 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();


△ 문자(String)기반 스트림은 Reader(입력) / Writer(출력)라는 단어가 붙음

△ 바이트기반 스트림은 InputStream(입력) / OutputStream(출력) 라는 단어가 붙음    //문자도 바이트스트림으로 가능함


 바이트 스트림의 구성도








◆ 입력 스트림 계열의 멤버 메소드


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 읽기)

파일의 내용을 출력하기 위해서는 byte를 String으로 변환 해야 함
public class Main {

public static void main(String[] args) {
String path = "c:\\a.txt";
byte[] data = new byte[60];
FileInputStream in;
try
{
in = new FileInputStream(path);        //파일스트림에서 파일이없으면 에러나니
in.read(data);
System.out.println(new String(data));  //data라는 바이트배열을 스트링 배열로 변경!
in.close();                                     //스트림꼭 닫아주기
}catch(Exception e) {
e.printStackTrace();
}
}
}


FileoutputStream(파일 입출력 byte 쓰기)

파일에 내용을 쓰기 위해서는 byte로 변환 해야함
지정된 파일이 없는 경우 자동으로 생성

public class Main {

public static void main(String[] args) {
String path = "c:\\a.txt";
String data = "hello i2sec\r\n";                   //윈도우에서 개행은 /r/n해줘야지 앞으로당겨야한다.
     //우리는 txt파일 열어서 윈도우에서 볼꺼잖아
FileOutputStream out;
try {
out = new FileOutputStream(path);
out.write(data.getBytes());                     //스트링을 바이트배열로 반환
out.close();
}catch(Exception e) {
e.getStackTrace();
}
}
}

윈도우 개행 \r\n 
16진수 바이트로는 0d 0a

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을 사용해서 바로 출력이 가능하다
public class Main {

public static void main(String[] args) {
String path = "c:\\test\\a.txt";
FileReader in;
try {
in = new FileReader(path);
in.read(data);
System.out.println(data);
in.close();
}catch(Exception e) {
e.getStackTrace();
}
}
}

FileWriter(파일 입출력 char 쓰기)

  • 문자열을 입력하여 파일 내용쓰기 가능
public class Main {

public static void main(String[] args) {
String path = "c:\\test\\a.txt";
FileWirter out;
String data = "hello i2sec\r\n";
try {
out = new FileWriter(path);
out.write(data);                        //write는 역시나 덮어쓰기다. 이어쓰기아님
out.close();
}catch(Exception e) {
e.getStackTrace();
}
}
}



외부명령어

  • 윈도우 cmd창에 명령어 실행 하는거
public class Main {

public static void main(String[] args) {
ProcessBuilder pb = new ProcessBuilder("ipconfig");

try {
Process p = pb.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}

ProcessBuilder pb = new ProcessBuilder("ipconfig");


 try {
  Process p = pb.start();

이렇게 나눈걸

try {
 Process ps = new ProcessBuilder("ipconfig").start();

이렇게 쓸수도 있는데 이건 상속개념이라는데 음...공부를 더해보자
  • 윈도우 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

블로그의 정보

독한 개발자

#독개#

활동하기