• 【Java】Java中I/O流使用及详解


    I / O 流

    流是一个对象,是JVM与外部用来传递数据的

    I / O编程步骤:

    1. 创建节点流
    2. 封装过滤流
    3. 读写数据
    4. 关闭流

    有三个分类:

    ​ a.按数据方向:输入流、输出流

    ​ b.按数据单位:字节流、字符流

    ​ 字节流:以字节为单位,可以处理一切数据

    ​ 字符流:以字符为单位,只能处理文本数据

    ​ c.按流的功能:节点流、过滤流

    ​ 节点流:实际传输数据的流

    ​ 过滤流:给节点类怎去功能

    字节流

    字节流父类:InputStream(相对JVM,从外部读到JVM) /OutputStream

    文件字节流(节点流):FileInputStream/FileOutputStream

    文件输出流:FileOutputStream

    ​ 常见的方法:

    ​ write(int a);写出一个字符到文件里,例如写A:write(65);

    ​ write(byte[] b); 写出字节数组到文件

    ​ write(byte[] b, int startIndex, int length); 写出固定长度字节数组到文件

    ​ close(); 关闭流

    使用方法:

    ​ OutputStream os = new FileOutputStream(“D:/test.txt”, true);//第二个参数是否追加,不追加则覆盖原有文件

    ​ os.write(65);

    文件输入流:FileInputStream

    ​ 常见的方法: 返回-1结束

    ​ int read(int a); 从文件读入一个字符到JVM,

    ​ int read(byte[] b); 从文件读入字节数组

    ​ int read(byte[] b, int startIndex, int length); 从文件读入固定长度字节数组到

    使用方法:

    ​ InputStream os = new FileInputStream(“D:/test.txt”);//第二个参数是是否追加,若不追加则覆盖原有文件

    ​ System.out.prinltn((char)os.read());

    --------------------------------------------------------

    数据流:DataOutputStream/DataInputStream 向文件写、读八种基本类型数据和String

    ​ 常见方法:

    ​ writeUTF(); 写出字符串类型

    ​ writeLong(); 写长整型

    ​ writeDouble(); 写double类型

    readUTF(); 读入字符串类型

    ​ readLong(); 读长整型

    ​ readDouble(); 读double类型

    ​ 用法:InputStream is = new FileInputStream(“D: est.txt”); //创建节点流

    ​ DataInputStream dis = new DataInputStream(is); //将节点流封装为数据流

    ​ dis.readLong(); //读文件中的长整型数据

    ​ dis.close();

    --------------------------------------------------------

    I / O 增加缓冲区:BufferedInputStream、BufferedOutputStream

    最后一步是清空缓冲区(flush)

    用法:FileOutputStream fos = new FileOutputStream(“D: est.txt”);

    ​ BufferedOutputStream bos = enw BufferedOutputStream(fos);//增加缓冲区

    ​ bos.write(‘A’);

    ​ bos.flush(); //清空缓冲区,将数据写到文件里

    --------------------------------------------------------

    多层包装

    FileOutputStream fos = new FileOutputStream(“D: est.txt”);

    BufferedOutputStream bos = enw BufferedOutputStream(fos);//增加缓冲区

    DataOutputStream dos = new DataOutputStream(bos); //增加过滤

    PrintStream既有缓冲,又有过滤,例如常见的System.out

    可以写八种基本类型

    --------------------------------------------------------

    管道流:PipedInputStream / PipedOutputStream 用来在线程间进行数据交换

    RandomAccessFile:随机访问文件

    字符流

    编解码问题:由于字符的编码与解码方式不统一,可能造成乱码

    ​ String str = “abc”;

    ​ byte[] b = str.getBytes(“GBK”); //以GBK编码方式转化

    ​ String s = new String(b, “GBK”); //再以GBK编码方式接受

    乱码问题解决:如果编码和解码方式不统一,可在一次用错误的顺序从小编解码

    ---------------------------------------------------------

    字符流:Reader / Writer (处理文本)

    ​ 文件字符流:FileReader / FileWriter

    ​ FileReader fr = new FileReader(“D: est.txt”, true);

    字符缓冲流:BufferedReader / BufferedWriter (一般在写字符串是用PrintWriter )

    ​ 需要清空缓存flush;

    ​ 桥转换:InputStreamReader / OutputStreamWriter

    ​ 实现字节流与字符流的转换

    ​ FileOutputStream fos = new FileOutputStream(“D: est.txt”);

    ​ Writer s = new OutputStreamWriter(fos, “GBK”); //将字节流转换为字符流

    ​ BufferedWriter bw = new BufferedWriter(w);//添加缓冲区

    ​ 或

    ​ PrintWriter pw = new PrintWriter(“文件路径”); //****与上面的三行代码的功能类似,比较简便

    ​ pw.println(“asdg”); //写出一行

    对象的序列化

    将对象通过流进行传递

    ObjectOutputStream / ObjectInputStream

    只用实现了Serializable 接口的对象才能进行序列化,并且也需要其对象属性也实现该接口

    用transient修饰的属性为临时属性,不会参与对象的序列化

    用法:

    ​ class Student implements Serializable {假设里面有四个属性和其他方法}

    ​ main函数中:

    ​ Student s = new Student(“jiang”, 23, “男”, 14823412344);

    ​ OutputStream os = new FileOutputStream(“D: est.txt”);

    ​ FileWriter fw = new OutputStreamWriter(os, “GBK”);

    ObjectOutputStream oos = new ObjectOutputStream(fw);

    oos.writeObject(s); /将对象写出到文件内;

    对象序列化扩展、对象的克隆(clone)

    对象序列化扩展:

    对象序列化-版本号作用: public static final long serialVersionUID = 666L;

    ​ 1.为了类的变化后,在对象的的序列化(存对象)和反序列化(读对象,先加载类)时,尽可能的不影响其结果,可以为类添加SerialVersionUID私有静态长整型的常量。控制类的版本号,当类的版本号修改时,意味着之前的序列化数据全部作废

    ​ 2.当反序列化一个类对象时,如果这个类实现了Serializable接口,那么可以直接还原对象,如果这个类没有实现Serializable(这个类必是父类),那么就需要其调用构造方法

    对象的克隆:

    ​ 即对象的复制:在内存中复制出一个内容完全相同的对象,调用Object类中clone()方法,返回Object对象

    ​ 1.覆盖clone()方法:clone是受保护的,复写时应将其修饰符提高到public

    ​ 2.需要被克隆的类必须实现Cloneable接口(标记接口),

    ​ 浅拷贝:Object.clone();

    深拷贝:对象复制过程中,对象的属性如果又是对象,则递归的进行复制;实现深拷贝,利用对象序列化自定义克隆方法时,可以不实现Cloneable

    接口

    使用ByteArrayOutputStream将对象写入字节数组,再利用ByteArrayInputStream将对象读回,此方法在内存中操作,很快

    Commso – io.jar 工具包

    jar引入项目:右键对jar包BuildPath 再点击Add to BuildPath

    类:

    ​ FileUtils

    ​ 方法:

    ​ (static) copyFile(scrFile, destFile); //参数为路径 复制文件

  • 相关阅读:
    使用parted 对大容量盘进行分区
    CENTOS7 修改网卡名称为eth[012...],格式
    docker报错
    docker 存储定义成direct-lvm 模式
    Docker存储方式选型建议
    centos install docker setup centos7 安装docker
    docker centos yum 源
    zip 解压脚本
    IaaS,PaaS,Saas 云服务的介绍
    Codeforces Round #589 (Div. 2) D. Complete Tripartite(模拟)
  • 原文地址:https://www.cnblogs.com/jwnming/p/12107205.html
Copyright © 2020-2023  润新知