Java(io流)

毕设做socket通信时涉及到了io流,所以花了2天学习了一些io常用函数,在此总结一下

1.流(Stream)的概念

JVM

2.UML图

这次只学习了16个流,以下用 UML图展示出之间的关系

JVM
JVM

3.FileInputStream与FileOutputStream实现Copy

以字节方式读写数据

FileInputStream fis = new FileInputStream("D:/hahaha.txt");
FileOutputStream fos = new FileOutputStream("D:/hhh.txt",true);

byte[]bytes=new byte[1024];//每次传输1kb
int temp=0;//实际读取的字节数
while((temp=fis.read(bytes))!=-1){
  fos.write(bytes,0,temp);
}
fos.flush();//刷新
fis.close();
fos.close();

4.FileReader与FileWriter实现Copy

以字符方式只能复制文本文件

FileReader fr = new FileReader("D:/b.txt");
FileWriter fw = new FileWriter("D:/c.txt");
char[]chars = new char[512];//1kb
int temp=0;//实际读取的字节数
while((temp=fr.read(chars))!=-1){
  fw.write(chars, 0, temp);
}
fw.flush();
fr.close();
fw.close();

5.BufferedReader与BufferedWriter实现Copy

API中写了 BufferedReader(Reader in),所以以下代码用InputStreamReader将字节输入流转为字符输入流

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("D:/b.txt")));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:/b.txt")));
String temp=null;
while((temp=br.readLine())!=null){
  bw.write(temp);
  bw.newLine();
}       
bw.flush();
br.close();
bw.close();

6.DataOutputStream与DataInputStream

数据字节输出流 可以将内存中的 "int i = 10" 写入到硬盘文件中,写进去的不是字符串,而是二进制数据(带类型)
要使用数据字节输入流读取数据,必须提前知道文件中的存储格式和顺序,读的顺序必须和写入的顺序相同

DataOutputStreamTest01.java

public class DataOutputStreamTest01 {
    public static void main(String[] args) throws IOException {
        DataOutputStream dos = new DataOutputStream(new FileOutputStream("D:/d"));
        byte b = 10;
        int i = 11;
        dos.writeByte(b);
        dos.writeInt(i);
        dos.flush();
        dos.close();
    }
}

DataInputStreamTest01.java

public class DataInputStreamTest01 {
    public static void main(String[] args) throws IOException {
        DataInputStream dis = new DataInputStream(new FileInputStream("D:/d"));
        byte b = dis.readByte();
        int i = dis.readInt();
        System.out.println(b);
        System.out.println(i);
        dis.close();
    }
}

7.PrintStream与PrintWriter

PrintStream是标准的输出流,默认打印到控制台,以字节的形式

String msg = "nero";
PrintStream ps = System.out;
ps.println(msg);

8.ObjectOutputStream与ObjectInputStream

java.io.ObjectOutputStream 序列化内存中对象到硬盘(Serial)

java.io.ObjectInputStream 将硬盘中的数据 反序列化 到JVM内存(DeSerial)

Object_User.java

  • 此类实现了Serializable接口,该接口表示“可序列化的”,此接口内没有任何方法,是一个标识接口
  • 标识的作用:会给该类添加一个属性 serialVersionUID(序列化版本号)
public class Object_User implements Serializable{
  private static final long serialVersionUID = 1L;
  /**
     * serialVersionUID为序列化版本号,起到标识作用,会隐式自动生成
   * 当此类更新后,版本号会发生变化,JVM会认为是两个不同的类,导致序列化过程出错
   * 为了避免此情况,一般显式声明serialVersionUID,提升兼容性
     */
    transient String name;//如果不想让该属性参加序列化,需要使用transient关键字修饰
    public Object_User(String name) {
        this.name = name;
    }
    public String toString(){
        return "User["+name+"]";
    }
}

ObjectOutputStreamTest01.java

public class ObjectOutputStreamTest01 {
    public static void main(String[] args) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:/e"));
        Object_User user = new Object_User("Nero");
        oos.writeObject(user);
        oos.flush();
        oos.close();
    }
}

ObjectInputStreamTest01.java

public class ObjectInputStreamTest01 {
    public static void main(String[] args) throws Exception {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:/e"));
        Object o = ois.readObject();
        System.out.println(o.toString());
        ois.close();
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容