Java高级教程秘籍-13章_IO流下

六、其它的流的使用

【以下三个流只要了解即可!!】

1. 标准的输入输出流:

【字节流】
System.in:标准的输入流,默认从键盘输入
System.out:标准的输出流,默认从控制台输出

修改默认的输入和输出行为:
System类的setIn(InputStream is) / setOut(PrintStream ps)方式重新指定输入和输出的流。

2. 打印流:

PrintStream 和PrintWriter

说明:

  • 提供了一系列重载的print()和println()方法,用于多种数据类型的输出
  • System.out返回的是PrintStream的实例

3. 数据流:

【变量保存在内存中掉电后就消失,那么就存在文件中!】
DataInputStream 和 DataOutputStream

作用:
用于读取或写出基本数据类型的变量或字符串
用于读取和写出基本数据类型、 String类的数据

DataInputStream中的方法

  • boolean readBoolean()
  • char readChar()
  • double readDouble()
  • long readLong()
  • String readUTF() byte readByte()
  • float readFloat()
  • short readShort()
  • int readInt()
  • void readFully(byte[] b)

示例代码:

/*
练习:将内存中的字符串、基本数据类型的变量写出到文件中。

注意:处理异常的话,仍然应该使用try-catch-finally.
 */
@Test
public void test3() throws IOException {
    //1.
// 此文件中读取要使用DataInputStream来读取,不能直接打开读取
    DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.txt"));
    //2.
    dos.writeUTF("刘建辰");
    dos.flush();//刷新操作,将内存中的数据写入文件
    dos.writeInt(23);
    dos.flush();
    dos.writeBoolean(true);
    dos.flush();
    //3.
    dos.close();
}
/*
将文件中存储的基本数据类型变量和字符串读取到内存中,保存在变量中。

注意点:读取不同类型的数据的顺序要与当初写入文件时,保存的数据的顺序一致!

 */
@Test
public void test4() throws IOException {
    //1.
    DataInputStream dis = new DataInputStream(new FileInputStream("data.txt"));
    //2.变量的顺序不能变
    String name = dis.readUTF();
    int age = dis.readInt();
    boolean isMale = dis.readBoolean();

    System.out.println("name = " + name);
    System.out.println("age = " + age);
    System.out.println("isMale = " + isMale);

    //3.
    dis.close();
}

七、对象流的使用

【对象流需要掌握;重点:序列化机制!!】
【用于传输对象;对象所属的类是可序列化的】

1.对象流:

ObjectInputStream 和 ObjectOutputStream

2.作用:

ObjectOutputStream:内存中的对象—>存储中的文件、通过网络传输出去:序列化过程
ObjectInputStream:存储中的文件、通过网络接收过来 —>内存中的对象:反序列化过程

3.对象的序列化机制:

对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。//当其它程序获取了这种二进制流,就可以恢复成原来的Java对象。

4.序列化代码实现:

