IO类其实就是分为三大类:
File类 文件操作类 ;
字节操作类 ;
字符操作类 .
File类是Io类中唯一代表磁盘文件本身的对象. File提供的方法能够创建 文件
这一点我是先实现了下 , 如下面代码:
import java.io.*;
public class Test{
public static void main(String []args){
File f = new File("g://1.txt");
try{
f.createNewFile();
}catch(IOException e){
System.out.println(e.getMessage());
}
}
}
该代码在控制台的输出没有结果 , 这代码中, 我在控制台编译出了几个低级错误: 一是 File f = new File("g://1.txt") 我开始的时候 没有把这个绝对路径当做一个 字符创 去看待 直接就写了 , javac 之后就报错了! 另外要注意的就是这个 createNewFile() 方法 在API文档中看它是 throws Exception的 , 那么我们在调用的时候就需要 try{} catch(){} 了!
至于输出结果就没有了 只需要直接去G盘根目录下去 寻找 1.txt 文件就好了!
假如在这个文件中 写入一些内容 比如"aaaaaaaaa" 然后再次编译执行该文件 发现控制台并没有报错 然后我们去查看G 盘 存在有 1.txt 文件 ,打开发现文件中的"aaaaaaaaa" 也还是存在的. 这说明了什么呢? 就像API文档中说的那样, 他会首先判断该路径下是否存在有这个文件, 如果存在的话, 则不会创建,保留原来的文件. 当发现没有的话 才会去创建这么一个文件的!
除了这个createNewFile()方法可以判断某一文件存在 还有另一种方法可以判断
exists public boolean exists() 测试此抽象路径名表示的文件或目录是否存在。 返回: 当且仅当此抽象路径名表示的文件或目录存在时,返回 true;否则返回 false 抛出: SecurityException - 如果存在安全管理器,且其 SecurityManager.checkRead(java.lang.String) 方法拒绝对文件或目录进行写访问
|
用这个 exists() 做了个demo ,
import java.io.*;
public class IODemo2{ public static void main(String []args){ File f = new File("g://1.txt"); if(f.exists()){ System.out.println("文件时存在的"); }else{ System.out.println("文件时不存在的"); } } }
|
在控制台中的显示是这样的:
|
那么这里介绍一个删除方法
delete public boolean delete() 删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除。 返回: 当且仅当成功删除文件或目录时,返回 true;否则返回 false 抛出: SecurityException - 如果存在安全管理器,且其 SecurityManager.checkDelete(java.lang.String) 方法拒绝对文件进行删除访问
|
这个方法可以删除文件,
import java.io.* ;
public class IODemo3{ public static void main(String []args){ File f = new File("g://学习总结//Java SE//MLDN//IO(一)//Test2.java"); if(f.exists()){ f.delete(); }else{ try{ f.createNewFile(); }catch(IOException e){ System.out.println(e.getMessage()); } } } } |
如果前面指定的绝对路径上存在有该文件的话 则
F.delete() 方法会将该文件删除.
如果该文件不存在的话 则会创建该文件.
再认识一个新的方法
list public String[] list() 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。 如果此抽象路径名不表示一个目录,那么此方法将返回 null。否则返回一个字符串数组,每个数组元素对应目录中的每个文件或目录。表示目录本身及其父目录的名称不包括在结果中。每个字符串是一个文件名,而不是一条完整路径。 不保证所得数组中的相同字符串将以特定顺序出现,特别是不保证它们按字母顺序出现。 |
这个list() 会返回指定绝对路径上的所有文件名称和 目录名称! 例如下面
import java.io.*;
public class IODemo4{ public static void main(String args[]){ File f = new File("g://学习总结//Java SE//MLDN//IO(一)"); String []aa = f.list(); for(int i=0;i<aa.length;i++){ System.out.println(aa[i]); } } } |
该list() 会返回 g://学习总结//Java SE//MLDN//IO(一) 路径下所有的目录名称和文件名称, 返回成一个 String 数组的形式 并且输出. 结果如下:
|
如果
File f = new File("g://学习总结//Java SE//MLDN//IO(一)//asdasd.fsafa"); |
的构造参数不是一个实际有效地路径. 那么执行的话会报错!
那又如何检测这个路径是否正确呢?
isDirectory public boolean isDirectory() 测试此抽象路径名表示的文件是否是一个目录。 返回: 当且仅当此抽象路径名表示的文件存在且 是一个目录时,返回 true;否则返回 false 抛出: |
isDirectory() 可以检测这个绝对路径是不是有效地路径
如下面代码写
import java.io.*; public class IODemo5{ public static void main(String args[]){ File f = new File("g://学习总结//Java SE//MLDN//IO(一)//fds"); if(f.isDirectory()){ String []aa = f.list(); for(int i=0;i<aa.length;i++){ System.out.println(aa[i]); } }else{ System.out.println("路径不对"); } } } |
isDirectory() 就可以判断这个路径是不是一个正确的路径 , 从而进行 if else 的判断
在控制台的结果就是这样的
|
Java中一个数据流的读取 是打开一个流; 如果有信息 就读入; 然后关闭流!
把它比喻成一本书的话 就是这样了: 首先找到这本书, 然后从书中读取数据过度到大脑之中, 书读完之后还要讲述放下 (也就相当于关闭)
而写也基本相同,, 在第二步中将 "如果有信息, 就读入" 改成了 "如果有信息, 就写入"
那么说了 在File类中的操作, 只是对文件的创建, 删除 判断是否存在 判断构造参数是否为一个正确的路径 还有根据一个路径 来 遍历该目录下 所有的文件 和 目录下的文件
那么怎么在创建了一个文件之后 , 再在文件中写入内容呢?
首先RandomAccessFile 可以做到, 该类与文件内容有关,
public class RandomAccessFile extends Object implements DataOutput, DataInput, Closeable 此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。 通常,如果此类中的所有读取例程在读取所需数量的字节之前已到达文件末尾,则抛出 EOFException(是一种 IOException)。如果由于某些原因无法读取任何字节,而不是在读取所需数量的字节之前已到达文件末尾,则抛出 IOException,而不是 EOFException。需要特别指出的是,如果流已被关闭,则可能抛出 IOException。
|
先写了一个文件试试
import java.io.*;
public class IODemo6{ public static void main(String []args) throws IOException{ RandomAccessFile raf = new RandomAccessFile("g://test.txt","rw"); String name = "zero"; int age = 12 ; raf.writeChars(name); raf.writeInt(age); raf.close(); } } |
该文件在G 盘目录下查看, OK存在, 内容也没有问题. 但内容却是这个样子的 ,先放着 一会再说
|
writeChars public final void writeChars(String s) throws IOException 按字符序列将一个字符串写入该文件。每个字符均写入数据输出流,类似于使用 writeChar 方法。写入从文件指针的当前位置开始。 指定者: 接口 DataOutput 中的 writeChars 参数: s - 要写入的 boolean 值。 抛出: IOException - 如果发生 I/O 错误。 |
File 与文件有关
RandomAccessFile 与 文件内容有关 ,