JavaはよくAPIを使います。ファイルは指針に基づいてRandomAccess File類を読み書きます。
7333 ワード
java.io.RandomAccess Fileはファイルデータを読み書きするクラスであり、ポインタに基づいてファイルデータを読み書き操作(バイナリバイト)する。
Random Access Fileは2つのモードを作成しています。
r:読み取り専用モードで、ファイルデータのみ読み取り専用で、内容は書き込みません。
rw:読み書きモードで、ファイルに対して読み書きもできます。
よくある構造方法:
Random Access File(String path,String mode)
Random Access File(File file,String mode)
mode:r or rw
現在のディレクトリのraf.datファイルを読み書きします。rwモードでないと自動的に作成されます。ファイルが存在しない場合は異常FileNotFoundExceptionをスローします。
void write(int d):ファイルにバイトを書き込み、所定のint値に対応する2進数で8桁低い書き込みをします。
000000 0000 000000 00001
ランダムな読み書き:通常はシングルバイトの読み書きモードです。
ブロック読み書き:バイトのセットを一度に読んで書きます。
int read(byte[]data):与えられたバイト配列をファイルから一括で読み出す
void write(byte[]data):…
void write(byte[]data,int start,int len)
長さが与えられたバイト量を合計して、読み取ったバイトを配列に保存します。戻り値は実際に読み取ったバイト量であり、戻り値が−1であるとファイルの最後まで読んだことを示していますが、今回は内容が読めませんでした。
byte:-128-127
1 b:0000
1 kb=1024 byte
1 mb=1024 kb
ハードディスクは1000換算で
Stringは文字列を文字に変換する方法を提供しています。byte[]getByttes()
システムのデフォルト文字セットに従って、現在の文字列を対応するバイトに変換しますが、このような方法は推奨されません。
byte[]getBytes(String csn);csn:charset name
指定された文字セットでバイトのセットに変換します。
共通文字セット:
GBK:国際コード、英語1バイト、中国語2バイト。
UTF-8:unicodeの文字セットコードは、英語1バイト、中国語3バイトです。UTF-8は世界で流行しているすべての文字をサポートしていますので、万国コードにもなりました。
ISO 8859-1:ヨーロッパのコードブックで、中国語に対応していません。
Random Access Fileは2つのモードを作成しています。
r:読み取り専用モードで、ファイルデータのみ読み取り専用で、内容は書き込みません。
rw:読み書きモードで、ファイルに対して読み書きもできます。
よくある構造方法:
Random Access File(String path,String mode)
Random Access File(File file,String mode)
mode:r or rw
現在のディレクトリのraf.datファイルを読み書きします。rwモードでないと自動的に作成されます。ファイルが存在しない場合は異常FileNotFoundExceptionをスローします。
void write(int d):ファイルにバイトを書き込み、所定のint値に対応する2進数で8桁低い書き込みをします。
000000 0000 000000 00001
public class RandomAccessFileDemo {
public static void main(String[] args) throws IOException {
RandomAccessFile raf=new RandomAccessFile("raf.dat", "rw");
raf.write(1);
System.out.println(" ");
raf.close();
}
}
int read():ファイルからバイトを読み出し、int形式で戻ります。戻り値が-1であれば、ファイルの最後まで読んだことを示します。public class ReadDemo {
public static void main(String[] args) throws IOException {
/** raf.dat 1 */
RandomAccessFile raf=new RandomAccessFile("raf.dat", "r");
/**
* 0-255
* 00000000 00000000 00000000 00000001
* 00000000 00000000 00000000 11111111(255)
*/
int d=raf.read();
System.out.println(d);
d=raf.read();
System.out.println(d);
raf.close();
}
}
バイトでコピー:public class CopyDemo {
public static void main(String[] args) throws IOException {
RandomAccessFile src=new RandomAccessFile("RandomAccessFile .docx", "r");
RandomAccessFile desc=new RandomAccessFile("RandomAccessFile _cp.docx", "rw");
int d=-1;
while ((d=src.read())!=-1) {
desc.write(d);
}
System.out.println("over");
src.close();
desc.close();
}
}
従来の機械ハードディスクは、その物理的特性により、単バイトの読み書き効率が悪くなりますが、ブロック読み書き効率は保証されます。ですから、私たちは毎回読み込むデータ量を上げることで、実際の読み書きの回数を減らすことができ、読み書きの効率を高めることができます。ランダムな読み書き:通常はシングルバイトの読み書きモードです。
ブロック読み書き:バイトのセットを一度に読んで書きます。
int read(byte[]data):与えられたバイト配列をファイルから一括で読み出す
void write(byte[]data):…
void write(byte[]data,int start,int len)
長さが与えられたバイト量を合計して、読み取ったバイトを配列に保存します。戻り値は実際に読み取ったバイト量であり、戻り値が−1であるとファイルの最後まで読んだことを示していますが、今回は内容が読めませんでした。
byte:-128-127
1 b:0000
1 kb=1024 byte
1 mb=1024 kb
ハードディスクは1000換算で
public class CopyDemo2 {
public static void main(String[] args) throws IOException {
RandomAccessFile src=new RandomAccessFile("RandomAccessFile .docx", "r");
RandomAccessFile desc=new RandomAccessFile("RandomAccessFile _cp2.docx", "rw");
byte[]data=new byte[1024*10];
//
int len=-1;
while ((len=src.read(data))!=-1) {
desc.write(data,0,len);
}
System.out.println("over");
src.close();
desc.close();
}
}
テキストデータを書き出す:Stringは文字列を文字に変換する方法を提供しています。byte[]getByttes()
システムのデフォルト文字セットに従って、現在の文字列を対応するバイトに変換しますが、このような方法は推奨されません。
byte[]getBytes(String csn);csn:charset name
指定された文字セットでバイトのセットに変換します。
共通文字セット:
GBK:国際コード、英語1バイト、中国語2バイト。
UTF-8:unicodeの文字セットコードは、英語1バイト、中国語3バイトです。UTF-8は世界で流行しているすべての文字をサポートしていますので、万国コードにもなりました。
ISO 8859-1:ヨーロッパのコードブックで、中国語に対応していません。
public class WriteStringDemo {
public static void main(String[] args) throws IOException {
RandomAccessFile raf=new RandomAccessFile("raf.txt", "rw");
String str=" ";
byte[]data=str.getBytes("utf-8");
raf.write(data);
str=" ?";
data=str.getBytes("utf-8");
raf.write(data);
System.out.println("finished");
raf.close();
}
}
テキストデータを読み出す:public class ReadStringDemo {
public static void main(String[] args) throws IOException {
/** */
RandomAccessFile raf=new RandomAccessFile("raf.txt", "r");
byte[]data=new byte[(int)raf.length()];
raf.read(data);
/** ,
* String(byte[]data):
*
* String(byte[]data,String csn):
* */
String string=new String(data, "utf-8");
System.out.println(string);
raf.close();
}
}
簡易メモツール:プログラム起動後、ユーザーにファイル名の入力を要求し、ファイルの書き込み操作を開始した後、ユーザーが入力する文字列ごとにこのファイルに書き込みを要求し、ユーザーが単語「exit」を入力した場合、プログラムは終了します。public class Note {
public static void main(String[] args) throws IOException {
Scanner scanner=new Scanner(System.in);
System.out.println(" :");
String fileName=scanner.nextLine();
RandomAccessFile raf=new RandomAccessFile(fileName, "rw");
String content="";
while (true) {
System.out.println(" :");
content=scanner.nextLine();
if (content.equals("exit")) {
break;
}
byte[]data=content.getBytes();
raf.write(data);
System.out.println();
}
System.out.println(" ");
scanner.close();
raf.close();
}
}
基本データを読み书き、RAFはポインタに基づいてどうやって読み书きますか?public class Demo2 {
public static void main(String[] args) throws IOException {
RandomAccessFile raf=new RandomAccessFile("raf4.txt","rw");
/** long getFilePointer() */
long pos=raf.getFilePointer();
System.out.println(pos);//0
int max=Integer.MAX_VALUE;
raf.write(max>>>24);
System.out.println(raf.getFilePointer());//1
raf.write(max>>>16);
System.out.println(raf.getFilePointer());//2
raf.write(max>>>8);
System.out.println(raf.getFilePointer());//3
raf.write(max);
System.out.println(raf.getFilePointer());//4
/**
* void writeInt(Int d)
* 4 , int
*/
raf.writeInt(max);
System.out.println(raf.getFilePointer());//8
raf.writeDouble(123.23);
System.out.println(raf.getFilePointer());//16
raf.writeLong(123L);
System.out.println(raf.getFilePointer());//24
System.out.println("finished");
System.out.println(raf.read());//-1
/**
* void seek(long pos):
* int readInt(): 4 , int ,
* ,
* :EOFException
* double readDouble()
*/
raf.seek(0);
System.out.println(raf.getFilePointer());//0
System.out.println(raf.readInt());//2147483647
System.out.println(raf.getFilePointer());//4
// double , double
raf.seek(8);
System.out.println(raf.readDouble());//123.23
System.out.println(raf.readLong());//123
System.out.println(raf.getFilePointer());//24
//
raf.seek(8);
raf.writeDouble(567.567);
raf.seek(8);
System.out.println(raf.readDouble());
raf.seek(16);
System.out.println(raf.readLong());
System.out.println(raf.read());
raf.close();
}
}