이전 연구에서 우리는 파일을 읽으려면 파일을 가리키는 입력 스트림을 생성해야 하고, 파일을 쓰려면 파일을 가리키는 출력 스트림을 생성해야 한다는 것을 알고 있습니다. 그렇다면 파일을 읽고 쓸 수 있는 스트림을 만들 수 있습니까? 이것이 바로 이 섹션이 무작위 스트림에 관한 내용입니다.
RandomAccessFile 클래스 에 의해 생성된 스트림을 무작위 스트림 이라고 합니다. 이전 입력 및 출력 스트림과 달리 RandomAccessFile 클래스는 InputStream 클래스의 하위 클래스도 아니고 OutputStream 클래스의 하위 클래스도 아닙니다. 그러나 RandomAccessFile 클래스에 의해 생성된 스트림의 지점은 스트림의 소스로 사용될 수도 있고, 스트림의 대상으로 사용될 수도 있습니다. 즉, 파일을 읽고 쓸 준비를 할 때 해당 스트림을 가리키는 임의의 스트림을 생성하십시오. 파일이므로 이 스트림에서 파일의 데이터를 읽을 수 있고 이 스트림을 통해 파일에 데이터를 쓸 수도 있습니다.
다음은 RandomAccessFile 클래스의 두 생성자입니다.
name 매개변수는 파일 이름을 결정하는 데 사용되며 생성된 스트림의 소스(스트림 대상이기도 함)를 제공합니다. 매개변수 모드는 r(읽기 전용) 또는 rw(읽기-쓰기)이며, 생성된 스트림의 파일 액세스 권한을 결정합니다.
매개변수 파일은 생성된 스트림의 소스를 제공하고 스트림 대상이기도 한 File 객체입니다. 매개변수 모드는 r(읽기 전용) 또는 rw(읽기-쓰기)이며, 생성된 스트림의 파일 액세스 권한을 결정합니다.
참고 : RandomAccessFile 스트림이 파일을 가리키면 파일이 새로 고쳐지지 않습니다.
RandomAccessFile 클래스에는 RandomAccessFile 스트림의 읽기 및 쓰기 위치를 찾는 데 사용되는 Seek(long a) 메서드가 있습니다. 매개 변수 a는 읽기 및 쓰기 위치에서 파일 시작 부분까지의 바이트 수를 결정합니다. 또한 스트림은 getFilePointer() 메서드를 호출하여 스트림의 현재 읽기 및 쓰기 위치를 가져올 수도 있습니다. RandomAccessFile 스트림은 순차적 읽기 및 쓰기보다 파일 읽기 및 쓰기에 더 유연합니다.
예를 들어, tom.dat라는 파일에 여러 int 정수를 쓴 다음 역순으로 데이터를 읽습니다.
importjava.io.*;publicclassMain{publicstaticvoidmain(Stringargs[]){RandomAccessFileinAndOut=null;intdata[]={1,2,3,4,5,6,7,8,9,10};try{inAndOut=newRandomAccessFile (tom.dat,rw);for(inti=0;i<data.length;i++){inAndOut.writeInt(data[i]);}for(longi=data.length-1;i>=0;i --){inAndOut.seek(i*4);System.out.printf(t%d,inAndOut.readInt());/*int형 데이터는 4바이트를 차지하며, inAndOut은 파일 읽기의 36번째부터 시작한다. 마지막 정수 바이트를 읽고 4바이트마다 정수를 읽습니다.*/}inAndOut.close();}catch(IOExceptione){}}}
RandomAccessFile 스트림의 일반적인 메서드는 다음과 같습니다.
참고 : RandomAccessFile 스트림의 readLine() 메서드가 중국어 문자가 포함된 파일과 같이 ASCII가 아닌 문자가 포함된 파일을 읽을 때 "깨진 문자"가 나타납니다. 따라서 readLine()에서 읽은 문자열을 "iso-8859-1" 인코딩을 사용하여 다시 인코딩하여 바이트 배열에 저장한 후 현재 머신의 기본 인코딩을 사용하여 배열을 문자열로 변환해야 합니다. . 작업은 다음과 같습니다.
Stringstr=in.readLine();
byteb[]=str.getBytes(iso-8859-1);
Stringcontent=newString(b);
머신의 기본 인코딩이 "GB2312"인 경우
Stringcontent=newString(b);
동등하다
Stringcontent=newString(b,GB2312);
예를 들어:
importjava.io.*;publicclassMain{publicstaticvoidmain(Stringargs[]){RandomAccessFilein=null;try{in=newRandomAccessFile(Main.java,rw);longlength=in.length();//파일 길이 가져오기 longposition= 0; in.seek(position);//읽기 위치를 파일의 시작 부분으로 찾습니다. while(position<length){Stringstr=in.readLine();byteb[]=str.getBytes(iso-8859-1) ;str =newString(b);position=in.getFilePointer();System.out.println(str);}}catch(IOExceptione){}}}