Stream. 종류가 몹시 다양. 파이프라인 개념
기본 입력 스트림(in): 데이터를 전송할 때 그 사이즈는 1byte단위
import java.io.IOException;
public class Test01 {
public static void main(String[] args) throws IOException {
int data;
System.out.print("문자열 입력[ctrl+z]: ");//abfdg123
while((data=System.in.read())!=-1){ //System.in.read() 1byte씩 읽음
char ch = (char)data;
System.out.print(ch);
}
}
}
기본 출력 스트림(out)
import java.io.IOException;
import java.io.OutputStream;
public class Test02 {
public static void main(String[] args) throws IOException {
OutputStream os = System.out;
//출력시 사용하는 가장 보편적인 스트림. 스트림안에 스트림을 넣을 수 있음
//System.out은 1byte씩만 출력할 수 있음. 이걸 OutputStream 에 넣은 것.
//buffer 생성
byte[] b = new byte[3]; //배열에 데이터를 집어넣고 배열을 통채로 전송하는 방식 -> Buffer
b[0] = 65;
b[1] = 97;
b[2] = 122;
//저장시 아스키코드로 바뀜
os.write(b);//OutputStream의 write메소드를 이용해서 한번에 출력
os.close();
//System.out이 닫혀서 메모리상에서 내려옴.
//실행해도 아래줄이 보이지 않음.
System.out.println("나보이냐?");
}
}
InputStreamReader
1byte Stream을 2byte Stream으로 변환해주는 Stream
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
public class Test03 {
public static void main(String[] args) throws IOException{
int data;
System.out.print("문자열 입력: ");
//InputStramReader : 브릿지클래스
Reader rd = new InputStreamReader(System.in);
//Reader: 읽어온 데이터를 잠깐 담아두는 클래스. Abstract class for reading character streams
//Reader보다 BufferedReader가 더 빠름
//rd에 더 이상 읽을게 없을 때까지 실행
while((data=rd.read())!=-1){//read() : Reads a single character. data: 아스키코드값을 읽으므로 Integer 사용
char ch = (char)data;
System.out.print(ch);
}
}
}
OutputStreamWriter
1byte Stream을 2byte Stream으로 변환 해주는 Stream
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
public class Test04 {
public static void main(String[] args) throws IOException {
int data;
System.out.print("문자열 입력: ");
Reader rd = new InputStreamReader(System.in);
Writer wr = new OutputStreamWriter(System.out); //so를 osw로 감싸고 osw를 w로 감싼 것.
while((data=rd.read())!=-1){
wr.write(data); //write(): Writes a single character.
wr.flush(); //이 메소드가 없을 경우 버퍼가 꽉 차지않으면 내보내지 않음.
}
}
}
FileInputStream
파일을 찾아서 읽는 스트림
import java.io.FileInputStream;
public class Test05 {
public static void main(String[] args) {
//Stream사용 시 반드시 try로 묶어줘야 함. 아니면 예외처리를 넣어 줘야 함
try {
FileInputStream fis = new FileInputStream("d:\\doc\\test.txt");
int data;
while((data=fis.read())!=-1){//Reads a byte of data from this input stream.
//System.out.print((char)data);
System.out.write(data);//엔터를 기준으로 내보냄.
System.out.flush();//엔터치지 않은 데이터도 내보냄
}
fis.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
FileOutputStream
파일을 생성할때 사용하는 스트림
A file output stream is an output stream for writing data to a File or to a FileDescriptor
import java.io.FileOutputStream;
public class Test06 {
public static void main(String[] args) {
try {
FileOutputStream fos = new FileOutputStream("d:\\doc\\out.txt");
int data;
System.out.print("문자열 입력: ");
while((data=System.in.read())!=-1){// System.in.read() 아스키코드로 읽음
fos.write(data);//입력시 어디가 끝인지 모름. ctrl+z로 종료
fos.flush();
}
fos.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
파일 복사프로그램 만들기
원본 파일?:d:\\doc\\test.txt
대상 파일?:d:\\doc\\abc.txt
복사 성공
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Scanner;
public class Test07 {
public static void main(String[] args) {
try {
Scanner sc = new Scanner(System.in);
int data;
String str1, str2;
System.out.print("원본파일경로?:");// d:\\doc\\test.txt
str1 =sc.next();
System.out.print("대상파일경로?:");// d:\\doc\\out2.txt
str2 =sc.next();
FileInputStream fis = new FileInputStream(str1); //파일읽기
FileOutputStream fos = new FileOutputStream(str2);//파일생성
while((data=fis.read())!=-1){//읽은 파일(fis)에 데이터가 있을 동안 실행
fos.write(data);//fos에 해당 데이터를 써라
fos.flush();
}
fis.close();
fos.close();
System.out.println("복사성공!");
sc.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
byte배열의 버퍼를 만들어 파일 복사
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Scanner;
public class Test08 {
public boolean flieCopy(String file1, String file2){
File f = new File(file1);//파일 경로에 대한 정보
if(!f.exists()){//해당 파일 없으면 종료
return false;
}
try {
FileInputStream fis = new FileInputStream(f);//f, file1 뭘 써도 상관 없음. f에 file1를 넣어놨기 때문
FileOutputStream fos = new FileOutputStream(file2);
//**버퍼를 사용해서 while문 쓰는 건 자주 사용**
int data;
byte[] buffer= new byte[1024];//1024byte크기의 버퍼 생성
while((data=fis.read(buffer, 0, 1024))!=-1){//해당 범위에 있는 버퍼의 데이터를 0번째부터 1024번째까지 모두 읽어라
fos.write(buffer, 0, data); //data는 byte
}
fis.close();
fos.close();
} catch (Exception e) {
System.out.println(e.toString());
return false;
}
return true;
}
public static void main(String[] args) {
Test08 ob = new Test08();
Scanner sc= new Scanner(System.in);
String file1, file2;
System.out.print("원본파일?:");
file1 =sc.next();
System.out.print("대상파일?:");
file2 =sc.next();
if(ob.flieCopy(file1, file2)){
System.out.println("파일 복사 성공!");
}else{
System.out.println("파일 복사 실패!");
}
sc.close();
}
}
BufferedReader
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
public class Test09 {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("d:\\doc\\test.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
//InputStreamReader에 매개변수를 파일 할당 가능. 파일을 읽어서 br(버퍼)에 저장. 같은 패키지에 없다면 경로를 써줘야 함
String str;
//readLine()메소드의 리턴 값은 String. String 값이 없을 경우는 null에 해당
while((str=br.readLine())!=null){
System.out.println(str);
}
fis.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
PrintStream
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
public class Test10 {
public static void main(String[] args) {
try {
FileOutputStream fos = new FileOutputStream("d:\\doc\\out1.txt");//파일생성
PrintStream ps = new PrintStream(fos); //PrintStream은 기본생성자가 없음. 반드시 파일 위치 알려줘야 함
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("문자열입력?");
String str;
while((str=br.readLine())!=null){//br에 있는 데이터를 엔터 단위로 묶어서 String으로 읽어라. null이 나올 때까지
ps.println(str);//ps 스트림에 출력
}
//사용한 파일은 항상 닫아주기
ps.close();
fos.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
FileOutputStream
import java.io.FileOutputStream;
import java.io.PrintStream;
public class Test11 {
public static void main(String[] args) {
try {
//이런식으로 생성하는 것도 가능
FileOutputStream fos;
PrintStream ps;
//fos = new FileOutputStream("d:\\doc\\out3.txt");
ps = new PrintStream(new FileOutputStream("d:\\doc\\out3.txt"));
ps.println("배수지");
ps.println("박신혜");
ps.println("김태리");
ps.println("김태희");
ps.println("김고은");
//fos.close();
ps.close();
//-----------------------------------------------------------------
//true:append
fos = new FileOutputStream("d:\\doc\\out3.txt",true);
//누적해서 저장. True가 없을 경우 월화수목금만 나오게 됨. 갈아엎음
ps = new PrintStream(fos);
ps.println("월요일");
ps.println("화요일");
ps.println("수요일");
ps.println("목요일");
ps.println("금요일");
fos.close();
ps.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
[File 클래스]
파일 및 폴더를 관리할 수 있도록 기능을 제공해주는 클래스
파일의 복사 또는 이름 변경 등의 조작을 할 경우에만 사용되고
파일의 내용을 입출력하는 메소드는 제공되지 않는다.(내용 수정 불가)
import java.io.File;
import java.io.IOException;
import java.util.Date;
public class Test12 {
public static void main(String[] args) throws IOException {
File f = new File("d:\\doc\\test.txt");
//f가 경로,파일명,내용까지 앎. 기본경로에 있는 파일을 이용할 경우 file이름으로 설정.
// \\.. 상위디렉토리
//getAbsolutePath() : 실행 위치 또는 드라이브를 기반으로 경로를 해결합니다.
//getCanonicalPath() : 시스템 의존한다. 경로가 나타내는 고유 한 위치가 해결됩니다.
//따라서 경로에 "."이 있으면 일반적으로 제거됩니다.
System.out.println("파일정보.............");
System.out.println("파일명: " + f.getName());
System.out.println("파일크기: " + f.length());//파일길이
System.out.println("파일경로: " + f.getAbsolutePath());
System.out.println("표준경로: " + f.getCanonicalPath());
System.out.println("만든날: " + new Date(f.lastModified()));//lastModified() f의 마지막으로 변경된 일자
System.out.println("파일상위경로: " + f.getParent());
System.out.println("읽기속성: " + f.canRead());
System.out.println("쓰기속성: " + f.canWrite());
//현재 작업경로
String path = System.getProperty("user.dir");//user.dir는 시스템 변수.
System.out.println("현재 작업경로 : " + path);//이클립스가 실행되는 현재 작업경로 뜸
}
}
실행 후 문자를 입력하면 폴더와 함께 파일이 생성됨
import java.io.File;
import java.io.FileOutputStream;
public class Test13 {
public static void main(String[] args) {
String str = "d:\\doc\\java\\stream\\text.txt";
//idx 012 3456 78901 2345678 90
//[방법1]
String path = str.substring(0, str.lastIndexOf("\\"));
//System.out.println(path); //d:\doc\java\stream 눈으로 보기엔 \\두개지만 컴퓨터에서는 \로 인식됨
File f = new File(path);
if(!f.exists()){//f가 없으면 디렉토리를 만들어라. Creates the directory named by this abstract pathname.
f.mkdirs();
}
//----------------------------------------------------------
//[방법2]
/*
File d = new File(str);
if(!f.getParentFile().exists()){ //f가 없으면 디렉토리를 만들어라
d.getParentFile().mkdirs();
}
*/
try {
FileOutputStream fos = new FileOutputStream(str);
System.out.print("문자열 입력:");
int data; //유니코드(아스키코드)로 읽으니까 int형
while((data=System.in.read())!=-1){
fos.write(data);
fos.flush();
}
fos.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
FileFilter 인터페이스 : 폴더의 전체를 보여주는 역할을 함
import java.io.File;
import java.io.FileFilter;
class MyFileList implements FileFilter{
private File f;
//Spring 의존성주입
public MyFileList(String filePath) {//생성자에서 특정 파일의 객체를 생성할 수 있음. 중요
f = new File(filePath);//파일경로를 입력받아 파일 f 객체 생성
}
public void result(){
try {
if(!f.exists()){//파일 없으면 메세지 띄우고 종료.
System.out.println("파일이 없습니다.");
return;
}
System.out.println("절대경로: " + f.getAbsolutePath());
System.out.println("파일사이즈: " + f.length());
//디렉토리(폴더)인 경우 실행
if(f.isDirectory()){//isDirectory메소드. boolean반환. 있으면 T, 없으면 F
//File[] : D드라이브를 클릭 했을때 폴더 다양. 폴더를 배열에다 넣어놓은 개념
//accept메소드에서 FileFilter 인터페이스로 리턴할 대상을 지정
File[] lists = f.listFiles(this); //accept메소드를 통해 저장된 내용이 this에 있음
System.out.println("\n폴더의 내용.........");
for(int i=0;i<lists.length;i++){
System.out.print(lists[i].getName());
System.out.println("\t" + lists[i].length());
}
}
System.out.println("\n디렉토리 구조....");
File[] root = File.listRoots();//File클래스의 static메소드 : listRoots
for(int i=0;i<root.length;i++){
System.out.println(root[i].getPath());
}
//C:
//D: 형식으로 보여줄 것
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public boolean accept(File pathname) {
//accept()메소드 호출하지 않아도 스스로 실행됨.
//하드디스크에 가서 사용자가 입력한 파일과 폴더의 내용을 받음. 받아서 this에 리턴값 반환.
return pathname.isFile() || pathname.isDirectory() ;
}
}
public class Test14 {
public static void main(String[] args) {
MyFileList m = new MyFileList("c:\\windows");
m.result();
}
}
RandomAccessFile
파일을 랜덤하게 읽고 쓸수 있는 클래스
RandomAccessFile클래스 생성시 mode옵션으로 '읽기 전용' 또는 '읽고 쓰기 가능'으로 설정 가능
import java.io.File;
import java.io.FileOutputStream;
import java.io.RandomAccessFile;
public class Test15 {
public static void main(String[] args) {
try {
//File.createTempFile(prefix, suffix)
//- 환경 변수로 지정된 tmp 디렉토리에 자동으로 생성된다.
File f = File.createTempFile("imsi", "tmp"); //(파일, 모드). 비어있는 임시파일 객체 생성
System.out.println(f.getName());
f.deleteOnExit();//해당 메소드를 호출 하면 jvm이 종료 될때, 자동으로 임시파일이 삭제된다.
FileOutputStream fos = new FileOutputStream(f);
//파일 작성
for(int i=0;i<100;i++){
fos.write(i);
}
fos.close();
RandomAccessFile raf = new RandomAccessFile(f, "rw"); //f의위치, read,write기능 가능
for(int i=0;i<=100;i++){
raf.seek(i);//찾아라
System.out.println("raf.seek(" + i + "): "+raf.readByte());
//읽어라. Reads a signed eight-bit value from this file.
}
raf.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
단순히 Buffer를 사용한 예제
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class Test16 {
public final static int BUFFER_SIZE = 512;
public static void main(String[] args) {
byte[] buffer = new byte[BUFFER_SIZE];
try {
FileInputStream fis = new FileInputStream("d:\\doc\\test.txt");
FileOutputStream fos = new FileOutputStream("d:\\doc\\out5.txt");
//Buffer로 한번 더 감싸준 형태
BufferedInputStream bis = new BufferedInputStream(fis);
//버퍼로 된건 속도가 좀더 빠르기 때문에 fis, fos를 버퍼로 한번 더 감싸준 것
BufferedOutputStream bos = new BufferedOutputStream(fos);
int data, len=0;
while((data=bis.read(buffer))!=-1){
System.out.println("읽은 문자길이: " + data);
len += data;//누적
bos.write(buffer,0,data);//byte배열 buffer를 0~data까지 작성
bos.flush();
}
System.out.println("읽어들인 전체길이: " + len);
fis.close();
fos.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
FileWriter
출력할 유니코드 문자열을 시스템에 맞는 디폴트 문자 인코딩의 바이트로 변환해서 파일에 저장.
BufferedWriter
다른 출력 스트림을 생성자의 인자로 받아 생성하며
문자를 버퍼링 하는것에 따라 문자.배열 또는 스트링을 문자 형태로 출력한다.
-> 문자/바이트 스트림을 버퍼로 출력한다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test17 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
FileWriter fw = new FileWriter("d:\\doc\\out6.txt");
BufferedWriter bw = new BufferedWriter(fw);
String str;
System.out.println("문자열 입력: ");
while((str=br.readLine())!=null){
bw.write(str);
bw.newLine();//str + "\r\n"(엔터)
}
bw.close();
fw.close();
}
}
FileReader
BufferedReader
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
public class Test18 {
public static void main(String[] args) throws FileNotFoundException {
FileReader fr = new FileReader("d:\\doc\\test.txt");
BufferedReader br = new BufferedReader(fr);
try {
String str;
while((str=br.readLine())!=null){
System.out.println(str);
}
fr.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
DataOutputStream
DataInputStream
boolean, byte, char등의 자료형을 직접 읽을 수 있게 해주고
이러한 읽기 동작은 사용하는 플랫폼과는 무관하게 동작한다.
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class Test19 {
public static void main(String[] args) {
try {
//파일을 읽기 위해서 반드시 필요 : FileInputStream
//파일을 만들기 위해서 반드시 필요 : FileOutputStream
//DataInputStream. 텍스트파일을 열면 깨져서 보이지만 내용은 잘 저장된것. os가 달라도 잘 읽음
FileOutputStream fos = new FileOutputStream("d:\\doc\\data.txt");//file 내보내라
DataOutputStream dos = new DataOutputStream(fos); //한번더 DataOutputStream으로 감싸준것. 그 데이터 타입대로 저장해라
dos.writeUTF("대한민국");
dos.writeByte(10);
dos.writeChar('A');
dos.writeInt(20);
dos.writeUTF("서울");
fos.close();
dos.close();
FileInputStream fis = new FileInputStream("d:\\doc\\data.txt");
DataInputStream dis = new DataInputStream(fis);
//위의 순서대로 호출
System.out.println(dis.readUTF());
System.out.println(dis.readByte());
System.out.println(dis.readChar());
System.out.println(dis.readInt());
System.out.println(dis.readUTF());
fis.close();
dis.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
StringReader
StringWriter
StringBuffer,StringBuilder가 이미 있어서 많이는 안씀
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
public class Test20 {
public static void main(String[] args) throws IOException {
int ch;
String str = "Hello!!....";
StringReader sr = new StringReader(str);
StringWriter sw = new StringWriter();
while((ch=sr.read())!=-1){
sw.write(ch);
}
System.out.println(sw.toString()); //문자 바로 출력
StringBuffer sb = sw.getBuffer(); //문자 버퍼에 저장 후 출력
System.out.println(sb.toString());
}
}
'Dev > Java' 카테고리의 다른 글
[java] 윈도우,swing (0) | 2019.01.31 |
---|---|
[java] 객체의 직렬화, 역직렬화 (0) | 2019.01.31 |
[java] 스레드 (0) | 2019.01.28 |
[java] ArrayList, List, Map, Generic, Exception (0) | 2019.01.27 |
[java] 내부클래스, 익명의클래스(Annonymous), Vector (0) | 2019.01.27 |