import java.io.*;
import java.util.*;
public class FileTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stu
File f2=new File("testFile");
//定义多级目录
File f3=new File("testDir//Dir1//Dir2");
File f= new File("testFile","a.txt");
//创建指定的多级目录
f3.mkdirs();
if(f.exists()){
f.delete();
}
else{
try{
//创建单级目录
f2.mkdir();
f.createNewFile();}
catch(Exception e){
e.printStackTrace();
}
}
System.out.println("File name:"+f.getName());
System.out.println("File path:"+f.getPath());
System.out.println("File abs path:"+f.getAbsolutePath());
System.out.println("File Parent:"+f.getParent());
System.out.println(f.exists()?"exists":"not exists");
System.out.println(f.canRead()?"can":"can not");
System.out.println(f.isDirectory()?"directory":"not directory");
System.out.println("File last modified:"+new Date(f.lastModified()));
// 测试指定的文件是否为绝对路径
System.out.println(f3.isAbsolute());
//将当前文件设置为只读
System.out.println(f3.setReadOnly());
}
}
总结:java语言将文件看作是字节的序列,即由一个个字节的数据顺序组成。File类具有3种构造方法:public File(String path);
public File(String path,String name);path为文件对象的路径
public File(String dir,String name); dir为文件对象所在目录
三种方法都只是创建的对象而已并没有创建真正的文件,要生产文件还需要调用特定的方法
编程实例:往文件中写入三名员工的信息,每个员工有姓名和年龄2个字段,然后按照第二名、第一名、第三名的先后顺序读出员工信息。
程序代码:
public class Employee {
public String name;
public int age;
public static final int LEN=8;
public Employee(String name,int age){
if(name.length()>LEN){
name=name.substring(0,LEN);
}
else{
/*此处使用的循环语句使name的长度不足8为
* 时通过循环每次添加空字符补足为8位*/
while(name.length()<LEN){
/*java采用Unicode国际标准字符集,uincode字符通常
*用十六进制表示,如"/u0000"~"/u00ff"表示ASCII码集
*"/u0000"表示空格."/u0030"表示0*/
name=name+"/u0000";
}
}
this.name=name;
this.age=age;
}
}
import java.io.RandomAccessFile;
public class TestEmployee {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
Employee e1=new Employee("zhangsan",20);
Employee e2=new Employee("李四",22);
Employee e3=new Employee("wangwu",259);
RandomAccessFile ra=new RandomAccessFile("Employee.txt","rw");
//①调用write(byte[]b)方法
//ra.write(e1.name.getBytes());
ra.writeChars(e1.name);
//②调用write(int b)方法
//由于有此方法的存在因此无需像对name属性那样getBytes
//ra.write(e1.age);
ra.writeInt(e1.age);
/*③直接写字符 由于中文和英文字符在转化为字节时个数的长度不一致
所以使用write(byte[]b)方法时写入的字节不能保证英文和中文字符的长
度一致。例如:"李四"它所对应的字符为二个字符,在Employee方法中有:
name+="/u000"为保证其为8个字符又给它补充了6个字符。但在调用
getBytes()方法时中文字符"李四"转化的字节数为4个因此写入的总字节数
为10个。而在下面的read()方法中还是只读取8个字节,因此无法正常读出*/
ra.writeChars(e2.name);
ra.writeInt(e2.age);
ra.writeChars(e3.name);
ra.writeInt(e3.age);
ra.close();
//int len;
//byte[] buf=new byte[8];
String strName="";
RandomAccessFile raf=new RandomAccessFile("Employee.txt","r");
raf.skipBytes(Employee.LEN*2+4);
//④由于读字符只能一个字符一个字符的读 使用循环结构读取多个字符
for(int i=0;i<Employee.LEN;i++){
strName += raf.readChar();
}
//len=raf.read(buf);
/*⑤String类的构造方法,将字节转化为字符串
public String(byte value[],int offset,int length)*/
//strName= new String(buf,0,len);
//⑦strName.trim()取消显示字符串前后不可显示字符
System.out.println(strName.trim()+":"+raf.readInt());
//⑧绝对定位,定位到某字节处
raf.seek(0);
///len=raf.read(buf);
//strName= new String(buf,0,len);
strName="";
for(int i=0;i<Employee.LEN;i++){
strName+=raf.readChar();
}
System.out.println(strName.trim()+":"+raf.readInt());
raf.skipBytes(Employee.LEN*2+4);
//len=raf.read(buf);
// strName= new String(buf,0,len);
strName="";
for(int i=0;i<Employee.LEN;i++){
strName+=raf.readChar();
}
System.out.println(strName.trim()+":"+raf.readInt());
raf.close();
}
}
学习总结:
1. 对于固定使用的数值为了方便引用也定义为常量,如果在以后的使用涉及到对该数值的更改只需要在常量定义的地方修改即可,而不需要在程序中进行修改。
如在Employee类中定义了public static final int LEN=8
在TestEmployee类中引用常量8时只需要调用Employee.LEN即可。
2.java采用Unicode国际标准字符集,uincode字符通常用十六进制表示,如"/u0000"~"/u00ff"表示ASCII码集"/u0000"表示空格."/u0030"表示0.
3.涉及到的8种方法。
疑问:1.使用怎么的读写方法能让我们在查看记事本时查看到信息而不是我们无法识别的符号
2.在TestEmployee类中代码的重用很多,可不可以将重复的代码封装到一个类中,需要使用时调用该类中的方法即可。