오늘 메모장에 적어둔 선생님 설명
==========================================================학원에서 적은것 시작
20180807
- 입출력 (I/O -> Input, Output)
-> 입력과, 출력을 의미
-> Stream을 이용해서 데이터를 입력/출력이 가능해야한다.
-> Stream -> 데이터를 운반하는데 사용하는 통로
파일을 읽어오고싶은 경우에 통로를 하나 연결한다.
이통로를 통해서 데이터를 운반한다.
이 통로를 보고 Stream이라고 한다.
입력스트림 : 프로그램으로 데이터를 읽어들이는 스트림
출력스트림 : 프로그램으로부터 데이터를 내보내는 스트림 ex)sysout
->프로그램 기준으로 입력이된다는건 어디서든 데이터를 갖고온다는 것
->프로그램 기준으로 출력되는건 값을 내보내는 것이다.
스트림 -> 단방향임
파일에 입출력을 모두 수행하려면 2개스트림(입력/출력)
1. 스트림을 연결한후
2. 입력을 해주던지
3. 출력을 해주던지
전부 스트림은 연결을 해줘야된다.
이건다 클래스로 구현이되어있다.
스트림은 두종류
1. 바이트스트림
1byte
-> 사운드, 이미지, 동영상 등을 운반하는데 사용
-> InputStream, OutputStream
종류
FileInputStream/FileOutputStream -> 파일 입출력
ByteArrayInputStream/ByteArrayOutputStream
-> 메모리
PipedInputStream / PipedOutputStream -> 프로세스
AudioInputStream / AudioInputStream -> 오디오장치
InputStream, OutputStream은다 최상위 부모이다.
2. 문자 스트림 : 통로를 움직이는 데이터의 크기가
2byte(문자1개씩간다.)
-> 문자저장, 문서파일기록
-> Reader/Writer
- 종류
FileReader / FileWriter
CharArrayReader / CharArrayWriter
PipedReader / PipedWriter
StringReader / StringWriter
- 보조스트림
-> 바이트스트림, 문자스트림 기능을 보완해주는 스트림
-> 데이터를 주고받는스트림 아니기때문에 단독적으로 사용이 불가능하고 스트림의 기능향상,
새로운기능
->주스트림(바이트스트림,문자스트림)을 생성하고나서 보조스트림을 생성해야한다.
-종류
BufferedInputStream / BufferedOutputStream
BufferedReader / BufferedWriter
-> 버퍼를 이용한 입출력 처리
FilterInputStream / FilterOutputStream
FilterReader/FilterWriter
-> 필터를 이용한 입출력 처리
DataOutputStream / DataInputStream
->자료형을 이용한 입출력이 가능해진다.
ObjectInputStream / ObjectOutputStream
-> 데이터를 객체단위로 읽고 쓰는데 사용(직렬화필요)
-> 객체단위일경우엔 Reader과 Writer이없다. 이런건 직렬화라 한다.
=================================================================
DataOutputStream dos = new DataOutputStream(new FileOutputStream(fileName))
같은게
//풀어서 쓰면 FileOutputStream fos = new FileOutputStream(fileName);
//주스트림 생성
//DataOutputStream dos = new DataOutputStream(fos);
//주스트림 fos를 보조할 보조스트림 생성
------------------------------------------------------------------
바이트스트림 동영상, 이미지, 음악같은데 처리할때 쓴다고 했다.
한글이 정상적으로 읽힐수가 없다.
스트림이므로 한글처리시에 정상적으로 처리가 안된다.
한글처리할땐 문서처리 하는걸로 해야된다.
quiz.txt파일을 받고 이걸 이미지파일로 바꿀것이다. 이미지파일을 텍스트화해놓은것이다.
quiz.txt파일을 c에 드라이브에 넣어놓기
notepad++나중에 깔아보기
===========================================================학원에서 적은것 끝

