Java基础之IO流(字节流、字符流、内存流、带缓存的流、序列化和反序列化)

  1. File类:File类提供了对文件的操作,可以通过字符串或URI来构建一个File类对象。通过对象,可以实现文件的创建(createNewFile)、删除(delete)、获得文件名(getName)、获得父目录对象(getParentFile)、获得父目录名称(getParent)、获得完整路径(getPath)等。File类提供了静态方法listRoots,返回所有的盘符(也是File对象),getTotalSpace方法会返回该目录所剩余的容量空间。
    f.list方法会返回f下所有的File对象的名称(也就是f目录下所有的文件以及文件夹的名称)。这个方法可以传递一个FileNameFilter(接口)的实例对象。这样会根据要求列出符合条件的文件名。
    f.listFiles方法返回f下的所有File对象。也可以传递一个实现FileFilter接口的实例对象作为参数。这样会根据要求列出符合条件的File对象。
public class Maintest {
    public static void main(String[] args) {
        File file=new File("e:\\aaa");
        String[] fileName=file.list(new FilenameFilter() {//匿名内部类
            @Override public boolean accept(File dir, String name) {
                return name.endsWith(".txt")?true:false;//将以.txt结尾的罗列出来
            }
        });
        for (String f:fileName) {
            System.out.println(f);
        }
        File[] f=file.listFiles(new FileFilter() {
            @Override public boolean accept(File pathname) {
                return pathname.isDirectory()?true:false;//将文件夹罗列出来
            }
        });
        for(File fi:f)
        {
            System.out.println(fi.getName());
        }
    }
}

运行结果:

123.txt
456.txt
999.txt
aaa.txt
abc.txt
ccc.txt
dataoutputstream.txt
object.txt
bbb
新建文件夹

2.字节流:InputStream和OutputStream是字节流的父类,是抽象的,不能创建对象。
(1).FileInputStream和FileOutputStream实现了这两个类。按字节读写。可以通过字符串或File对象来构建这两个流。输出流output提供的时write方法,输入流input提供了read方法,该方法返回读到的字节数。没读到返回-1。
(2).FilterOutputStream和FilterInputStream继承了OutputStream和InputStream类,没有新增任何方法,只是扩展了父类。这两个类的内部含有一个父类的引用。
(3).DataInputStream和DataOutStream分别继承了以上两个类。实现了DataInput和DataOutput这两个接口。这两个类可以读写基本数据类型。
(4).BufferedInputStream和BufferedOutputStream也是FilterInputStream和FileterOutputStream的子类。没有增加方法,但是带了缓存,性能高,支持流标记。
(5).PrintStream类可以方便输出,也是继承FilterOutputStream类,可以直接用字符串来构建。提供print(ln)方法,直接将内容打印到文件中。
(6).内存流:ByteArrayInputStream和ByteArrayOutputStream可以将字节读写到内存中。

3.字符流:Reader和Writer是字符流的基类,其实是以字节流为基础的。Reader完成了从字节到字符的解码过程,Writer完成了从字符到字节的编码过程。
(1).OutputStreamWriter和InputStreamReader继承了字符流的基类。构建字符流的时候要用到字节流。
(2).带缓存的字符流: BufferedWriter和BufferedReader,构建时要用到Writer和Reader。新增了newLine(换一行)和readLine(读一行)的方法。

FileOutputStream fo=new FileOutputStream("e:\\aaa.txt");
Writer writer=new OutputStreamWriter (fo);
BufferedWriter bw=new BufferedWriter(writer);

也可以通过FileReader和FileWriter来构建

FileReader fr=new FileReader("e:\\aaa.txt");
BufferedReader br=new BufferedReader(fr);

(3).PrintWriter和PrintStream相类似,为了方便输出。但PrintStream是字节流,PrintWriter是字符流。

4.序列化与反序列化:实现Serializable接口(表示接口,空的)的类支持序列化。transient修饰的成员不参与序列化。序列化过程:

public class Maintest {
    public static void main(String[] args) throws Exception{
    	//序列化过程
        OutputStream f=new FileOutputStream("e:\\aaa\\abcd.txt");
        ObjectOutputStream objectOutputStream=new ObjectOutputStream(f);
        objectOutputStream.writeObject(new Student("zhangsan",20));
        System.out.println("OK");
        //反序列化过程
        InputStream fi=new FileInputStream("e:\\aaa\\abcd.txt");
        ObjectInputStream objectInputStream=new ObjectInputStream(fi);
        System.out.println((Student)objectInputStream.readObject());
    }
}

运行结果:

OK
Student{name='zhangsan', age=20}

猜你喜欢

转载自blog.csdn.net/Hello_1024/article/details/83348685