public static void main(String[] args) {
File f= new File("c:\\test.txt");
if(f.exists()){
//delete方法删除由File对象的路径所表示的磁盘文件或目录,如果删除的对象是目录,该目录中的内容必须为空,否则无法删除
f.delete();
}else{
try {
f.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println(f.getName());
System.out.println(f.getPath());
}
}
创建一个文件对象后就可以通过该对象的方法得到文件的一些属性,但是不能访问文件的内容
RandomAccessFile类
RandomAccessFile类支持“随机访问”方式,可以跳转到文件的任意位置处读写数据。因为该对象类有个位置指示器,指向当前读写处的位置,我们可以移动这个指示器到新的位置从而实现“随机”的功能。不过该类只能操作文件,不能访问IO设备。
节点流
什么是节点流呢?程序用于直接操作目标设备所对应的类叫节点流类。
程序可以从中连续读取字节的对象叫输入流,用InputStream类完成。程序能向其中连续写入字节的对象叫输出流,用OutputStream类完成。
刚学的时候,还真没有搞清楚从一个文件中读取数据是用InputStream,因为感觉从文件中读出,读出嘛那肯定是Out噻。后来才知道是参考对象弄错了,此时的讲习入读出是相对流对象而言的,相对流对象从文件中读数据回来,当然就是读入也就是InputStream.这两个类只是抽象类,程序中用到的都是它们的子类对象 !
复习到这里时,看到了一个很重要的知识点,就是缓冲技术:
计算机访问外部设备,要比直接访问内存慢得多,如果直接向硬盘写数据,那么CPU就要花费更多的时间等待外部设备的响应,所以可以在内存中开辟一块空间用于存write方法写出的数据,当缓冲区满了时再一次性向外部设备写和入,这样就提高了CPU的利用率,还有就是可以回滚数据,因为数据还在缓冲区中。在开发的维护中程序出了问题一定要考虑到缓冲的问题,不然有时会找不到问题的原因在何处!
FileInputStream 与FileOutputStream
这两个类可以说是用得最多的,当然是我在程序中用得比较频繁的。
File f = new File("c:\\test.txt");
try {
//相当于用一根管子连接上文件f然后向管子中加入想写的数据
FileOutputStream out = new FileOutputStream(f);
out.write("hello hema".getBytes());
//此处非常重要,流必须关闭,否则会内存泄漏,刚学的时候我就经常没有这行代码,老是忘写!
out.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
byte[] buf;
int len;
try {
FileInputStream in = new FileInputStream(f);
//建立一个中转空间,将读来的数据暂存在此处
buf = new byte[1024];
len = in.read(buf);
in.close();
System.out.println(new String(buf, 0, len));
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
对程序员来说,代码是最敏感的了,文字很繁锁,代码一看就知道怎么用了!
Reader与Writer
InputSteam与OutputStream是用来处理字节的,在处理字符文本时不太方便,需要编写额外的程序代码。于是便出现了Reader和Writer专门用于处理字符的类, 当然这两个都是抽象类,还是得用它们的子类对象才行。
FileWriter和FileWriter的编程和FileInputStream,FileOutputStream差不多,惟一不同就是FileWriter的write方法中可以直接是字符串
PipedInputStream 与PipeOutStream
这两个类主要是用于完成线程之间的通信,一个线程的PipedInputStream对象能够从另一个线程的PipedOutputStream对象中读取数据 ,通过PipedOutputStream的connect方法就可读取。
ByteArrayInputStream与ByteAttayOutputStream
ByteArrayInputStream有两个构造函数,每个构造函数都要一个字节数组作为数据源。
ByteArrayInputStream(byte[] buf)
ByteArrayInputStream(byte[] buf,int offset.int length) buf中第offset处开始length个元素作为数据源
ByteArrayOnputStream()创建一个32字节的缓冲区
ByteArrayOnputStream(int)根据指定参数指定创建的缓冲区的大小,且可以在数据过大是自动增长
这两个流的作用在于,用IO流的方式来完成对字节数组内容的读写。
通过这两个类可以实现内存虚拟文件的功能,从而大提高效率。
记得张孝祥老师在讲HttpServer和HttpClient的视频中就用到了这个类,感觉很有用处!
过滤流与包装类
程序不直接通过节点流操作目标,而是通过一个中间对象也就是包装流连接上节点流去操作目标。
BufferedInputStream,BufferedOutputStream:对IO进行缓冲可以优化性能。缓冲流为IO流增加了内存缓冲区。这样有两大好处:
允许java的IO一次不只操作一个字节,有了缓冲区,可以执行skip mark reset方法
DataInputStream DataOutputStream:这两个类提供了可以读写各种基本数据类型数据的各种方法,这样可使代码简化。
于是可以采用这种模式:程序-->DataOutputStream-->BufferedOutputStream-->FileOutputStream-->文件-->FileInputStream-->BufferedInputStream-->DataInputStream-->程序
此处值得说的是:关闭上层流对象,会自动关闭底层的流对象 即关闭DataOutputStream和DataInputStream对象
ObjectInputStream 与ObjectOutputStream:这两个类用于存储和读取对象的输入输出流类。只要对象实现了Serializable接口,就可以用该类把一个对象写入到文件中。
字符集:计算机中的数据都是用数字来表示的,采用不同的字符集会出现不同的显示效果,实际上就是采用查表的方法,用GBK保存的文件用ISO8859-1的字符集打开就会是乱码,在用struts 时就会有中文乱码的情况,因为它的默认编码是ISO8859-1而我们的中文在这个字符集中就不再是中文了。UTF-8编码便可以解决码表不同的问题!