package kh.java.run;
import kh.java.test.Exam1;
import kh.java.test.ImageStream;
public class Run {
public static void main(String[] args) {
//Exam1 e = new Exam1();
//e.primaryStream();//한글입력이된다.
//e.subStream();//한글이 입력이 안된다.
//e.charPrimaryStream();//한글이 입력이 된다.
//e.charSubStream();//한글이랑 영어 전부다 입력된다. 아까꺼의 새로운버전
//ImageStream i = new ImageStream();//텍스트파일을 그림으로 바꾸는것
//i.main();
Exam1 e = new Exam1();
//e.ex1();
//e.test();//16진수 알아보는 것
//e.fileSave();//값을 저장하는것
e.fileLoad();//이건 내 콘솔창에다가 그대로 값 갖고온다는 것이다.
}
}
============================================================================
package kh.java.test;
import java.awt.event.FocusAdapter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.Scanner;
public class Exam {
Scanner sc = new Scanner(System.in);
public void primaryStream() {
System.out.print("저장할 파일명 입력 : ");
FileOutputStream fos=null;
String fileName = sc.next();
sc.nextLine();
try {//입력받은 파일명으로 파일아웃풋 스트림 생성
fos = new FileOutputStream(fileName);//try~catch쓰라고되어있다.
//"test.txt라고 저장할수도있다.fileName대신써도된다."
System.out.println("'"+fileName+"'파일에 저장될 내용");
System.out.println("종료는 exit");
int lineNumber=1;//몇번째줄에 글씨를 입력하고있는지 체크하기 위한변수이다.
while(true) {
System.out.print((lineNumber++)+":");
String str = sc.nextLine()+"\r\n";//실제로 입력하는구간
//\r\n이 줄끝났어 라고 붙여준것이다.
//\r은 캐럿이 그 줄 맨 앞으로 갑니다.
//(Carriage return)
//\n은 캐럿이 다음 줄로 갑니다.
//(Line feed)
//의미가 여기서 끝내고 다음줄로 넘어가라는 의미이다.입력후다음줄가라.
//sc.nextLine();
if(str.equals("exit\r\n")) {//exit들어오면 더이상 코드수행하지않고 종료해라
break;
}else {
fos.write(str.getBytes());
//문자형을 바이트형태로 넣어준것이다.
//이걸 DataOutputStream을쓰면 자료형을 통해 넣어줄수있다.
//쓰기 메소드를 통해서 쓸것이다.문자를 byte형태로 내보낸다.
}
}
}catch(FileNotFoundException e) {
e.printStackTrace();
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
fos.close();
} catch (Exception e2) {
// TODO: handle exception
}
}//닫아주는 코드이다
//FOS로 해서 자동완성 쓰기
}
}
==============================================================
package kh.java.test;
import java.io.BufferedWriter;
import java.io.DataOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.StringTokenizer;
//try~catch finally안해줘도되는것
public class Exam1 {
Scanner sc = new Scanner(System.in);
public void primaryStream() {
System.out.print("저장할 파일명 입력 : ");
String fileName = sc.next();
sc.nextLine();
//입력받은 파일명으로 파일아웃풋 스트림 생성
//이렇게 해줄경우 finally안해줘도된다.
try(FileOutputStream fos = new FileOutputStream(fileName)){//try~catch쓰라고되어있다.
//세미콜론으로 여러개 할경우 이렇게 하면된다.
//"test.txt라고 저장할수도있다.fileName대신써도된다."
System.out.println("'"+fileName+"'파일에 저장될 내용");
System.out.println("종료는 exit");
int lineNumber=1;//몇번째줄에 글씨를 입력하고있는지 체크하기 위한변수이다.
while(true) {
System.out.print((lineNumber++)+":");
String str = sc.nextLine()+"\r\n";//실제로 입력하는구간
//\r\n이 줄끝났어 라고 붙여준것이다.
//\r은 캐럿이 그 줄 맨 앞으로 갑니다.
//(Carriage return)
//\n은 캐럿이 다음 줄로 갑니다.
//(Line feed)
//의미가 여기서 끝내고 다음줄로 넘어가라는 의미이다.입력후다음줄가라.
//sc.nextLine();
if(str.equals("exit\r\n")) {//exit들어오면 더이상 코드수행하지않고 종료해라
break;
}else {
fos.write(str.getBytes());
//문자형을 바이트형태로 넣어준것이다.
//이걸 DataOutputStream을쓰면 자료형을 통해 넣어줄수있다.
//쓰기 메소드를 통해서 쓸것이다.문자를 byte형태로 내보낸다.
}
}
}catch(FileNotFoundException e) {
e.printStackTrace();
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//FOS로 해서 자동완성 쓰기
}
public void subStream() {
System.out.print("저장할 파일명 입력 : ");
String fileName = sc.next();
sc.nextLine();
try(DataOutputStream dos = new DataOutputStream(new FileOutputStream(fileName))){
//이녀석은 보조스트림이기때문에 부가적인기능이다. 이걸 주 스트림이필요한데
//이걸 FileOutputStream을 만들어주겠다.
//풀어서 쓰면 FileOutputStream fos = new FileOutputStream(fileName);
//주스트림 생성
//DataOutputStream dos = new DataOutputStream(fos);
//주스트림 fos를 보조할 보조스트림 생성
//주스트림만으로도 되는데 더 잘 흘러가라고 보조스트림을 만들어준것이다.
System.out.print("'"+fileName+"' 파일에 저장될 내용 입력 : ");
System.out.println("종료는 exit");
int lineNumber=1;
while(true) {
System.out.print((lineNumber++)+" : ");
String str = sc.nextLine();
//+"\r\n"; 써주면 줄바꿈이다.
if(str.equals("exit")) {
break;
}else {
dos.writeChars(str);
}
}
}catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
public void charPrimaryStream() {
System.out.print("저장할 파일 명 : ");
String fileName=sc.next();
sc.nextLine();
try(FileWriter fw = new FileWriter(fileName)){
System.out.println("'"+fileName+"' 파일에 저장될 내용 입력");
System.out.println("종료는 exit");
int lineNumber=1;
while(true) {
System.out.print((lineNumber++)+" : ");
String str = sc.nextLine();
if(str.equals("exit")) {
break;
}
fw.write(str+"\r\n");
}
}catch(FileNotFoundException e) {
e.printStackTrace();
}
catch(IOException e) {
e.printStackTrace();
}
}
public void charSubStream() {
System.out.print("저장할 파일명 입력 : ");
String fileName = sc.next();
sc.nextLine();
try(BufferedWriter bw = new BufferedWriter(new FileWriter(fileName))){
System.out.println("'"+fileName+"'파일에 저장될 내용 입력");
System.out.println("종료는 exit");
int lineNumber =1;
while(true) {
System.out.print((lineNumber++)+" : ");
String str = sc.nextLine();
if(str.equals("exit")) {
break;
}
bw.write(str);
bw.newLine();//엔터부분을 자동으로 처리한다.
//\r\n으로 처리한것이다.
}
}catch(FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}
}
public void ex1() {
try(FileOutputStream fos = new FileOutputStream("sample.dat")){
fos.write(120);//숫자를 입력해보겠다.
//120을 보낸다. 그다음에
byte[] bar = {10,20,30,40,50};
//배열을 넣어준다.
fos.write(bar);
//배열의 값들이 들어간다.
fos.write(bar, 1, 3);
//배열이름과 index를 넣어줬다.
}catch(FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}
}
//파일이 16진수로 저장이 될테니 그걸 16진수값으로 해서 바꿔볼 것이다.
//메모장엔 안나오니 notepad++를 써서 해보자
public void test() {//16진수값알아보기
System.out.print("값입력 : ");
String str = sc.nextLine();
StringTokenizer sT = new StringTokenizer(str," ");
ArrayList<Integer> val = new ArrayList<>();
while(sT.hasMoreTokens()) {
val.add(Integer.parseInt(sT.nextToken(),16));
}
System.out.println(val);
}
public void fileSave() {
try(FileWriter fw = new FileWriter("sample.txt")){
fw.write("당산 java반");
fw.write('A');
char [] car = {'a','p','p','l','e'};
fw.write(car);
}catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
public void fileLoad() {
try(FileReader fr = new FileReader("sample.txt")){
//읽어올 데이터가 없으면 -1을준다. 정수형태로 읽어오는데 정수형태로 읽을데이터 없으면 -1을준다.
int val;//변수만들어서 넣었는데 변수 안만들고 넣으면 안된다.
while((val=fr.read())!=-1) {
System.out.print((char)val);//문자형태로 보고싶기때문에 캐릭터형으로 변환을 했다.
}
//while(fr.read()!=-1){
//sysout((char)fr.read());
//}이렇게 읽어올경우 제대로 못갖고 온다. 중간에 스펠링이 하나씩 빠지는 것이다.
//그래서 변수를 줘서 처리를 하는 것이다.
//이렇게할경우 값을 2번씩 읽어오기때문에 2번째 것만 출력이 된다는 것이다.그럼 제대로 출력이 안된다.
}catch(FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}
}
}
=======================================================
package kh.java.test;
import java.io.*;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class ImageStream {
public void main() {
try(BufferedReader br = new BufferedReader(new FileReader("quiz.txt"));
FileOutputStream fos = new FileOutputStream("test.gif")){
//quiz.txt파일을 읽어온후 값을 test.gif로 내보낼것이다.
//text는 문자형태로 읽어오는거라 Reader을 쓴거고
//내보낼것은 그림형식이라 파일을 내보낼것이기 때문이다.
//내보낼때는 byteStream쓸것이다.
//문자의 최고 는 Reader/Writer이고
//바이트의 최고는 InputStream, OutputStream이다.
//문자를 읽어오는거라 Reader을 썼고
//내보는거라 OutputStream을 썼다.
ArrayList<Byte> a1 = new ArrayList<>();
StringTokenizer sT = new StringTokenizer(br.readLine(), " ");
//readLine라는건 한줄단위로 읽어오는 것이다.
//결론적으로 quiz.txt라는것에서 한줄을 읽어온다.
//Token은 Token단위로 데이터를 끊어서 저정할때 썼다.
//공백단위로 값을 주기때문에 공백으로 하였다.
//한줄 읽어오는데 공백단위로 끊었다.
//sT라는곳에 원하는 데이터가 있을것이다.
//그걸 arrayList에넣어주겠다.
while(sT.hasMoreTokens()) {
//꺼내올 데이터가 있으면 true, 없으면 false
a1.add((byte)(Integer.parseInt(sT.nextToken(),16)));
//여기에 올 진수는 16진수야 이걸 10진수로 바꿔
//Integer을쓰면 int형태로 바꾸는데 이걸16진수로 바꿔서 넣어.
//byte이므로 형변환을 해줄것이다.
//byte타입으로 형변환 하였고
//정수로 반환 받을것인데 nextToken으로 16진수라고 명시해놓았다.
//그걸 꺼내서 10진수로 바꿔서 그걸 arrayList에넣어줄것이다.
//중복될수도있고 파일의 끝도 모르므로 arrayList에 넣을것이다.
//지금까진 스트림으로 연결후 파일을 받아와서 arrayList에저장까지한상태이다.
}
for(int i=0; i<a1.size();i++) {
fos.write(a1.get(i));
}//arrayList를 하나씩 받아와서 이걸 fos에다가 저장을 해서 파일을 만들것이다.
//arrayList처음부터 마지막까지 반복해라.
System.out.println(a1);
}catch(FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}
}
}
===================================================================