输入输出:
File类:是IO包中唯一代表磁盘文件本身信息的类,而不是文件中的内容。
定义了一些与平台无关的方法来操作文件,例如:创建、删除、重命名等。
java中的目录被当做一种特殊的文件使用,list方法可以返回目录中所有子目录和文件名。
RandomAccessFile类:支持随机访问方式。(对于流格式的文件,一般要从头开始读取,而通过此类,只需把文件指示器移动到要读取的位置即可)
1. 该类对象的内部有个文件指示器,可以从指定位置读取数据。(网络程序中的断点续传功能;FTP服务器中多线程下载的功能,第一个线程下载0-1K,第二个下载1-2K,然后组合)
2. RandomAccessFile类在随机(相对于顺序而言)读写等长记录格式的文件时有很大优势。
3. RandomAccessFile仅限于操作文件,而不能操作其他IO设备,如:网络、内存映像等。
一个文件中文件指示器只有一个不管是读还是写,都是以文件指示器的位置为开始位置进行读写。
在java中不管中文还是英文字符都是采用Unicode编码,则占用两个字节。但是在本地计算机中,
英文采用ASCII编码只占用一个字节,而中文占用两个字节。当使用getByes时英文在本地采用
一个字节表示,而中文采用两个字节表示
public static void main(String[] args) { String strEng="a"; String strChi="我"; System.out.println(strEng.getBytes().length+"------>"+strChi.getBytes().length); System.out.println(strEng.toCharArray().length+"----->"+strChi.toCharArray().length); }
class Employee{ public final static int LEN=8; String name; int age; public Employee(String name,int age){ if(name.length()>LEN) this.name=name.substring(0, LEN); else{ while(name.length()<LEN){ name+="\u0000"; } this.name=name; } this.age=age; } } public static void main(String[] args) throws Exception{ Employee e1 = new Employee("zhangsan", 23); Employee e2 = new Employee("lisi", 24); Employee e3 = new Employee("wangwu", 25); RandomAccessFile raf = new RandomAccessFile("employee.txt", "rw"); raf.write(e1.name.getBytes()); raf.writeInt(e1.age); raf.write(e2.name.getBytes()); raf.writeInt(e2.age); raf.write(e3.name.getBytes()); raf.writeInt(e3.age); raf.close(); RandomAccessFile rafb = new RandomAccessFile("employee.txt", "r"); byte[] buff=new byte[Employee.LEN]; String name=""; int age; //读取第二个 rafb.skipBytes(12); rafb.read(buff); name=new String(buff); age = rafb.readInt(); System.out.println(name.trim()+"----------->"+age); //读取第一个 rafb.seek(0); rafb.read(buff); name=new String(buff); age=rafb.readInt(); System.out.println(name.trim()+"----------->"+age); //读取第三个 rafb.skipBytes(12); rafb.read(buff); name=new String(buff); age = rafb.readInt(); rafb.close(); System.out.println(name.trim()+"----------->"+age); }
当是中文:
class Employee{ public final static int LEN=8; String name; int age; public Employee(String name,int age){ if(name.length()>LEN) this.name=name.substring(0, LEN); else{ while(name.length()<LEN){ name+="\u0000"; //而当name=李四时,又给它补充了六个字符,凑成了8个字符 } this.name=name; } this.age=age; } } public class TestRandomAccessFile { /*在java中不管中文还是英文字符都是采用Unicode编码,则占用两个字节。但是在本地计算机中, 英文采用ASCII编码只占用一个字节,而中文占用两个字节。当使用getByes时英文在本地采用 一个字节表示,而中文采用两个字节表示*/ //中文出现问题的原因:当字符个数是8时,采用getBytes时不一定往文件中写入的字节数也就是8,因为中文和英文转化为字节的个数是不一样的 public static void main(String[] args) throws Exception{ Employee e1 = new Employee("zhangsan", 23); Employee e2 = new Employee("李四", 24); Employee e3 = new Employee("wangwu", 25); RandomAccessFile raf = new RandomAccessFile("employee.txt", "rw"); raf.writeChars(e1.name); raf.writeInt(e1.age); raf.writeChars(e2.name); //当是中文时 则写入的字节数是10 raf.writeInt(e2.age); raf.writeChars(e3.name); raf.writeInt(e3.age); raf.close(); RandomAccessFile rafb = new RandomAccessFile("employee.txt", "r"); String name=""; int age; //读取第二个 rafb.skipBytes(16+4); int i=0; for(i=0;i<Employee.LEN;i++){ name+=rafb.readChar(); } age = rafb.readInt(); System.out.println(name.trim()+"----------->"+age); //读取第一个 rafb.seek(0); name=""; for(i=0;i<Employee.LEN;i++){ name+=rafb.readChar(); } age=rafb.readInt(); System.out.println(name.trim()+"----------->"+age); //读取第三个 rafb.skipBytes(16+4); name=""; for(i=0;i<Employee.LEN;i++){ name+=rafb.readChar(); } age = rafb.readInt(); rafb.close(); System.out.println(name.trim()+"----------->"+age); } }
输入输出:
File类:是IO包中唯一代表磁盘文件本身信息的类,而不是文件中的内容。
定义了一些与平台无关的方法来操作文件,例如:创建、删除、重命名等。
java中的目录被当做一种特殊的文件使用,list方法可以返回目录中所有子目录和文件名。
RandomAccessFile类:支持随机访问方式。(对于流格式的文件,一般要从头开始读取,而通过此类,只需把文件指示器移动到要读取的位置即可)
1. 该类对象的内部有个文件指示器,可以从指定位置读取数据。(网络程序中的断点续传功能;FTP服务器中多线程下载的功能,第一个线程下载0-1K,第二个下载1-2K,然后组合)
2. RandomAccessFile类在随机(相对于顺序而言)读写等长记录格式的文件时有很大优势。
3. RandomAccessFile仅限于操作文件,而不能操作其他IO设备,如:网络、内存映像等。
一个文件中文件指示器只有一个不管是读还是写,都是以文件指示器的位置为开始位置进行读写。
原文:http://www.cnblogs.com/java-cjt/p/4004482.html