IO流-其他流

本文详细介绍了JavaPrintStream和PrintWriter的构造方法与功能,以及它们之间的区别。同时讨论了数据流(DataOutputStream和DataInputStream)用于读写数据,序列化流(ObjectOutputStream和ObjectInputStream)用于对象的序列化与反序列化,最后提到了ApacheCommons-io库在简化IO操作中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

打印流

PrintStream/PrintWriter(打印流)

  • 作用:打印流可以实现更方便、更高效的打印数据出去,能实现打印啥出去就是啥出去。

PrintStream提供的打印数据的方案

构造器说明
public PrintStream(OutputStream/File/String)打印流直接通向字节输出流/文件/文件路径
public PrintStream(String fileName,Charset charset)可以指定写出去的字符编码
public PrintStream(OutputStream out,boolean autoFlush)可以指定实现自带刷新
public PrintStream(OutputStream out,boolean autoFlush,String encoding)可以指定实现自带刷新,并可指定字符的编码
方法说明
public void println(Xxx xx)打印任意类型的数据出去
public void write(int/byte[ ]/byte[ ]一部分)可以支持写字节数据出去
import java.io.PrintStream;

public class Test {
    public static void main(String[] args){
        try (
                //创建一个打印流管道
                PrintStream ps = new PrintStream("src\\com\\123.txt");
                ){
            ps.println(97);
            ps.println('a');
            ps.println("我爱中国");
            ps.println(true);
            ps.println(99.5);

            ps.write(97);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

PrintWriter提供的打印数据的方案

构造器说明
public PrintWriter(OutputStream/File/String)打印流直接通向字节输出流/文件/文件路径
public PrintWriter(String fileName,Charset charset)可以指定写出去的字符编码
public PrintWriter(OutputStream out,boolean autoFlush)可以指定实现自带刷新
public PrintWriter(OutputStream out,boolean autoFlush,String encoding)可以指定实现自带刷新,并可指定字符的编码
方法·说明
public void println(Xxx xx)打印任意类型的数据出去
public void write(int/String/char[ ]/...)可以支持字符数据出去

PrintStream和PrintWriter的区别

  • 打印数据的功能上是一模一样的:都是使用方便,性能高效(核心优势)
  • PrintStream继承自字节输出流OutputStream,因此支持写字节数据的方法
  • PrintWriter继承自字符输出流Writer,因此支持写字符数据出去

打印流的一种应用:输出语句的重定向

  • 可以把输出语句的打印位置改到某个文件中去
import java.io.PrintStream;

public class Test {
    public static void main(String[] args){
        System.out.println("老骥伏枥");
        System.out.println("志在千里");
        try (
                PrintStream ps = new PrintStream("src\\com\\123.txt");
                ){
            // 把系统默认的打印流对象改成自己盒子的打印流
            System.setOut(ps);

            System.out.println("烈士暮年");
            System.out.println("壮心不已");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

数据流

DataOutputStream(数据输出流)

  • 允许把数据和其类型一并写出去
构造器说明
public DataOutputStream(OutputStream out)创建新数据输出流包装基础的自己输出流
方法说明
public final void writeByte(int v)throw IOException将byte类型的数据写入基础的自己输出流
public final void writeInt(int v)throw IOException将int类型的数据写入基础的自己输出流
public final void writeDouble(Double v)throw IOException将double类型的数据写入基础的自己输出流
public final void writeUTF(String str)throw IOException将字符串数据以UTF-8编码成字节类型的数据写入基础的自己输出流
public void write(int v/byte[ ]一部分)支持写字节数据出去 

 

DataInputStream(数据输入流)

  • 用于读取数据输出流写出去的数据
构造器说明
public DataInputStream(InputStream is)创建新数据输入流包装基础的字节输入流
方法说明
public final byte readByte()throw IOException读取字节数据返回
public final int readInt()throw IOException读取int类型的数据返回
public final double readDouble()throw IOException读取double类型的数据返回
public final String readUTF()throw IOException读取字符串数据(UTF-8)返回
public int readInt/read(byte[ ])支持读字节数据进来

 

序列化流

ObjectOutputStream(对象字节输出流)

  • 可以把Java对象进行序列化:把Java对象存入到文件中去
构造器说明
public ObjectOutputStream(OutputStream out)创建对象字节输出流,包装基础的字节输出流
方法说明
public final void writeObject(object o)throw IOException把对象写出去

注意:对象如果要参与序列化,必须实现序列化接口(java.io.Serializable) 

User类

// 注意:对象如果需要序列化,必须实现序列化接口
public class User implements Serializable {
    private String loginName;
    private String userName;
    private int age;
    private String passWord;

    public User() {
    }

    public User(String loginName, String userName, int age, String passWord) {
        this.loginName = loginName;
        this.userName = userName;
        this.age = age;
        this.passWord = passWord;
    }

    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    @Override
    public String toString() {
        return "User{" +
                "loginName='" + loginName + '\'' +
                ", userName='" + userName + '\'' +
                ", age=" + age +
                ", passWord='" + passWord + '\'' +
                '}';
    }
}

Test类 

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class Test {
    public static void main(String[] args){
        try (
                // 创建一个对象字节输出流包装原始的字节输出流
                ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("src\\com\\abc.txt"));
                ){
            // 创建一个Java对象
            User u = new User("admin","张三",22,"88888888");
            // 序列化对象到文件中去
            oos.writeObject(u);
            System.out.println("序列化成功");;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

ObjectInputStream(对象字节输入流)

  • 可以把Java对象仅反序列化:把存储在文件中的Java对象读入到内存中来
构造器说明
public ObjectInputStream(InputStris)创建对象字节输入流,包装基础的字节输入流
方法说明
public final Object readObject()把存储在文件中的Java对象读出来
import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class Test {
    public static void main(String[] args){
        try (
                // 创建一个对象字节输入流管道,包装低级的字节输入流与源文件连通
                ObjectInputStream ois = new ObjectInputStream(new FileInputStream("src\\com\\abc.txt"))
                ){
            User u = (User) ois.readObject();
            System.out.println(u);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

如果要一次序列化多个对象,要怎么办?

        用一个ArrayList集合存储多个对象,而后直接对集合进行序列化即可

        注意:ArrayList集合以及实现了序列化接口

补充知识:IO框架

什么是框架

  • 解决某类问题,编写的一套类、接口等,可以理解成一个半成品,大多框架都是第三方研发的
  • 好处:在框架的基础上开发,可以得到优秀的软件架构,并提高开发效率
  • 框架的形式:一般是把类、接口等编译成class形式,再压缩成一个.jar结尾的文件发行出去

什么是IO框架

  • 封装了Java提高的对文件、数据进行操作的代码,对外提高了更简单的方式来对文件进行操作,对数据进行读写等

Commons-io

  • Commons-io是apache开源基金组织提供的一组由关IO操作的小框架,目的是提高IO流的开发效率。
FileUtils类提供的部分方法展示说明
public static void copyFile(File srcFile,File destFile)复制文件
public static void copyDirectory(File srcFile,File destDir)复制文件夹
public static void deleteDirectory(File directory)删除文件夹
public static String readFileToString(File file,String encoding)读数据
public static void writeStringToFile(File file,String data,String charname,boolean append)写数据
IOUtils类提供的部分方法展示说明
public static int copy(InputStram inputStream,OutputStream outputStream)复制文件
public static int copy(Reader reader,Writer writer)复制文件
public static void write(String data,OutputStream output,String charsetName)写数据 

 

步骤:导入commons-io-2.15.1.jar框架到项目中去

  1. 在项目中创建一个文件夹:lib
  2. 将commons-io-2.15.1.jar文件复制到lib文件夹
  3. 在jar文件上点右键,选择Add as Library -> 点击OK
  4. 在类中导包使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值