1. 파일 생성, 리스트 확인
package io;
//필수로 해당 코드 중 사용하는 라이브러리가 정상적으로 로드가 되었는지를 꼭!! 확인하시길 바랍니다.
import java.io.File;
import java.util.Arrays;
import java.util.Scanner;
//io 복습1
/*
I/O => try ~ catch 필수
String : Reader, Writer
byte : InputStream, OutputStream
memory : Buffered => 단독으로 선언하지 않음
*/
public class java_io1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
try {
/* //해당 코드중 중요사항 디렉토리 생성 후 파일 생성
System.out.println("해당 파일을 생성할 디렉토리 경로 및 파일명을 입력하세요 : ");
String url = sc.nextLine();
File f = new File(url);
//여기서 없는 디렉토리쓰면 생성안됨 mkrie()사용
f.mkdir();
f.createNewFile(); //io 해당 경로에 파일 생성
*/
System.out.println("불러올 디렉토리 경로를 입력하세요 : ");
String url = sc.nextLine();
File f = new File(url);
//list() : 문자 월시 배열, listFiles() : File 자료형 배열
String filename[] = f.list(); //해당 경로의 모든 파일 출력
System.out.println("list() : "+Arrays.asList(filename));
//listFiles() : File 원시배열, 파일명을 로드할 경우 .getName()
File filename2[] = f.listFiles();
System.out.println("listFiles() : "+Arrays.asList(filename2));
System.out.println(filename2[0].getName());
}catch (Exception e) {
}finally {
sc.close();
}
}
}
😊응용문제
해당 배열의 파일명이 해당 디렉토리에 모두 생성되도록 코드 작성
0.png, 1.png, 2.png, 2.png, 3.png, 4.png
ftp 디렉토리에 파일 생성
package io;
import java.io.File;
import java.util.Arrays;
public class java_io2 {
public static void main(String[] args) {
int fn[] = {0, 1, 2, 3, 4};
String url = "/Users/nayeong/Documents/java_etc/ftp/";
try {
//파일 생성
int i = 0;
while(i<fn.length) {
File f = new File(url+fn[i]+".png");
f.createNewFile();
i++;
}
//디렉토리 확인
File check = new File(url);
System.out.println(Arrays.asList(check.list()));
}catch (Exception e) {
System.out.println("오류 발생");
}finally {
}
}
}
2. 파일 삭제
package io;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
//파일 삭제
public class java_io3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("삭제할 파일명을 입력하세요(속성명 포함) : ");
String filename = sc.nextLine(); //한칸 띄울수도있으니 nextLine
String url = "/Users/nayeong/Documents/java_etc/ftp/";
File f = new File(url); //디렉토리를 오픈
try {
// String files[] = f.list();
//List 인터페이스 배열로 해당 디렉토리 전체 파일 목록을 저장시킴
List<String> fm = new ArrayList<String>(Arrays.asList(f.list()));
for(String n : fm) {
if(n.equals(filename)) {
File f2 = new File(url + filename);
f2.delete(); //delete() : 디렉토리 삭제, 파일 삭제 모두 가능함
}
}
}catch (Exception e) {
System.out.println("해당 경로가 확인되지 않습니다.");
}finally {
sc.close();
}
}
}
3.Reader, Writer
package io;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.Reader;
import java.io.Writer;
import java.util.Scanner;
//Reader, Writer
public class java_io4 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
try {
System.out.println("해당 파일 경로 전체를 입력하세요 : ");
String msg = "난 정말 귀여워";
String url = sc.nextLine();
File f = new File(url);
//Writer : 부모클래스, 다양한 여러가지 형태의 클래스를 호출할 수 있음
//true : 지속적으로 데이터 누적, 기본(false) : 초기화
Writer w = new FileWriter(f, true); //FileWriter : 저장
w.write(msg);
// w.flush(); //ASCII는 안써도되는데 binary는 써야함 or 메모리 활용할때(BufferedWriter)
w.close();
//Reader의 기본자료형 : char
//Buffered 메모리이며 writer 사용시에는 flush() 사용
Reader r = new FileReader(f); //FileReader : 불러오기
BufferedReader br = new BufferedReader(r);
//read() : 메모리에 할당된 크기 (단어별 ASCII 코드)
//readLine() : 메모리에 할당된 문자열 (단어별 ASCII 코드를 String 변환)
System.out.println(br.read());
System.out.println(br.readLine());
br.close();
r.close();
}catch (Exception e) {
}finally {
sc.close();
}
}
}
😊응용문제
ftp 디렉토리에 data.txt가 있습니다.
해달 내용을 배열로 변환하여 console로 출력
package io;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.Reader;
public class java_io5 {
public static void main(String[] args) {
java_io5box ib = new java_io5box();
try {
ib.txtToArray();
}catch (Exception e) {
}
}
}
class java_io5box{
public void txtToArray() throws Exception{
String url = "/Users/nayeong/Documents/java_etc/ftp/data.txt";
File f = new File(url);
Reader r = new FileReader(f);
BufferedReader br = new BufferedReader(r);
String pd[] = br.readLine().split(",");
int i = 0;
while(i<pd.length) {
System.out.println(pd[i]);
i++;
}
br.close();
r.close();
}
}
4. nio 파일 핸들링
package io;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
//nio 사용
public class java_io6 {
public static void main(String[] args) {
String url = "/Users/nayeong/Documents/java_etc/ftp/123.txt";
try {
//Path : nio interface = File
//얘는 new쓰는 얘가 아님
Path ps = Paths.get(url); //해당 디렉토리에 파일을 로드
List<String> data = Files.readAllLines(ps);
System.out.println(data);
byte[] data2 = Files.readAllBytes(ps);
String str = new String(data2); //byte를 String으로 바꾸는 법!
System.out.println(Arrays.asList(str));
//파일 생성
Path mkps = Paths.get("/Users/nayeong/Documents/java_etc/ftp/aaa.txt");
Files.createFile(mkps);
//디렉토리 생성
Path mkdr = Paths.get("/Users/nayeong/Documents/java_etc/ftp/aaa");
Files.createDirectory(mkdr);
}catch (Exception e) {
System.out.println("파일 경로 오류!!");
}
}
}
- 동기(sync) : 순차적으로 데이터를 처리 - 단점 : 하나 처리하면 뒤에 애들이 기다려야함
비동기(async) : 여러가지 처리 데이터를 각각 처리할 수 있는 기능 - 단점 : 오류나면 파악이 어려움
io : 순차적으로 처리 (동기) - 단방향
nio : 다중처리 방식 (비동기) - 양방향
나중에 배울 ajax(비동기) -> (조금 느려지지만 동기 방식도 사용할 수 있음) - Files : new 안씀 => Files.메소드 //close도 없음
File 형태의 createfile, mkdir() => 객체 생성 및 인스턴스
Files.copy() : 복사
Files.createFile() : 파일 생성
Files.createDirectory() : 디렉토리 생성
Files.delete() : 파일 및 디렉토리 삭제
Files.list() : 디렉토리 안 파일 확인
Files.write() : 파일 쓰기
Files.readAllLines() : 파일 안 데이터를 전체 확인
Files.read() : 파일 읽기
5. Stream
파일 속 내용 읽기
package io;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
public class java_io7 {
public static void main(String[] args) {
String url = "/Users/nayeong/Documents/java_etc/ftp/data.txt";
try {
/*
핸들링 두가지 방식
1. Stream => File => InputStream 추가
2. InputStream(문자경로)
*/
InputStream is = new FileInputStream(url); //File f = new File(url); 해서 f를 여기에 넣어도 됨
//1024 = 1KB
byte data[] = new byte[is.available()]; //available() : 용량 확인 (내용이 아니고 파일 크기)
is.read(data); //read 전체를 모두 읽어들임
// is.read(data,5,10); //read(byte,0,범위byte크기)
String word = new String(data);
System.out.println("word : " + word);
List<byte[]> alldata = new ArrayList<>(Arrays.asList(data));
//반복문 없이 해당 클래스 배열을 byte로 변환 후 출력
byte[] c = alldata.get(0);
System.out.println("c : " + new String(c));
//반복문을 이용하여 해당 클래스의 내용을 String으로 변환 후 출력 => buffered쓰면 편함
for(byte[] f : alldata) {
System.out.println("for-each : " + new String(f));
}
is.close();
}catch (Exception e) {
}finally {
}
new ex();
}
}
//부가적인 설명 클래스 배열
class ex{
public ex() {
List<String> result = null; //여기 List는 못들어감 엄마가 둘이됨 => ArrayList, LinkedList는 가능
result = this.aaa();
// result = this.bbb(); //함수 안에서 자식인스턴스를 만들어 리턴하면 가능
// result = this.ddd(); //남의 자식이어서 안됨
Map<String, String> result2 = null;
result2 = this.eee();
File abc = this.fff();
InputStream is = this.ggg(); //InputStream는 인터페이스는 아니지만 추상클래스여서 이런게 가능함 (부모클래스, 자식클래스)
// FileInputStream fis = this.hhh(); //부모가 뒤에가버림 -> 오류
}
public ArrayList<String> aaa(){
return null;
}
public List<String> bbb(){
return null;
}
public LinkedList<String> ccc(){
return null;
}
public Map<String, String> ddd(){
return null;
}
public HashMap<String, String> eee(){
return null;
}
public File fff(){
return null;
}
public FileInputStream ggg(){
return null;
}
public InputStream hhh(){
return null;
}
}
- Stream (ASCII + binary) : byte
ASCII도 쓰긴 하는데 binary에 쓰는 것이 바람직함
binary : 2진법 (0, 1)
Stream -> txt, pdf, jpeg, mp4, exe, bat
Binary를 다루는 프로그램 : C, C++, Java, Python
한글.jpg 한글.txt => 서버에 올리면 다깨짐 => 파일명을 cdn0.jpg 이런식으로 바꿔서 올라가게 처리해야함 - 1Mb 와 1MB의 차이 : 바이트는 대문자 비트는 소문자!! 주의
- 핸들링 두가지 방식
- 1. Stream => File => InputStream 추가
- 2. InputStream(문자경로)
파일에 저장 및 복사
package io;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Scanner;
public class java_io8 {
public static void main(String[] args) {
String url = "/Users/nayeong/Documents/java_etc/ftp/222.txt";
Scanner sc = new Scanner(System.in);
try {
System.out.println("입력하실 단어를 적어주세요 : ");
String msg = sc.nextLine(); //사용자가 입력한 값(String)
OutputStream os = new FileOutputStream(url); //byte
os.write(msg.getBytes()); //getBytes() : String을 byte로 변환
os.close();
}catch (Exception e) {
System.out.println("파일 경로가 잘못되었습니다.");
}finally {
sc.close();
}
}
}
- 단독으로 Stream만 사용할 경우
inputStream => byte[] => available() => read, readline
OutputStream => getBytes() => write
package io;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
//읽는 방법 1.Stream + Buffered => byte
public class java_io9 {
public static void main(String[] args) {
String url = "/Users/nayeong/Documents/java_etc/ftp/222.txt";
try {
InputStream is = new FileInputStream(url);
BufferedInputStream bis = new BufferedInputStream(is);
byte[] data = new byte[bis.available()]; //byte 배열로 데이터를 이관
// int by = bis.read(data); //int로 변환하는 경우 : 이미지, 동영상 등 binary파일 변환할때 사용
bis.read(data); //ASCII인 경우 : 바로 read
String word = new String(data,"UTF-8"); //ASCII의 경우 : new String(byte변수, 언어셋) 사용해서 byte를 String으로 변환
System.out.println(word);
bis.close();
is.close();
new stream_reader().filedata();
}catch (Exception e) {
}finally {
}
}
}
//읽는 방법 2.InputStream + StreamReader + BufferedReader => 반복문
class stream_reader{
String url = "/Users/nayeong/Documents/java_etc/ftp/222.txt";
public void filedata() {
try {
//byte[] 사용하지 않고 읽는법
//readLine():String, read():byte
InputStream is = new FileInputStream(url); //byte
InputStreamReader isr = new InputStreamReader(is); //String변환
BufferedReader br = new BufferedReader(isr); //String
//반복문사용해서 출력해야함
System.out.println(br.readLine());
br.close();
isr.close();
is.close();
}catch (Exception e) {
System.out.println("파일 경로가 올바르지 않습니다.");
}finally {
}
}
}
- 읽는 방법
- 1.Stream + Buffered => byte
- 2.InputStream + StreamReader + BufferedReader => 반복문
package io;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
//OutputStream + Buffered(대용량)
//bynary는 무조건 byte이므로 String으로 변환할 필요가 전혀없음
public class java_io10 {
public static void main(String[] args) {
//이미지 파일 복사
String url = "/Users/nayeong/Documents/java_etc/ftp/cdn_1.jpeg";
try {
InputStream is = new FileInputStream(url); //일단 읽어야 복사 가능 (10MB이상부터는 상당히 느려짐)=>버퍼드인풋사용
byte files[] = new byte[is.available()];
is.read(files);
String copys = "/Users/nayeong/Documents/java_etc/ftp/cdn_copy_1.jpeg";
OutputStream os = new FileOutputStream(copys);
// os.write(files); //Buffered 없이 copy
BufferedOutputStream bos = new BufferedOutputStream(os); //더 빠르게 저장하는 방식 => 영상같은거 처리에 좋음
bos.write(files);
bos.flush(); //메모리를 비워두어야 해당 메모리를 지속적으로 사용 가능
bos.close();
os.close();
is.close();
}catch (Exception e) {
System.out.println("원본 경로 및 사본 경로 주소가 잘못되었습니다.");
System.out.println(e);
}finally {
}
}
}
- 이미지 파일 복사 OutputStream + Buffered(대용량)