본문 바로가기

자바 수업 정리

수업정리 16일차.

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