【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); //参数为路径 复制文件

原文地址:https://www.cnblogs.com/jwnming/p/12107205.html