컴퓨터공학 💻 도서관📚

Part2. 6-18 그 외 여러가지 입출력 클래스들 본문

✅🌲강의 복습 노트/패캠 JavaSpring 강의,코드 복습

Part2. 6-18 그 외 여러가지 입출력 클래스들

들판속초록풀 2025. 10. 9. 00:17

6-17 까지가 Stream 클래스였다.

 

C언어는 읽고 쓸 때 파일이라는 데이터 자료형을 사용한다.

자바에도 파일이라는 클래스가 있는데  이 클래스에는  읽고 쓰는 기능이 없다.

이 클래스는 파일의 속성을 알 수 있는 클래스이다.

 

File 클래스

  • 파일 개념을 추상화한 클래스
  • 입출력 기능은 없고, 파일의 이름, 경로, 읽기 전용 등의 속성을 알 수 있음
  • 이를 지원하는 여러 메서드들이 제공됨
  • 파일을 new 할 때  파일은 없어도  경로(디렉토리)는 있어야 한다.  (밑에 코드에서는  D:\\JAVA_LAB\\Chapter6\\  부분)
  • createNewFile() 메서드를 호출해야 파일이 생성이 된다.
import java.io.File;

public class FileTest {

	public static void main(String[] args) throws IOException {

		File file = new File("D:\\JAVA_LAB\\Chapter6\\newFile.txt"); // 스트링으로 만든다
		file.createNewFile();  // craeteNewFile() 메서드를 호출하면 파일이 생성이 된다.
		
		System.out.println(file.isFile());   // 파일인가?
		System.out.println(file.isDirectory());  // 디렉토리인가?
		System.out.println(file.getName());   // 이름이 뭔가 자네?
		System.out.println(file.getAbsolutePath());
		System.out.println(file.getPath());
		System.out.println(file.canRead());
		System.out.println(file.canWrite());
		
		file.delete();   // 파일 지우기
	}
}

RandomAccessFile 클래스

  • 입출력 클래스 중 유일하게 파일에 대한 입력과 출력을 동시에 할 수 있는 클래스  (Stream 은 아니다.)
  • 파일 포인터가 있어서 읽고 쓰는 위치의 이동이 가능함  (파일 포인터가 LP판의 돌아가는 바늘처럼 파일 디스크를 돌아가면서 어디까지 읽었는지 가리킨다.)
  • 다양한 메서드가 제공됨
  • seek() 메서드를 이용하면 파일 포인터의 위치를 이동할 수 있다. 
import java.io.RandomAccessFile;

public class RandomAccessFileTest {

	public static void main(String[] args) throws IOException {  // 예외 throw 함
    
		RandomAccessFile rf = new RandomAccessFile("random.txt", "rw");
		rf.writeInt(100);
		System.out.println("파일 포인터 위치:" + rf.getFilePointer()); // 5번 줄에서 int를 썼으니까 파일 포인터의 위치는 4
		rf.writeDouble(3.14);
		System.out.println("파일 포인터 위치:" + rf.getFilePointer()); // 7번 줄에서 double을 썼으니까 파일 포인터의 위치는 12(4+8)
		rf.writeUTF("안녕하세요");
		System.out.println("파일 포인터 위치:" + rf.getFilePointer());
         // 12번 줄에서 한글을 썼는데 자바는 UTF-8을 써서 한글은 3바이트이고, 
         // 문자열은 맨 마지막에 null문자가 들어가서 null 문자는 2바이트이니까 29(12 + 15 + 2)
	
		rf.seek(0);   // 파일 포인터를 맨 앞으로 이동
		System.out.println("파일 포인터 위치:" + rf.getFilePointer());
		
		int i = rf.readInt();
		double d = rf.readDouble();
		String str = rf.readUTF();
	
		System.out.println("파일 포인터 위치:" + rf.getFilePointer());
		System.out.println(i);
		System.out.println(d);
		System.out.println(str);
	}
}

 

17번 줄에서 rf.seek(0)  을   안하면

20번 줄에서  rf.readInt()  에서  오류가 난다.

파일 포인터가  돌아가는데

지금 위 코드에서  rf.seek(0)을 안하면

위치가 29까지  write 를 해서  그 다음부터는 write 한게 없는데

read를 하라고 하는 것이기 때문에

파일 포인터의 위치를 다시 0으로 옮긴 다음에 0 부터  read를 하라고 명령해야 한다.

 

 

 

Comments