java中的Io(input与output)操作总结(四)

前面已经把java io的主要操作讲完了
这一节我们来说说关于java io的其他内容

Serializable序列化
实例1:对象的序列化


代码如下:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
@SuppressWarnings("serial")
//一个类要想实现序列化则必须实现Serializable接口
class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return "Name:" + this.name + ", Age:" + this.age;
}
}
public class Demo {
public static void main(String[] args) {
String path = File.separator + "home" + File.separator + "siu" +
File.separator + "work" + File.separator + "demo.txt";
Person p1 = new Person("zhangsan",12);
Person p2 = new Person("lisi",14);
//此处创建文件写入流的引用是要给ObjectOutputStream的构造函数玩儿
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try {
fos = new FileOutputStream(path);
oos = new ObjectOutputStream(fos);
//这里可以写入对象,也可以写入其他类型数据
oos.writeObject(p1);
oos.writeObject(p2);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

所谓对象序列化就是把一个对象进行持久化存储,方便保留其属性
通俗点说,等于把一个对象从堆内存里边揪出来放到硬盘上
当然,如果你开心,你可以序列化其他东西,包括数组,基本数据类型等等
来看看内容,神马玩意儿这是……

 
实例2:对象的反序列化


代码如下:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class Demo {
public static void main(String[] args) {
String path = File.separator + "home" + File.separator + "siu" +
File.separator + "work" + File.separator + "demo.txt";
//好吧,这里代码写得着实有点长了,还要抛异常什么的
//如果你也看的烦,那就在主方法上抛吧,构造方法里用匿名对象就好了
//什么?别告诉我你不知道匿名对象
FileInputStream fis = null;
ObjectInputStream ois = null;
try {
fis = new FileInputStream(path);
ois = new ObjectInputStream(fis);
//这里返回的其实是一个Object类对象
//因为我们已知它是个Person类对象
//所以,就地把它给向下转型了
Person p = (Person)ois.readObject();
System.out.println(p);
//抛死你,烦烦烦~!!!
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
//还是要记得关闭下流
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

你看,我们把一个对象存放在硬盘上是为了方便日后使用
现在用得着它了,自然得拿出来


管道流
实例3:线程的通信


代码如下:

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
//实现Runnable接口,实现一个读的线程
class Read implements Runnable {
private PipedInputStream in;
//将需要读的管道流传入到构造函数中
public Read(PipedInputStream in) {
this.in = in;
}
//实现读这一线程
public void run() {
try {
byte[] buf = new byte[1024];
int temp = 0;
//循环读取
//read是一个阻塞方法,需要抛异常
//此处把打印流的代码也加入进来
//是因为如果没有读取到数据,那么打印的代码也无效
while((temp = in.read(buf)) != -1) {
String str = new String(buf,0,temp);
System.out.println(str);
}
} catch (IOException e) {
//其实这里应抛出一个自定义异常的
//暂时我还没弄清楚
e.printStackTrace();
} finally {
try {
//我已经抛火了,这只是为了提醒自己异常很重要
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//这里实现一个写的类
class Write implements Runnable {
private PipedOutputStream out;
//将管道输入流传进来
public Write(PipedOutputStream out) {
this.out = out;
}
public void run() {
try {
//这里开始写出数据
out.write("管道输出".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//其实应该可以把这个关闭方法写到上面那个try里边
//但是这样感觉怪怪的,逻辑不大对
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public class Demo {
public static void main(String[] args) {
PipedInputStream in = new PipedInputStream();
PipedOutputStream out = new PipedOutputStream();
try {
//连接管道
in.connect(out);
//创建对象,开启线程
//此处同样放进try...catch里面
//因为如果没有链接管道,下面操作无意义
Read r = new Read(in);
Write w = new Write(out);
//把已经实现好run方法的对象放入线程中执行
new Thread(r).start();
new Thread(w).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}

好吧,废了那么大劲儿,就打印了这么一句话,异常抛弃来很烦,为了注重细节……


管道流也许很难理解,其实非也
我们知道,字节流和字符流都需要数组来进行流的中转
而管道流则直接串联两条流,一边发送数据,一边接收
然而,同时通信的的两种状态,如何才能确定发送和接收的一致性呢
那么,就需要用到线程,无论是接收方还是发送方先执行
总会造成一个线程的阻塞状态,从而等待另一方的数据传过来
总体而言,管道流的目的,也就是为了线程通信
此外,还有PipedReader和PipedWriter类,操作原理都一样,这里就不再赘述了
DataOutputStream和DataInputStream类
实例4:基本数据类型的写入


代码如下:

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo {
public static void main(String[] args) {
String path = File.separator + "home" + File.separator + "siu" +
File.separator + "work" + File.separator + "demo.txt";
DataOutputStream d = null;
try {
//此处需要传入一个OutputStream类的对象
d = new DataOutputStream(new FileOutputStream(path));
//开始写入基本数据类型
d.writeInt(12);
d.writeBoolean(true);
d.writeDouble(12.2223);
d.writeChar(97);
//刷新流
d.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
d.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

此处我们并不能直观看懂内容,因为它采用字节流的方式操作,而不是字符流
我们只需要知道,此程序已经将基本数据类型写入到硬盘即可


实例5:基本数据类型的读取


代码如下:

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class Demo {
public static void main(String[] args) {
String path = File.separator + "home" + File.separator + "siu" +
File.separator + "work" + File.separator + "demo.txt";
DataInputStream d = null;
try {
d = new DataInputStream(new FileInputStream(path));
//按存储顺序读取基本数据类型
System.out.println(d.readInt());
System.out.println(d.readBoolean());
System.out.println(d.readDouble());
System.out.println(d.readChar());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
d.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

这里要注意的是,一定要按照写入顺序读取,否则会发生数据的打印错误

(0)

相关推荐

  • java中的Io(input与output)操作总结(一)

    所谓IO,也就是Input与Output的缩写.在java中,IO涉及的范围比较大,这里主要讨论针对文件内容的读写 其他知识点将放置后续章节(我想,文章太长了,谁都没耐心翻到最后) 对于文件内容的操作主要分为两大类 分别是: 字符流 字节流 其中,字符流有两个抽象类:Writer Reader 其对应子类FileWriter和FileReader可实现文件的读写操作 BufferedWriter和BufferedReader能够提供缓冲区功能,用以提高效率 同样,字节流也有两个抽象类:Input

  • java实现输入输出流代码分享

    1,编写一个程序,读取文件test.txt的内容并在控制台输出.如果源文件不存在,则显示相应的错误信息. package src; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class Test { public static void main(String[] args) { File f =

  • Java中FilterInputStream和FilterOutputStream的用法详解

    FilterInputStream FilterInputStream 的作用是用来"封装其它的输入流,并为它们提供额外的功能".它的常用的子类有BufferedInputStream和DataInputStream. BufferedInputStream的作用就是为"输入流提供缓冲功能,以及mark()和reset()功能". DataInputStream 是用来装饰其它输入流,它"允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类

  • Java输入输出流的使用详细介绍

    1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.Java的I/O流提供了读写数据的标准方法.任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法. Java.io是大多数面向数据流的输入/输出类的主要软件包.此外,Java也对块传输提供支持,在核心库 java.nio中采用的便是块IO. 流IO的好处是简单易用,缺点是效率较低.块IO效率很高,但编程比较

  • java中的Io(input与output)操作总结(二)

    文件的操作 这一节我们来讨论关于文件自身的操作 不浪费唾沫了,用代码说话-- 实例1:创建文件对象 复制代码 代码如下: import java.io.File; public class Demo { public static void main(String[] args) { //创建要操作的文件路径和名称 //其中,File.separator表示系统相关的分隔符,Linux下为:/ Windows下为:\\ //path在此程序里面代表父目录,不包含子文件 String path =

  • Java中的BufferedInputStream与BufferedOutputStream使用示例

    BufferedInputStream  BufferedInputStream 是缓冲输入流.它继承于FilterInputStream. BufferedInputStream 的作用是为另一个输入流添加一些功能,例如,提供"缓冲功能"以及支持"mark()标记"和"reset()重置方法". BufferedInputStream 本质上是通过一个内部缓冲区数组实现的.例如,在新建某输入流对应的BufferedInputStream后,当我

  • java实现文本框和文本区的输入输出

    在GUI中,常用文本框和文本区实现数据的输入和输出.如果采用文本区输入,通常另设一个数据输入完成按钮.当数据输入结束时,点击这个按钮.事件处理程序利用getText()方法从文本区中读取字符串信息.对于采用文本框作为输入的情况,最后输入的回车符可以激发输入完成事件,通常不用另设按钮.事件处理程序可以利用单词分析器分析出一个个数,再利用字符串转换数值方法,获得输入的数值.对于输出,程序先将数值转换成字符串,然后通过setText()方法将数据输出到文本框或文本区. [例 11-9]小应用程序设置一

  • java中的Io(input与output)操作总结(三)

    说实话,其实我并不是很喜欢Java这门语言,尽管它很强大,有很多现成的API可以调用 但我总感觉它把简单的事情弄得太过复杂,甚至有时候会让人迷失 弄不清到底是为了写出东西,还是为了语言本身 我学习的第一门编程语言是Python,虽然学的不深 但是它的简单优雅至今令人难忘(呃,其实也就两年前的事--) 我接触的第二门语言是C,它给我的感觉是一种纯粹,一种高效的灵活 而不是类似java,写一堆含糊的代码来实现一个小小的功能 坦白讲,如果一个人在学习自己不感兴趣的东西,那会很累 支撑我的是,我对移动开

  • 详解Java的文件与目录管理以及输入输出相关操作

    Java中文件与目录管理 目录是管理文件的特殊机制,同类文件保存在同一个目录下不仅可以简化文件管理,而且还可以提高工作效率.Java 语言在 java.io 包中定义了一个 File 类专门用来管理磁盘文件和目录. 每个 File 类对象表示一个磁盘文件或目录,其对象属性中包含了文件或目录的相关信息.通过调用 File 类提供的各种方法,能够创建.删除.重名名文件.判断文件的读写权限以及是否存在,设置和查询文件的最近修改时间等.不同操作系统具有不同的文件系统组织方式,通过使用 File 类对象,

  • 详解Java中ByteArray字节数组的输入输出流的用法

    ByteArrayInputStream 介绍 ByteArrayInputStream 是字节数组输入流.它继承于InputStream. 它包含一个内部缓冲区,该缓冲区包含从流中读取的字节:通俗点说,它的内部缓冲区就是一个字节数组,而ByteArrayInputStream本质就是通过字节数组来实现的. 我们都知道,InputStream通过read()向外提供接口,供它们来读取字节数据:而ByteArrayInputStream 的内部额外的定义了一个计数器,它被用来跟踪 read() 方

随机推荐