File
java.io.* 에서 제공하는 클래스들은 try~catch / throws를 해줘야함.
Input / OutputStream (IOStream) : 단방향으로 데이터가 흘러가는 형태
java는 입력스트림, 출력스트림을 통해 데이터를 입출력함.
다양한 장치에 독립적으로 운영, 일관성있게 입출력을 유지하기 위해
입출력 스트림을 통해 일관성, 독립성 제공
두가지 형태의 스트림
- 바이트 형태의 스트림 : 기본 (문자, 그림, 멀티미디어)
- 문자 형태의 스트림 : 문자만 입출력할 때 사용
1. 바이트 스트림
- 입력 (InputStream) : FileInputStream, BufferedInputStream, DataInputStream ...
- 출력 (OutputStream) : FileOutputStream, BufferedOutputStream, DataOutputStream ...
2. 문자 스트림 : Encoding 처리.
- 입력 (Reader) : FileReader, BufferedReader, InputStreamReader...
- 출력 (Writer) : FileWriter, BufferedWriter, PrintWriter ...
기반스트림 / 보조스트림
기반스트림 : 직접 자료를 읽고 쓰는 기능이 있는 스트림
- FileInputStream, FileOutputStream, FileReader, FileWriter
보조스트림 : 직접 읽고 쓰는 기능은 없지만, 추가적인 기능을 더해주기 위한 스트림
- BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter
System.in 을 이용하여 알파벳 받기
Enter를 인식 == '\n'
System.out.println("알파벳 입력 > ");
try {
int in;
while((in = System.in.read()) != '\n') { // Enter가 아니면 출력
System.out.print((char)in);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
FileWriter를 통해 파일 쓰기
FileWriter fw = new FileWriter("writer.txt");
for(int i =1; i <= 10; i++) {
// \r = 캐리지리턴, \n = enter
String data = i+" test \r\n";
fw.write(data); // 파일에 기록
fw.write("my project I/O Test \r\n");
}
fw.close();
다시 실행하면 같은 이름의 파일로 덮어쓰기됨.
기존 파일에 데이터를 추가하려면 추가모드 파일명뒤에 true를 줘야함.
FileWriter fw2 = new FileWriter("writer.txt", true);
for(int i =11; i <= 20; i++) {
// \r = 캐리지리턴, \n = enter
String data = i+" test \r\n";
fw2.write(data); // 파일에 기록
fw2.write("my project I/O Test \r\n");
}
fw2.close();
PrintWirter도 똑같은 방식
PrintWriter pw = new PrintWriter("writer2.txt");
for(int i = 1 ; i <= 10 ; i++) {
String data = i + " PrintWriterTest \r\n";
pw.write(data);
}
pw.close();
파일에 내용을 추가하려면 파일명쓰는곳에 FileWriter를 생성해서 추가모드를 해주어야함.
PrintWriter pw2 = new PrintWriter(new FileWriter("writer2.txt", true));
for(int i = 11 ; i <= 20 ; i++) {
String data = i + " append mode \r\n";
pw2.write(data);
}
pw2.close();
바이트기반 스트림인 FileOutputStream을 이용해서 파일을 쓸 때에는
FileOutputStream output = new FileOutputStream("out.txt");
for(int i = 1 ; i <=10 ; i ++) {
String data = i + " 한글로써보기 Test \r\n";
// 바이트 기반 스트림이기 때문에 바이트 단위로 쓰기
output.write(data.getBytes());
}
output.close();
data.getBytes()로 바이트 단위로 바꿔주어야함.
BufferedReader 문자 보조스트림 사용
- 라인단위로 읽기 가능.
- 더이상 읽을 라인이 없다면(null을 리턴) 그만.
- 보조스트림은 직접 읽고 쓰는 기능이 없기때문에 기반스트림을 매개변수로 포함해야 함.
BufferedReader br = new BufferedReader(new FileReader("writer.txt"));
while(true) {
String line = br.readLine(); // 한 라인으로 읽어오기
if(line == null) {
break;
}
System.out.println(line);
}
br.close();
File 객체 : 경로 + 확장자
File.separator : 파일 경로 구분자(운영체제마다 다름) \\, \ , /
txt, xml, json, csv // https://www.data.go.kr/ 한국 데이터 포털
데이터 센터 => xml, json(가장 많이 사용)
ex)
File f = new File("D:\\sh_240725\\java_workspace\\java_project\\test.txt");
System.out.println(File.separator);
String name = f.getName();
System.out.println(name); // 파일명.확장자
System.out.println(f.getPath()); // 경로 + 파일명.확장자
System.out.println(f.getParent()); // 경로만
단어장 프로그램 만들어보기
메뉴 : 1.단어등록 | 2.단어검색 | 3.단어수정 | 4.단어출력 | 5.단어삭제 | 6.단어파일로출력 | 7.종료
Word class 생성
- 단어, 뜻 (list <String>)
Word (equals 사용) : 단어가 같으면 같은 객체
public class Word {
private String word;
private List<String> mean = new ArrayList<>();
public Word() {
}
public Word(String word, List<String> mean) {
this.word = word;
this.mean = mean;
}
@Override
public String toString() {
return "Word [word=" + word + ", mean=" + mean + "]";
}
@Override
public int hashCode() {
return Objects.hash(word);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Word other = (Word) obj;
return Objects.equals(word, other.word);
}
단어와 뜻을 담을 mean 리스트를 선언해준다음
생성자, toString을 만들어줌.
그리고 단어가 같으면 boolean true를 리턴해주는 equals를 오버라이드해줌.
public class WordMain {
public static void main(String[] args) throws IOException {
Scanner scan = new Scanner(System.in);
WordController wc = new WordController();
int menu = 0;
while (menu != 7) {
System.out.println("메뉴를 선택해주세요");
System.out.println("1.단어등록 | 2.단어검색 | 3.단어수정 | 4.단어출력 | 5.단어삭제 | 6.단어파일로 출력 | 7.종료 >> ");
menu = scan.nextInt();
switch (menu) {
case 1:
wc.addWord(scan);
break;
case 2:
wc.searchWord(scan);
break;
case 3:
wc.modifyWord(scan);
break;
case 4:
wc.printWord();
break;
case 5:
wc.delWord(scan);
break;
case 6:
wc.filePrint();
break;
case 7:
System.out.println("종료하겠습니다.");
break;
default:
System.out.println("잘못된 메뉴를 선택하셨습니다.");
break;
}
}
scan.close();
}
조건에 맞춘 메인을 먼저 만들어준뒤 각 메서드에 맞춰 컨트롤러 구성.
public class WordController {
private Map<String, List> map = new HashMap<>();
public void addWord(Scanner scan) {
System.out.println("단어를 입력해주세요");
String name = scan.next();
List<String> list = new ArrayList<>();
int num = -1;
while(num != 0) {
System.out.println("뜻을 입력해주세요");
String mean = scan.next();
list.add(mean);
System.out.println("뜻을 더 추가하시겠습니까? ( 종료 0 / 계속 1");
num = scan.nextInt();
}
map.put(name, list);
}
public void searchWord(Scanner scan) {
String name = null;
System.out.println("검색할 단어를 입력해주세요.");
name = scan.next();
if(map.containsKey(name) == false) {
System.out.println(" 검색한 단어가 없습니다. ");
} else {
System.out.println(" -- 검색한 단어 --");
System.out.println(name + " : " + map.get(name));
}
}
public void modifyWord(Scanner scan) {
String searchName = null;
String modifyMean = null;
System.out.println(" 수정할 단어를 입력해주세요. ");
searchName = scan.next();
List<String> list = map.get(searchName);
if(map.containsKey(searchName) == false) {
System.out.println(" 수정할 단어가 없습니다. ");
} else {
System.out.println(" 몇번째 단어를 수정하시겠습니까? ");
int index = scan.nextInt();
System.out.println(" 새로운 수정 의미를 입력해주세요");
modifyMean = scan.next();
list.set(index-1, modifyMean);
}
map.replace(searchName, list);
}
public void delWord(Scanner scan) {
String searchName = null;
System.out.println(" 지울 단어를 입력해주세요. ");
searchName = scan.next();
boolean ok = map.remove(searchName,map.get(searchName));
if(ok) {
System.out.println("삭제완료");
} else {
System.out.println("삭제 할 단어가 없습니다.");
}
}
public void filePrint() throws IOException {
FileWriter fw = new FileWriter("word.txt");
Iterator<String> it = map.keySet().iterator();
while(it.hasNext()) {
String key = it.next();
fw.write((key + " : " + map.get(key) + "\r\n"));
}
fw.close();
}
뜻과 의미를 담을 Map을 선언해주고 각 항목에 맞춰 구현.
수정메서드는 현재 가지고있는 의미들을 리스트에 넣고 인덱스를 선언해서 원하는 위치를 지정하여 원하는 인덱스의 의미만 수정 할 수 있도록 구현함.
미리 Word클래스에 구현해둔 equals를 통해 삭제는 단어이름을 비교해서 같다면 boolean ok 에 true를 리턴하게해 받아서 구현.
FileWriter를 이용해서 word.txt를 만들고 word.txt 파일에 map안의 내용을 출력할 수 있도록함.
'자바 수업 정리' 카테고리의 다른 글
수업정리 18일차. (1) | 2024.10.16 |
---|---|
수업정리 17일차. (1) | 2024.10.15 |
수업정리 15일차. (1) | 2024.10.11 |
수업정리 14일차. (0) | 2024.10.10 |
수업정리 13일차. (2) | 2024.10.08 |