一.IO流概述

1.定义:Java的IO流是实现输入输出的基础,它可以方便地实现数据的输入/输出操作。

2.流的分类:

(1)按流向来分:输入流和输出流

(2)按操作的数据来分:字节流和字符流

(3)按流的角色来分:节点流和处理流

二.IO流类图

常用流分类:

通常来说,字节流的功能比字符流强大,因为计算机里所有的数据都是二进制的,而字节流可以处理所有的二进制文件,但如果使用字节流来处理文本文件,则需要将字节转换为字符,这增加了编程复杂度。所以有这样一个规则:如果操作的内容是文本,则考虑使用字符流,如果操作的内容是二进制内容,则应考虑使用字节流。

三.常用流介绍

1.转换流:输入/输出流体系中还提供了两个转换流,这两个转换流用于实现将字节流转换成字符流。

InputStreamReader将字节输入流转换成字符输入流,OutputStreamWriter将字节输出流转换成字符输出流。

 public class InputStreamReaderDemo {
public static void main(String[] args) {
// 将标准字节输入流转换为字符流
InputStreamReader reader = new InputStreamReader(System.in);
// 将字符流进一步包装成缓冲流
BufferedReader buffer = new BufferedReader(reader);
String line = null;
try {
// System.out.println("请输入:");
while ((line = buffer.readLine()) != null) { if ("exit".equals(line)) {
System.exit(1);// 读取到exit,程序退出
}
System.out.println("输出内容:" + line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

2.缓冲流

BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedeWriter

使用缓冲流的好处:能够高效的读写信息,原理是先将数据缓存起来,然后再一起写入或者读取出来。

3.打印流

PrintStream,PrintWriter

  使用打印流的好处:可以很方便的进行输出

 public class PrintDemo {

     public static void main(String[] args) {
printToFile();
System.out.println("success");
} public static void printToFile(){
try {
OutputStream output = new FileOutputStream("D:\\code\\999.txt");
PrintWriter pw = new PrintWriter(new BufferedOutputStream(output));
pw.println("我是一只小小小鸟");
pw.println(true);
pw.println(999);
pw.println(1.114);
pw.flush();
pw.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} }
}

 4.对象流:序列化和反序列化对象

  (1)什么是对象序列化

    对象序列化的目标是将对象保存到磁盘中,或在网络中传输对象。

    对象序列化机制允许把内存中的对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点,其他程序一旦获得这个二进制流,就可以将这种二进制流恢复成原来的java对象。

  (2)如何让类是可序列化的

    实现Serializable接口,该接口是一个标记接口,接口内无任何需要实现的方法。

  (3)对象的序列化和反序列化

    对象序列化(Serialize)是指将一个java对象写入IO流中,对象的反序列化(Deserialize)是指从IO流中恢复该java对象

  (4)怎么使用对象流实现序列化

    两个类:ObjectOutputStream,ObjectInputStream 对象流是处理流,需要建立在节点流的基础之上。

    两个方法:writeObject(), readObject()

    如果不想序列化某个成员变量,可以在声明中加入关键字 transient, 例如private transient int age;

    使用方法见下面代码:(Dog类省略)

    

 package com.gdp.xuliehua;

 import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream; public class TestDog {
public static void main(String[] args) {
//writeObject();
//readObject();
//writeObject2();
readObject2();
}
/**
* 将对象写入到文件中
*/
public static void writeObject(){
try {
OutputStream out = new FileOutputStream("D:\\dog.txt");
ObjectOutputStream oos = new ObjectOutputStream(out);
oos.writeInt(130);
Dog dog = new Dog("小黑",3);
oos.writeObject(dog);
oos.flush();
oos.close();
out.close();
System.out.println("OK");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }
/**
* 从文件中读取对象
*/
public static void readObject(){
try {
InputStream in = new FileInputStream("D:\\dog.txt");
ObjectInputStream ois = new ObjectInputStream(in);
int i = ois.readInt();
Dog dog = (Dog)ois.readObject();
ois.close();
in.close();
System.out.println(i);
System.out.println(dog);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} }
/**
* 序列化多个对象,采用对象数组来实现将对象写入文件中
*/
public static void writeObject2(){
Dog dog1 = new Dog("小黑",5);
Dog dog2 = new Dog("小白",3);
Dog dog3 = new Dog("小红",6);
try {
OutputStream out = new FileOutputStream("D:\\obj.tmp");
ObjectOutputStream oos = new ObjectOutputStream(out);
Dog[] dogs = new Dog[]{dog1,dog2,dog3};
oos.writeObject(dogs);
oos.flush();oos.close();out.close();
System.out.println("ok");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }
/**
* 将多个对象从文件中读取出来
* 1.读取出来的对象是对象数组
* 2.遍历数组,取出对象
*/
public static void readObject2(){
try {
InputStream in= new FileInputStream("D:\\obj.tmp");
ObjectInputStream ois = new ObjectInputStream(in);
Dog[] dogs = (Dog[])ois.readObject();
ois.close();in.close();
for (Dog dog : dogs) {
System.out.println(dog);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} }
}

 5.ByteArrayInputStream和ByteArrayOutputStream

  (1)ByteArrayInputStream包含一个内部缓冲区,该缓冲区包含从流中读取的字节。

    关闭ByteArrayInputStream无效,此类的方法在关闭流后仍可被调用,而不会产生任何IOException。

  (2)ByteArrayOutputStream,此类实现一个输出流,其中的数据被写入一个byte数组,缓冲区会随着数据的不断写入而自动增长,可以使用toByteArray()和toString()获取数据.

  关闭ByteArrayOutputStream无效,此类的方法在关闭流后仍可被调用,而不会产生任何IOException。

  (3)使用方法如下列代码:

 import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException; public class ByteArrayDemo {
public static void main(String[] args) {
write();
}
/**
* 写入数据,不与文件关联,写入内存
* 读取数据并显示
*/
public static void write(){
ByteArrayOutputStream bos = new ByteArrayOutputStream();
String info = "我是一只小小小小鸟!";
try {
bos.write(info.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
//读取数据
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
StringBuffer buf = new StringBuffer();
byte[] bytes = new byte[1024];
int temp ;
try {
while((temp=bis.read(bytes))!=-1){
buf.append(new String(bytes, 0, temp));
}
System.out.println(buf.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}

6.过滤器数据流:DataInputStream和DataOutputStream

  (1)DataInputStream和DataOutputStream专门用于读写基本数据类型数据,而对象流既可以读写基本数据类型的数据也可以读写对象。

  (2)它是一个处理流,需要建立在节点流的基础之上,如new DataInputStream(new FileInputStream("text.txt"))

  (3)DataInputStream和DataOutputStream有读写的相关方法一一对应,基本使用方法见下面代码:

 import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; public class DataStreamDemo {
public static void main(String[] args) {
// write();
read();
} /**
* 向文件写入数据
*/
public static void write() {
try {
OutputStream out = new FileOutputStream("D:\\test.txt");
DataOutputStream dos = new DataOutputStream(out);
dos.writeInt(100);// 写入int数值
dos.writeDouble(99.99);// 写入double数值
dos.writeBoolean(true);// 写入boolean值
dos.writeUTF("我是一只小小小小鸟");
dos.flush();
dos.close();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } /**
* 从文件读取数据
*/
public static void read() {
try {
InputStream in = new FileInputStream("D:\\test.txt");
DataInputStream dis = new DataInputStream(in);
System.out.println(dis.readInt());
System.out.println(dis.readDouble());
System.out.println(dis.readBoolean());
System.out.println(dis.readUTF());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }
}

IO流(二)I/O的更多相关文章

  1. Java学习之路(十二):IO流<二>

    字符流 字符流是可以直接读写字符的IO流 使用字符流从文件中读取字符的时候,需要先读取到字节数据,让后在转换为字符 使用字符流向文件中写入字符时,需要把字符转为字节在写入文件 Reader和Write ...

  2. Java基础IO流(二)字节流小案例

    JAVA基础IO流(一)https://www.cnblogs.com/deepSleeping/p/9693601.html ①读取指定文件内容,按照16进制输出到控制台 其中,Integer.to ...

  3. IO流二

    1 数据流(了解) 1.1 概述 为了方便的操作java语言的基本数据类型和String类型的数据,可以使用数据流. 数据流的分类: DataInputStream DataOutputStream ...

  4. Java IO流(二)

    目录 字节缓冲流 概述 BufferedOutputStream类 继承父类的共性成员方法 构造方法 BufferedInputStream类 继承自父类的方法: 构造方法 文件复制练习(增强版 使用 ...

  5. IO流(二)

    一:字符流 字符输入流 写入文件字符流 import java.io.FileWriter; import java.io.IOException; //fileWriter public class ...

  6. IO流(二)__BufferedReader和BufferedWriter

    BufferedReader和BufferedWriter 字符流的缓冲区:缓冲区的而出现提高了对数据的读写效率对应类:BufferedWriter  BufferedReader缓冲区要结合流才可以 ...

  7. JavaSE(十二)之IO流的字节流(一)

    前面我们学习的了多线程,今天开始要学习IO流了,java中IO流的知识非常重要.但是其实并不难,因为他们都有固定的套路. 一.流的概念     流是个抽象的概念,是对输入输出设备的抽象,Java程序中 ...

  8. IO流(二)

    二.File类 概述 文件和目录路径名的抽象表示形式 构造方法 public File(String pathname) public File(String parent,String child) ...

  9. Java第三阶段学习(二、IO流--------递归,字节流Stream)

    一.递归 定义:指方法在方法内调用自己 适用于方法的运算主体不变,但运行的时候,参与运算的方法参数会变化注意:一定要给递归一个出口,否则内存溢出 练习题1:使用递归打印文件夹中所有的文件,包含子目录中 ...

  10. Java中的IO流(二)

    上一篇<Java中的IO流(一)>把学习IO流的字符流作了一下记录,本篇把字节流记录一下. 一,Java中的字节流 Java中的字节流的操作方式与字符流的操作方式大致相同,连方法名都是类似 ...

随机推荐

  1. Maven入门指南(一)—— Maven下载与安装

    Maven下载与安装 1.下载1)Maven的系统要求: Maven对内存和操作系统没有要求 Maven安装本身仅需大约10MB,本地仓库视使用情况有所不同 Maven3.3及以上版本需要JDK1.7 ...

  2. Linux : 使用 lsof 恢复文件

    用 lsof 命令在某种程度上可以恢复删除的文件, 前提是这个文件被正在运行的进程占用. 比如: 日志文件, 配置文件. lsof 恢复文件 查找需要恢复的文件和占用文件的进程 PID lsof |g ...

  3. [ CodeVS冲杯之路 ] P1098

     不充钱,你怎么AC? 题目:http://codevs.cn/problem/1098/ 显然就是使每堆牌达到总体的平均数,尽量使每次移动时的牌数最大,这就类似于飞行棋,将几个棋子叠起来一起走是最优 ...

  4. It运维项目整理

    String.prototype.toWeek=function(){ var date = new Date(this); var week = ""; switch (date ...

  5. Use NSArray to specify otherButtonTitles?

    http://stackoverflow.com/questions/1602214/use-nsarray-to-specify-otherbuttontitles UIAlertSheet's c ...

  6. 理解python的super

    def super(cls, inst): mro = inst.__class__.mro() return mro[mro.index(cls) + 1] super做了这些事 摘自:https: ...

  7. zabbix 批量添加聚合图形

    环境为centos 脚本要在centos zabbix服务器上运行,zabbix server上运行 1.先把脚本部署到zabbix客户端,把脚本保存为nic.sh 存放路径确保zabbix可以访问 ...

  8. TCP/IP、Http、Socket 简单理解

    转自:http://blog.csdn.net/guyan0319 https://blog.csdn.net/guyan0319/article/details/79404216 一. 什么是TCP ...

  9. AC日记——Count on a tree II spoj

    Count on a tree II 思路: 树上莫队: 先分块,然后,就好办了: 来,上代码: #include <cmath> #include <cstdio> #inc ...

  10. MSSQL—字符串分离(Split函数)

    前面提到了记录合并,有了合并需求肯定也会有分离需求,说到字符串分离,大家肯定会想到SPLIT函数,这个在.NET,Java和JS中都有函数,很可惜在SQL SERVER中没有,我们只能自己来写这么一个 ...