@Test
public void testObjectOutputStream(){
    ObjectOutputStream oos = null;

    try {
        //1.
        oos = new ObjectOutputStream(new FileOutputStream("object.dat"));
        //2.
        oos.writeObject(new String("我爱北京天安门"));
        oos.flush();//刷新操作

         oos.writeObject(new Person("王铭",23));
        oos.flush();

        oos.writeObject(new Person("张学良",23,1001,new Account(5000)));
        oos.flush();

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if(oos != null){
            //3.
            try {
                oos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

}

5.反序列化代码实现:

@Test
public void testObjectInputStream(){
    ObjectInputStream ois = null;
    try {
        ois = new ObjectInputStream(new FileInputStream("object.dat"));

        Object obj = ois.readObject();
        String str = (String) obj;

        Person p = (Person) ois.readObject();
        Person p1 = (Person) ois.readObject();

        System.out.println(str);
        System.out.println(p);
        System.out.println(p1);

    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } finally {
        if(ois != null){
            try {
                ois.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}

6.实现序列化的对象所属的类需要满足:

1.需要实现接口:Serializable

  • 2.当前类提供一个全局常量:serialVersionUID

  • 3.除了当前Person类需要实现Serializable接口之外,还必须保证其内部所属性也必须是可序列化的。(默认情况下,基本数据类型可序列化)

  • 补充:ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量

八、RandomAccessFile的使用

【比较特殊;没有那么重要;】

1.随机存取文件流:RandomAccessFile

2.使用说明:

  1. RandomAccessFile直接继承于java.lang.Object类【而不是继承抽象基类!】,实现了DataInput和DataOutput接口

  2. RandomAccessFile既可以作为一个输入流,又可以作为一个输出流

  3. 如果RandomAccessFile作为输出流时,写出到的文件如果不存在,则在执行过程中自动创建。
    如果写出到的文件存在,则会对原文件内容进行覆盖。(默认情况下,从头覆盖)

  4. 可以通过相关的操作,实现RandomAccessFile”插入“数据的效果。seek(int pos)
    【字节流!】

3.典型代码

典型代码1:

@Test
public void test1() {

    RandomAccessFile raf1 = null;
    RandomAccessFile raf2 = null;
    try {
        //1.
        raf1 = new RandomAccessFile(new File("爱情与友情.jpg"),"r");
        raf2 = new RandomAccessFile(new File("爱情与友情1.jpg"),"rw");
        //2.
        byte[] buffer = new byte[1024];
        int len;
        while((len = raf1.read(buffer)) != -1){
            raf2.write(buffer,0,len);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        //3.
        if(raf1 != null){
            try {
                raf1.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        if(raf2 != null){
            try {
                raf2.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}

典型代码2:

/*
使用RandomAccessFile实现数据的插入效果
文件中插入字符串很消耗内存!
 */
@Test
public void test3() throws IOException {

    RandomAccessFile raf1 = new RandomAccessFile("hello.txt","rw");

    raf1.seek(3);//将指针调到角标为3的位置
    //保存指针3后面的所数据到StringBuilder中
    StringBuilder builder = new StringBuilder((int) new File("hello.txt").length());
    byte[] buffer = new byte[20];
    int len;
    while((len = raf1.read(buffer)) != -1){
        builder.append(new String(buffer,0,len)) ;
    }
    //调回指针,写入“xyz”
    raf1.seek(3);
    raf1.write("xyz".getBytes());

    //将StringBuilder中的数据写入到文件中
    raf1.write(builder.toString().getBytes());

    raf1.close();

    //思考:将StringBuilder替换为ByteArrayOutputStream
}

九、Path、Paths、Files的使用

1.NIO的使用说明:

  • Java NIO (New IO,Non-Blocking IO)是从Java 1.4版本开始引入的一套新的IO API,可以替代标准的Java IO AP。
  • NIO与原来的IO同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的(IO是面向流的)、基于通道的IO操作。
  • NIO将以更加高效的方式进行文件的读写操作。
  • 随着 JDK 7 的发布,Java对NIO进行了极大的扩展,增强了对文件处理和文件系统特性的支持,以至于我们称他们为 NIO.2。

2.Path接口的使用 —jdk7提供

2.1 Path的说明:Path替换原有的File类。

2.2 如何实例化:

2.3 Path常用方法

  • String toString() : 返回调用 Path 对象的字符串表示形式
  • boolean startsWith(String path) : 判断是否以 path 路径开始
  • boolean endsWith(String path) : 判断是否以 path 路径结束
  • boolean isAbsolute() : 判断是否是绝对路径
  • Path getParent() :返回Path对象包含整个路径,不包含 Path 对象指定的文件路径
  • Path getRoot() :返回调用 Path 对象的根路径
  • Path getFileName() : 返回与调用 Path 对象关联的文件名
  • int getNameCount() : 返回Path 根目录后面元素的数量
  • Path getName(int idx) : 返回指定索引位置 idx 的路径名称
  • Path toAbsolutePath() : 作为绝对路径返回调用 Path 对象
  • Path resolve(Path p) :合并两个路径,返回合并后的路径对应的Path对象
  • File toFile(): 将Path转化为File类的对象

3.Files工具类 —jdk7提供

3.1 作用:操作文件或文件目录的工具类

3.2 常用方法:

java.nio.file.Files 用于操作文件或目录的工具类。

Files常用方法:

  • Path copy(Path src, Path dest, CopyOption … how) : 文件的复制
  • Path createDirectory(Path path, FileAttribute<?> … attr) : 创建一个目录
  • Path createFile(Path path, FileAttribute<?> … arr) : 创建一个文件
  • void delete(Path path) : 删除一个文件/目录,如果不存在,执行报错
  • void deleteIfExists(Path path) : Path对应的文件/目录如果存在,执行删除
  • Path move(Path src, Path dest, CopyOption…how) : 将 src 移动到 dest 位置
  • long size(Path path) : 返回 path 指定文件的大小

Files常用方法:用于判断

  • boolean exists(Path path, LinkOption … opts) : 判断文件是否存在
  • boolean isDirectory(Path path, LinkOption … opts) : 判断是否是目录
  • boolean isRegularFile(Path path, LinkOption … opts) : 判断是否是文件
  • boolean isHidden(Path path) : 判断是否是隐藏文件
  • boolean isReadable(Path path) : 判断文件是否可读
  • boolean isWritable(Path path) : 判断文件是否可写
  • boolean notExists(Path path, LinkOption … opts) : 判断文件是否不存在

Files常用方法:用于操作内容

  • SeekableByteChannel newByteChannel(Path path, OpenOption…how) : 获取与指定文件的连
    接, how 指定打开方式。
  • DirectoryStream newDirectoryStream(Path path) : 打开 path 指定的目录
  • InputStream newInputStream(Path path, OpenOption…how):获取 InputStream 对象
  • OutputStream newOutputStream(Path path, OpenOption…how) : 获取 OutputStream 对象

整理不易🚀🚀,关注和收藏后拿走📌📌欢迎留言🧐👋📣✨
快来关注我的公众号🔎AdaCoding 和 GitHub🔎 AdaCoding123
在这里插入图片描述

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值