JavaSE第八章 IO流

8 第八章IO流

8.1 File类

File 就是文件 ,在java中表示路径名。

  • 实例File类是不可变的; 也就是说,一旦创建,由File对象表示的抽象路径名永远不会改变。

路径有相对路径和绝对路径。

8.1.1 构造方法

  • File(String path)
    将一个字符串描述的路径,封装成一个 File对象。
  • File(String parent,String Child)
    将两个字符串(父级路径, 子级路径),拼接之后形成的路径封装成一个File对象。
  • File(File parent, String child)
    将File类型的父级路径和String类型的字节路径拼接成一个新路径,封装成File对象

**注意:**创建好File对象后,只是封装了一个路径, 和磁盘上是否有这个路径无关。

8.1.2 创建功能

  • createNewFile() 创建文件
  • mkdir() 创建文件夹,如果父级路径不存在,则文件夹创建失败。
  • mkdirs() 创建文件夹,如果路径不存在,则会自动创建路径。

8.1.3 删除功能

  • delete() 可以删除文件,也可以删除文件夹。

注意:不能删除非空文件夹(也就是说只要文件夹里还有文件,delete()方法就不能删除这个文件夹

8.1.4 重命名功能

  • renameTo(File dest) 重命名,参数是修改后的文件路径。

注意:如果修改了父级路径就是剪切+重命名,不修改父级路径就仅仅只是重命名。

8.1.5 判断功能

  • exists(),判断调用者路径是否存在
  • isFile(),判断调用者是否是一个文件
  • isDirectory(),判断调用者是否是一个文件夹

8.1.6 获取功能

获取路径

  • getName() 获取最短的那个文件或者文件夹名称
  • getPath() 获取相对路径,构造方法中传入的那个字符串
  • getAbsolutePath() 获取绝对路径

获取文件的属性

  • length() 获取文件的字节个数,只能针对文件使用,不能针对文件夹使用
  • lastModified() 获取文件的最后修改时间

获取文件夹中的内容

  • String[] list() 返回文件夹中的所有内容的名称(不包含子文件夹中的内容)
  • File[] listFiles() 返回文件夹中的所有内容的File对象(不包含子文件夹中的内容) 注意事项: 这两个方法只能针对文件夹使用,不能针对文件使用

8.2 IO流

8.2.1 字节流

InputStream

InputStream是一个定义了Java流式字节输入模式的抽象类。该类的所有方法在出错条件下引发一个IOException 异常。它的主要方法定义如下

方法 方法介绍
available() 返回可读的字节数量
read(byte[] b,int off,int len)
read()
skip(long n) 跳过指定的字节数
close() 关闭流,释放资源
reset() 重新读取位置为上次mark标记的位置
markSupported() 如果调用的流支持mark()或reset()就返回true

OutputStream

OutputStream是定义了流式字节输出模式的抽象类。该类的所有方法返回一个void值并且在出错情况下引发一个IOException异常。它的主要方法定义如下:

方法 方法介绍
write(int b) 向输出流写入单个字节
write(byte[] buffer) 向一个输出流写入一个完整的字节数组
write(byte[] buffer,int off,int numBytes) 写入数组buffer 以 buffer[offset]为起点的numBytes个字节区域内的内容
flush() 刷新缓冲流
close() 关闭输出流

8.2.2 字符流

Reader

Reader是Java定义的流式字符输入模式的抽象类。类中的方法在出错时引发IOException异常。

方法 方法介绍
read()
read(char[] buffer)
read(char[] buffer,int off,int numChars)
ready()
skip(long numChars)
markSupported()
reset()
mark(int numChars)
close()

Writer

Reader是Java定义的流式字符输入模式的抽象类。类中的方法在出错时引发IOException异常。

方法 方法介绍
write(char[] buffer)
write(char[] buffer,int off,int numChars)
close()
flush()
append(CharSequence csq) 追加一个字符序列
append(CharSequence csq, int start,int end)
append(char c) 追加写入一个16位的字符

8.3 打印流

在整个IO包中,打印流是输出信息最方便的类,主要包括字节打印流(PrintStream)和字符打印流(PrintWriter)。打印流提供了非常方便的打印功能,可以打印任何的数据类型。如:小数、整数、字符串等。

PrintStream和PrintWriter都属于输出流,分别针对输出字节和字符。

PrintStream和PrintWriter提供了重载的print()、println()方法用于多种数据类型的输出。

PrintStream和PrintWriter不会抛出异常,用户通过检测错误状态获取错误信息。

PrintStream和PrintWriter有自动flush 功能。

8.3.1 打印流构造方法

PrintStream 字节打印流

  1. PrintStream(OutputStream out);获得指定输出流的字节打印流对象。

  2. PrintStream(OutputStream out, boolean auotflush);获得指定输出流的字节打印流对象。autoflush 是否自动刷新。

  3. PrintStream(OutputStream out, boolean auotflush, String encoding);获得指定输出流的字节打印流对象。autoflush 是否自动刷新。encoding 指定字符编码。

PrintWriter 字符打印流

  1. PrintWriter(OutputStream out);获得指定输出流的字符打印流对象。

  2. PrintWriter(OutputStream out, boolean autoflush);获得指定输出流的字符打印流对象。autoflush 是否自动刷新。

  3. PrintWriter(Writer out);获得指定字符输出流的字符打印流对象。

  4. PrintWriter(Writer out, boolean autoflush);获得指定字符输出流的字符打印流对象。autoflush 是否自动刷新。

8.3.2 打印流的常用操作:print(), println()****

**print();不带换行的打印输出 **

   try {
    
    
       	File file = new File("test.txt");
		FileOutputStream fos = new FileOutputStream(file);
       	PrintWriter ps = new PrintWriter(fos,true);
       	ps.print("aaaaa");
       	ps.print("bbbbb");     
       	ps.close();	
       }

**println();每打印出一行数据后,执行换行。 **

  try {
    
    
       	File file = new File("test.txt");
       	FileOutputStream fos = new FileOutputStream(file);
       	PrintWriter ps = new PrintWriter(fos,true);
       	ps.println("aaaaa");
       	ps.println("bbbbb");
       	ps.close();	
       }

printf()

import java.io.* ;
public class PrintDemo01{
    
    
    public static void main(String arg[]) throws Exception{
    
    
        PrintStream ps = null ;        // 声明打印流对象
        // 如果现在是使用FileOuputStream实例化,意味着所有的输出是向文件之中
        ps = new PrintStream(new FileOutputStream(new File("d:" + File.separator + "test.txt"))) ;
        String name = "李兴华" ;    // 定义字符串
        int age = 30 ;                // 定义整数
        float score = 990.356f ;    // 定义小数
        char sex = 'M' ;            // 定义字符
        ps.printf("姓名:%s;年龄:%d;成绩:%f;性别:%c",name,age,score,sex) ;
        ps.close() ;
    }
};

总结

PrintStream out = new PrintStream(new FileOutputStream("E:\\demo.html"));
        /*out.println("666666666666");
        out.print("abcd");
        out.print("abcdefgh<br>");
        out.println("777777777777");*/
        out.println("3333333333333");
        out.close();

8.4 对象的序列化Serialization

“序列化”是一种****把对象的状态转化成字节流的机制****,“反序列”是其相反的过程,把序列化成的字节流用来在内存中重新创建一个实际的Java对象。这个机制被用来“持久化”对象。通过对象序列化,可以方便的实现对象的持久化储存以及在网络上的传输。大致的过程如下图所示:

对象被转换成“字节流”后可以存入文件,内存,亦或者是数据库内进行持久化保存。然后通过“反序列化”可以把“字节流”转换成实际的Java对象。

8.4.1 实现序列化

如何实现序列化

为了使一个Java对象能够被“序列化”,我们必须让这个对象实现java.io.Serializable接口。

此接口中没有定义任何的方法,所以****此接口是一个标识接口。表示一个类具备了“可序列化”的能力****。

import java.io.Serializable;
public class Person implements Serializable {
    
    
    private String name;

    public Person(String name) {
    
    
        this.name = name;
    }
}

上面就是一个实现了Serializable接口的Person类对象,这个对象现在就已经具备了“可序列化”的能力。所以此类的对象是可以经过“二进制数据流”进行传输的。而如果想要完成对象的输入或者输出,还必须依靠对象输出流(ObjectOutputStream)和对象输入流(ObjectInputStream)。

使用:“对象输出流”输出序列化对象的步骤有时候也称作“序列化”,而使用“对象输入流”读入对象的过程也称作“反序列化”。

8.4.2 对象输入输出流

对象输入流

public class ObjectInputStreamDemo {
    
    

    public ObjectInputStreamDemo() {
    
    
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
    
    
        ObjectInputStream objin = new ObjectInputStream(new FileInputStream("E:\\temp.obj"));

        Date d = (Date) objin.readObject();
        String s = (String) objin.readObject();
        User user = (User)objin.readObject();
       /* 要按照序列化的顺序反序列化
       String s = (String) objin.readObject();
        Date d = (Date) objin.readObject();*/
        System.out.println(user);
        System.out.println("s = " + s);
        System.out.println("d = " + d);
    }
}

对象输出流

public class ObjectOutputStreamDemo {
    
    

    public ObjectOutputStreamDemo() {
    
    
    }

    public static void main(String[] args) throws IOException {
    
    
        ObjectOutputStream objout = new ObjectOutputStream(new FileOutputStream("E:\\temp.obj"));
        objout.writeObject(new Date());
        objout.writeObject("555555555");

        objout.writeObject(new User("jim","1235689"));

        objout.close();
    }

}

猜你喜欢

转载自blog.csdn.net/qq_37079157/article/details/112506529