Java RandomAccessFile 예제

Java RandomAccessFile은 파일로 데이터를 읽고 쓰는 기능을 제공합니다. RandomAccessFile은 파일 시스템에 저장된 바이트 배열로 파일을 다루며 파일 포인터 위치를 이동할 수 있는 커서를 사용합니다.

Java RandomAccessFile

RandomAccessFile 클래스는 Java IO의 일부입니다. Java에서 RandomAccessFile의 인스턴스를 생성할 때 파일을 열기 위한 모드를 제공해야 합니다. 예를 들어, 읽기 전용 모드로 파일을 열려면 “r”을 사용하고 읽기-쓰기 작업에 대해 “rw”를 사용해야 합니다. 파일 포인터를 사용하여 임의 접근 파일에서 데이터를 읽거나 쓸 수 있습니다. 현재 파일 포인터를 가져오려면 getFilePointer() 메서드를 호출하고 파일 포인터 인덱스를 설정하려면 seek(int i) 메서드를 호출할 수 있습니다. 데이터가 이미 있는 위치에 데이터를 쓰면 덮어씁니다.

Java RandomAccessFile 읽기 예제

우리는 자바에서 RandomAccessFile을 사용하여 파일에서 바이트 배열을 읽을 수 있습니다. 아래는 RandomAccessFile을 사용하여 파일을 읽는 데 사용되는 의사 코드입니다.파일 읽기에 대한 것입니다.

RandomAccessFile raf = new RandomAccessFile("file.txt", "r");
raf.seek(1);
byte[] bytes = new byte[5];
raf.read(bytes);
raf.close();
System.out.println(new String(bytes));

첫 번째 줄에서는 읽기 전용으로 파일에 대한 RandomAccessFile 인스턴스를 생성합니다. 그런 다음 두 번째 줄에서 파일 포인터를 인덱스 1로 이동합니다. 우리는 길이가 5인 바이트 배열을 만들었으므로 read(bytes) 메서드를 호출할 때 파일에서 5바이트가 바이트 배열로 읽힙니다. 마지막으로 RandomAccessFile 리소스를 닫고 바이트 배열을 콘솔에 출력합니다.

Java RandomAccessFile 쓰기 예제

다음은 자바에서 RandomAccessFile을 사용하여 파일에 데이터를 쓰는 방법을 보여주는 간단한 예제입니다.

RandomAccessFile raf = new RandomAccessFile("file.txt", "rw");
raf.seek(5);
raf.write("Data".getBytes());
raf.close();

RandomAccessFile은 파일을 바이트 배열로 취급하기 때문에 쓰기 작업은 데이터를 덮어쓰거나 파일에 추가할 수 있습니다. 모두 파일 포인터 위치에 따라 달라집니다. 포인터가 파일 길이를 넘어서 이동한 다음 쓰기 작업이 호출되면 파일에 잘못된 데이터가 작성될 수 있습니다. 따라서 쓰기 작업을 사용할 때 이에 유의해야 합니다.

RandomAccessFile 추가 예제

모든 것이 파일에 추가되도록 파일 포인터가 파일 끝에 있는지 확인해야 합니다. 아래는 RandomAccessFile을 사용하여 파일에 추가하는 코드입니다.

RandomAccessFile raf = new RandomAccessFile("file.txt", "rw");
raf.seek(raf.length());
raf.write("Data".getBytes());
raf.close();

Java RandomAccessFile 예제

다음은 다른 읽기 및 쓰기 작업이 있는 완전한 Java RandomAccessFile 예제입니다.

package com.journaldev.files;

import java.io.IOException;
import java.io.RandomAccessFile;

public class RandomAccessFileExample {

	public static void main(String[] args) {
		try {
			// 파일 내용은 "ABCDEFGH"입니다
			String filePath = "/Users/pankaj/Downloads/source.txt"; 
			
			System.out.println(new String(readCharsFromFile(filePath, 1, 5)));

			writeData(filePath, "Data", 5);
			// 이제 파일 내용은 "ABCDEData"입니다
			
			appendData(filePath, "pankaj");
			// 이제 파일 내용은 "ABCDEDatapankaj"입니다
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private static void appendData(String filePath, String data) throws IOException {
		RandomAccessFile raFile = new RandomAccessFile(filePath, "rw");
		raFile.seek(raFile.length());
		System.out.println("current pointer = "+raFile.getFilePointer());
		raFile.write(data.getBytes());
		raFile.close();
		
	}

	private static void writeData(String filePath, String data, int seek) throws IOException {
		RandomAccessFile file = new RandomAccessFile(filePath, "rw");
		file.seek(seek);
		file.write(data.getBytes());
		file.close();
	}

	private static byte[] readCharsFromFile(String filePath, int seek, int chars) throws IOException {
		RandomAccessFile file = new RandomAccessFile(filePath, "r");
		file.seek(seek);
		byte[] bytes = new byte[chars];
		file.read(bytes);
		file.close();
		return bytes;
	}

}

이것으로 Java에서의 RandomAccessFile에 관한 설명을 마칩니다.

Source:
https://www.digitalocean.com/community/tutorials/java-randomaccessfile-example