지구정복
[JAVA] 11/24 (1)| 2차원 ArrayList, Arrays클래스, File패키지, NIO파일과 디렉토리, IO패키지 본문
[JAVA] 11/24 (1)| 2차원 ArrayList, Arrays클래스, File패키지, NIO파일과 디렉토리, IO패키지
nooh._.jl 2020. 11. 26. 20:18정리
자료구조
1. 집합임시저장
List - 순서, 중복허용(배열 확장)
- ArrayList(Vector)
Set - 순서가 없고, 중복 불허용
- 향상된 for / Iterator
- HashSet
Map - 키, 값 구조
- 키만 가져올 지 / 값만 가져올 지
- HashMap, Properties
*엑셀 형식 처리하기(행과 열이 있는 2차원 배열)
1. 2차원 배열 / 2차원 ArrayList 사용
2. 1차원 배열 + 객체 / 1차원 ArrayList + 객체 (많이 사용)
* 1차원 ArrayList + HashMap
*stack, queue
2. 영구저장 - 파일
ㅇ2차원 ArrayList
package ArrayEx01;
import java.util.ArrayList;
public class ArrayListEx06 {
public static void main(String[] args) {
//arraylist의 제너릭안에 arraylist를 한 번 더 사용한다.
ArrayList<ArrayList<String>> datas = new ArrayList<ArrayList<String>>();
ArrayList<String> data1 = new ArrayList<>();
data1.add("1");
data1.add("2");
data1.add("3");
ArrayList<String> data2 = new ArrayList<>();
data2.add("11");
data2.add("22");
data2.add("33");
ArrayList<String> data3 = new ArrayList<>();
data3.add("111");
data3.add("222");
data3.add("333");
//2차 arraylist에 1차 arraylist 집어넣기
datas.add(data1);
datas.add(data2);
datas.add(data3);
System.out.println(datas.size());
//결과: 3
System.out.println(datas.toString());
//결과: [[1, 2, 3], [11, 22, 33], [111, 222, 333]]
System.out.println(datas.get(0));
//결과: [1, 2, 3]
System.out.println("\n------");
//일반 for문 사용하기
for(int i=0; i<datas.size(); i++) {
for(int j=0; j<datas.get(i).size(); j++) {
System.out.print("\t" + datas.get(i).get(j));
//결과
//1 2 3
//11 22 33
//111 222 333
}
System.out.println();
}
System.out.println("\n------");
//향상된 for문 사용하기
for(ArrayList<String> data: datas) {
System.out.println(data);
------
[1, 2, 3]
[11, 22, 33]
[111, 222, 333]
}
}
}
ㅇArrays 클래스
Arrays 클래스는 배열 조작 기능을 가지고 있다. 배열 조작이란 배열의 복사, 항목 정렬, 항목 검색과 같은 기능을 말한다.
단순한 배열 복사는 System.arraycopy() 메소드를 사용할 수 있으나, Arrays는 추가적으로 항목정렬, 항목검색, 항목비교와 같은 기능을 제공한다.
Arrays 클래스의 모든 메소드는 정적이므로 Arrays 클래스로 바로 사용 가능하다.
-기본 메서드 사용하기
package ArraysClassEx;
import java.util.Arrays;
public class ArraysEx01 {
public static void main(String[] args) {
String[] arrs = {"aaa", "bbb", "ccc"};
System.out.println(Arrays.toString(arrs));
System.out.println("\n---값 치환----");
//전체 데이터를 xxx로 초기화하기
Arrays.fill(arrs, "xxx");
System.out.println(Arrays.toString(arrs));
//부분 데이터를 yyy로 초기화하기 / 0부터 2 전까지
Arrays.fill(arrs, 0, 2, "yyy");
System.out.println(Arrays.toString(arrs));
System.out.println("\n---값비교----");
String[] arrs1 = {"aaa", "bbb", "ccc"};
String[] arrs2 = {"aaa", "bbb", "ccc"};
System.out.println("참조값 비교 : " + (arrs1 == arrs2) ); //참조값 비교
System.out.println("값 비교 : " + Arrays.equals(arrs1, arrs2)); //값의 비교
System.out.println("\n---정렬----");
Integer[] n = {5, 2, 3, 1, 4};
System.out.println("정렬전: " + Arrays.toString(n));
Arrays.sort(n);
System.out.println("정렬후: " + Arrays.toString(n));
}
}
[aaa, bbb, ccc]
---값 치환----
[xxx, xxx, xxx]
[yyy, yyy, xxx]
---값비교----
참조값 비교 : false
값 비교 : true
---정렬----
정렬전: [5, 2, 3, 1, 4]
정렬후: [1, 2, 3, 4, 5]
-배열 복사하기
package ArraysClassEx;
import java.util.Arrays;
public class ArrayCopyExample {
public static void main(String[] args) {
char[] arr1 = {'j', 'a', 'v', 'a'};
//방법1
char[] arr2 = Arrays.copyOf(arr1, arr1.length);
System.out.println(Arrays.toString(arr2));
//방법2
char[] arr3 = Arrays.copyOfRange(arr1, 1, 3);
System.out.println(Arrays.toString(arr3));
//방법3
char[] arr4 = new char[arr1.length];
System.arraycopy(arr1, 0, arr4, 0, arr1.length);
for (int i=0; i<arr4.length; i++) {
System.out.println("arr4[" + i + "]=" + arr4[i]);
}
}
}
[j, a, v, a]
[a, v]
arr4[0]=j
arr4[1]=a
arr4[2]=v
arr4[3]=a
-사용자 정의 클래스 배열 항목 정렬하기
기본 타입 또는 String 배열은 Arrays.sort() 메소드의 매개값으로 지정해주면 자동으로 오름차순 정렬이 된다.
사용자 정의 클래스 타입일 경우에는 클래스가 Comparable 인터페이스를 구현하고 있어야 정렬이 된다.
Member 클래스에서 compareTo() 메서드를 재정의한다.
이 메소드의 리턴값은 오름차순일 때 자신이 매개값보다 낮을 경우 음수, 같을 경우 0, 높을 경우 양수를 리턴한다.
반대로 내림차순일 때 자신이 매개값보다 낮을 경우 양수, 같은 경우 0, 높을 경우 음수를 리턴하면 된다.
name 필드값으로 정렬을 하면 유니코드로 비교를 해야하므로 String의 compareTo() 리턴값을 사용한다.
Member클래스
package ArraysClassEx;
public class Member implements Comparable<Member> {
String name;
private int serial;
public Member(String name, int serial) {
this.name = name;
this.serial = serial;
}
public Member(String name) {
this(name, 1111);
}
@Override
public int compareTo(Member arg0) {
return name.compareTo(arg0.name);
}
}
main클래스
package ArraysClassEx;
import java.util.Arrays;
public class SortExample {
public static void main(String[] args) {
Member m1 = new Member("홍길동");
Member m2 = new Member("박동수");
Member m3 = new Member("김민수");
Member[] members = {m1, m2, m3};
Arrays.sort(members);
for(int i=0; i<members.length; i++) {
System.out.println("member["+i+"].name="+members[i].name);
}
}
}
member[0].name=김민수
member[1].name=박동수
member[2].name=홍길동
ㅇFile
package FileEx;
import java.io.File;
public class File05 {
public static void main(String[] args) {
//디렉토리 내부의 디렉토리나 파일목록 가져오기
//list() - String[] 배열로 가져오기
//listFiles() - File[] 배열로 가져오기
File f = new File("c:\\SelfStudyJava");
System.out.println("------list()------");
//디렉토리 내부의 디렉토리와 파일 list()로 가져오기
String[] lists = f.list();
for(String list : lists) {
File subfile = new File("c:\\SelfStudyJava\\"+list);
if (subfile.isDirectory()) {
System.out.println("["+list+"]");
} else {
System.out.println(list);
}
}
System.out.println("\n-----listFile()------");
//디렉토리 내부의 디렉토리와 파일 listFiles()로 가져오기
File[] lists2 = f.listFiles();
for(File list: lists2) {
if (list.isDirectory()) {
System.out.println("["+list+"]");
} else {
System.out.println(list);
}
}
}
}
---list()---
[.metadata]
[ArrayListEx01]
[ArraysEx]
[chap01]
[DataEx01]
[dir1]
[EnumEx01]
[ExceptionEx01]
[FileEx]
[FormatEx]
[HashMap]
[HashSetEx01]
java_test.zip
test.txt
test2.txt
test3.txt
---listFile()---
[c:\SelfStudyJava\.metadata]
[c:\SelfStudyJava\ArrayListEx01]
[c:\SelfStudyJava\ArraysEx]
[c:\SelfStudyJava\chap01]
[c:\SelfStudyJava\DataEx01]
[c:\SelfStudyJava\dir1]
[c:\SelfStudyJava\EnumEx01]
[c:\SelfStudyJava\ExceptionEx01]
[c:\SelfStudyJava\FileEx]
[c:\SelfStudyJava\FormatEx]
[c:\SelfStudyJava\HashMap]
[c:\SelfStudyJava\HashSetEx01]
c:\SelfStudyJava\java_test.zip
c:\SelfStudyJava\test.txt
c:\SelfStudyJava\test2.txt
c:\SelfStudyJava\test3.txt
-파일 생성, 이름변경, 파일삭제
package FileEx;
import java.io.File;
public class FileEx06 {
public static void main(String[] args) {
//파일(=디렉토리) 생성 / 이름변경 / 삭제
//디렉토리 생성 : mkdir()
//파일 생성 : createNewFile()
System.out.println("------renameTo()------");
File f = new File("c:\\SelfStudyJava", "test.txt");
File f1 = new File("c:\\SelfStudyJava", "newtest.txt");
//같은 디렉토리에 있으면 이름변경 / 다른 디렉토리에 있으면 이동한다.
if(f.renameTo(f1)) {
System.out.println("이름 변경완료");
} else {
System.out.println("이름 변경실패");
}
System.out.println("\n------delete()------");
if(f1.delete()) {
System.out.println("삭제완료");
} else {
System.out.println("삭제실패");
}
}
}
------renameTo()------
이름 변경완료
------delete()------
삭제완료
ㅇNIO 파일과 디렉토리
IO는 파일의 속성 정보를 읽기 위해 File클래스만 제공하지만, NIO는 좀 더 다양한 파일의 속성정보를 제공해주는 클래스와 인터페이스를 java.nio.file, java.nio.file.attribute 패키지에서 제공하고 있다.
ㅇ경로 정의 (Path)
파일명, 부모 디렉토리명, 중첩 경로수, 경로상에 있는 모든 디렉토리 등을 출력할 수 있다.
p1104
ㅇ파일 시스템 정보(FileSystem)
드라이버 정보, 용량 등을 출력할 수 있다.
p1105
package FileEx;
import java.nio.file.FileStore;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Path;
public class FileSystemExample {
public static void main(String[] args) throws Exception {
FileSystem fs = FileSystems.getDefault();
for(FileStore store : fs.getFileStores()) {
System.out.println("드라이버명: "+store.name());
System.out.println("파일시스템: "+store.type());
System.out.println("전체공간: "+store.getTotalSpace()+"바이트");
System.out.println("사용중인공간: "
+(store.getTotalSpace()-store.getUnallocatedSpace())+"바이트");
System.out.println("사용가능한공간: "+store.name());
System.out.println();
}
System.out.println("파일 구분자: "+fs.getSeparator());
System.out.println();
for(Path path : fs.getRootDirectories()) {
System.out.println(path.toString());
}
}
}
드라이버명:
파일시스템: NTFS
전체공간: 119356256256바이트
사용중인공간: 79505186816바이트
사용가능한공간:
드라이버명: 새 볼륨
파일시스템: NTFS
전체공간: 119355207680바이트
사용중인공간: 44873887744바이트
사용가능한공간: 새 볼륨
파일 구분자: \
C:\
D:\
ㅇIO 패키지 소개
ㅇ입력 스트림과 출력 스트림
p994
스트림이란 배열, 리스트 등 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자로, 자바 8부터 추가되었다.
프로그램이 출발지냐 또는 도착지냐에 따라서 스트림의 종류가 결정되는데, 프로그램이 데이터를 입력받을 때에는
입력스트림(InputStream),
프로그램이 데이터를 보낼 때에는 출력스트림(OutputStream)이라고 부른다.
스트림 클래스는 크게 두 종류로 구분된다.
바이트 기반 스트림은 그림, 멀티미디어, 문자 등 모든 종류의 데이터를 받고 보낼 수 있다.
문자 기반 스트림은 오로지 문자만 받고 보낼 수 있도록 특화되어 있다.
이 둘은 최상위 클래스에 따라서 구분된다.
바이트 기반 스트림의 최상위클래스는 InputStream, OutputStream
문자 기반 스트림의 최상위클래스는 Reader, Writer 가 있다.
ㅇInputStream
InputStream
FileInputStream
BufferedInputStream
DataInputStream
InputStream은 바이트 기반 입력스트림의 최상위 클래스로 추상 클래스이다.
메소드는
read() : 입력 스트림으로부터 1바이트를 읽고 읽은 바이트를 리턴한다. / 리턴타입 int
read(byte[] b) : 입력 스트림으로부터 읽은 바이트들을 매개값으로 주어진 바이트 배열 b에 저장하고 실제로 읽은
바이트 수를 리턴한다
read(byte[]b, int off, int len) : len 개의 바이트만큼 읽고 매개값으로 주어진 바이트 배열 b[off]부터 len개까지 저장한다.
그리고 실제로 읽은 바이트 수인 len개를 리턴한다.
close() : 사용한 시스템 자원을 반납하고 입력 스트림을 닫는다.
-파일의 내용 가져오기
먼저 텍스트파일로 아래와 같은 파일을 만들고 자바 워크스페이스에 저장한다.
그리고 자바에서 파일의 내용을 가져와보자.
package FileEx02;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class fileInputStreamEx01 {
public static void main(String[] args) {
FileInputStream fis = null;
try {
fis = new FileInputStream("c:\\SelfStudyJava\\test1.txt");
int data = 0;
data = fis.read();
//아스키코드값이 출력
System.out.println(data);
//형변환시킨다, 첫 번째 글자 읽기
System.out.println((char)data);
//두번째 글자 읽기
data = fis.read();
System.out.println((char)data);
} catch (FileNotFoundException e) {
System.out.println("에러: "+e.getMessage());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(fis != null) { try { fis.close(); } catch (IOException e) {} }
}
}
}
49
1
2
-파일의 전체 내용 가져오기 (절대경로 사용)
package FileEx02;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputStreamEx02 {
public static void main(String[] args) {
FileInputStream fis = null;
try {
fis = new FileInputStream("c:\\SelfStudyJava\\test.txt");
//파일의 전체 내용을 읽는 구문
int data = 0;
while( (data = fis.read()) != -1 ) {
System.out.print( (char)data );
}
System.out.println();
} catch (FileNotFoundException e) {
System.out.println("에러: "+e.getMessage());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(fis != null) {
try { fis.close(); } catch (IOException e) { }
}
}
}
}
123456
abcdef
?°??????¤??¼?§??°?
-파일의 전체 내용 가져오기 (상대경로 사용)
아래 그림과 같이 test.txt를 이클립스 프로젝트안에 드래그한 뒤 copy를 한다.
fis를 아래와 같이 바꿔주면 같은 결과를 출력한다.
fis = new FileInputStream("./test.txt");
이제 test.txt를 보면 엔터키가 두번 사용되었는데 이 엔터키까지 모두 읽어보자.
package FileEx02;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputStreamEx04 {
public static void main(String[] args) {
FileInputStream fis = null;
try {
fis = new FileInputStream("./test.txt");
int data = 0;
while( (data = fis.read()) != -1 ) {
//windows는 엔터키를 \r과 \n을 같이사용
//unix는 \n 하나만 사용한다.
if ( data == '\r' ) {
System.out.print("(r)");
} else if ( data == '\n' ) {
System.out.print("\n(n)");
} else {
System.out.print( (char)data );
}
}
} catch (FileNotFoundException e) {
System.out.println("에러: "+e.getMessage());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(fis != null) {
try { fis.close(); } catch (IOException e) { }
}
}
}
}
123456(r)
(n)abcdef(r)
(n)?°??????¤??¼?§??°?
ㅇOutputStream
newtest.txt 파일을 만들고 안에 내용을 작성해보자.
package FileEx02;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class OutputStreamEx01 {
public static void main(String[] args) {
FileOutputStream fos = null;
try {
//파일이 없으면 생성된다.
//이미 파일이 있으면 덮어쓰기 된다.
fos = new FileOutputStream("./newtest.txt");
System.out.println("출력완료");
//파일의 내용 작성하기 - 한글빼고 다 된다.
fos.write('1');
fos.write('1');
fos.write('1');
fos.write('1');
fos.write('\r');
fos.write('\n');
fos.write('2');
fos.write('2');
fos.write('2');
fos.write('2');
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(fos!=null) try { fos.close(); } catch(IOException e) {}
}
}
}
출력완료
아래와 같이 txt파일이 만들어진 것을 확인할 수 있다.
newtest.txt
1111
2222
-그림 집어넣기
아무 그림이나 패키지 안에 집어넣는다.
package FileEx02;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyEx01 {
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("./earth.jpg");
fos = new FileOutputStream("./newearth.jpg");
int data = 0;
while( (data = fis.read()) != -1 ) {
fos.write(data);
}
System.out.println("복사완료");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if( fis!=null) try {fis.close();} catch(IOException e) {}
if( fos!=null) try {fos.close();} catch(IOException e) {}
}
}
}
복사완료
ㅇReader
p1002
한글 다국어 처리하기
package FileEx02;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderEx01 {
public static void main(String[] args) {
FileReader fr = null;
try {
fr = new FileReader("./test.txt");
int data = 0;
while( (data = fr.read()) != -1 ) {
System.out.print( (char)data );
}
System.out.println();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if( fr != null) try { fr.close(); } catch (IOException e) {}
}
}
}
123456
abcdef
가나다라마바
ㅇWriter
p1005
package FileEx02;
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterEx01 {
public static void main(String[] args) {
FileWriter fw = null;
try {
//fw = new FileWriter("./newtest.txt");
//true 값을 주면 append모드로 계속 내용이 추가된다.
//true 값을 주지 않으면 파일의 내용이 초기화된 다음에 새로쓰여진다.
fw = new FileWriter("./newtest.txt", true);
/*
String msg = "hello";
msg += "\n";
msg += "hello";
msg += "\n";
msg += "hello";
fw.write(msg);
*/
fw.write("hello");
fw.write("hello");
fw.write("hello");
System.out.println("출력완료");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (fw != null) try { fw.close(); } catch (IOException e) {}
}
}
}
출력완료
hello
hello
hello
이번에는 아래와 같은 기존 텍스트파일인 test.txt의 내용을 읽어서 새로운 텍스트 파일을 만들어보자.
//test.txt
123456
abcdef
가나다라마바
package FileEx02;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileReaderAndWriterExample {
public static void main(String[] args) {
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader("./test.txt");
fw = new FileWriter("./newtest1.txt");
int data = 0;
while( (data = fr.read()) != -1 ) {
fw.write( (char)data );
}
System.out.println("복사완료");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (fr != null) try { fr.close(); } catch(IOException e) {}
if (fw != null) try { fw.close(); } catch(IOException e) {}
}
}
}
복사완료
//newtest1.txt
123456
abcdef
가나다라마바
지금까지를 1차 스트림이라고 한다.