一.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. hdu 4388 Stone Game II sg函数 博弈

    Stone Game II comes. It needs two players to play this game. There are some piles of stones on the d ...

  2. Windows转移FSMO角色

    转移 FSMO 角色若要使用 Ntdsutil 实用工具转移 FSMO 角色,请按照下列步骤操作:1.登录到基于 Windows 2000 Server 或基于 Windows Server 2003 ...

  3. "todoList妙味"学习总结

    1.v-bind  主要用于属性绑定 :class="{completed: item.isChecked}",它会将{}里面的内容解析为js表达式   2.vue提供了一组方法, ...

  4. apache快速配置简易网站

    网站源文件目录 F:\01.prj\site\static_html F:\01.prj\site\static_html 打开apache_http.conf 1 .修改网站目录 错误1 Alias ...

  5. python 拼图验证码

    基于python2.7 django 1.10 用谷歌浏览器验证测试没问题,写的很烂,纯属学习 项目地址 https://github.com/cainiaoit/-Jigsaw-verifying- ...

  6. 【原创】SSIS-执行包任务调用子包且子包读取父包变量

    背景: 有时候需要将一个个开发好的独立的ETL包串接起来形成一个独立而庞大的包,如:每家分公司都开发不同的ETL包,最后使用执行包任务来将这些分公司的包给串联起来形成一个独立而完整运行的ETL包,此时 ...

  7. PSR-2 编码风格规范

    本篇规范是 PSR-1 基本代码规范的继承与扩展. 本规范希望通过制定一系列规范化PHP代码的规则,以减少在浏览不同作者的代码时,因代码风格的不同而造成不便. 当多名程序员在多个项目中合作时,就需要一 ...

  8. phpstudy无法访问主页,提示You don't have permission to access / on this server解决办法

    1.输入localhost提示:You don't have permission to access / on this server. 新版phpStudy为了安全,取消Apache和nginx列 ...

  9. 我在16aspx网上下载了个C#源码,如何能在我自己的计算机上跑起来,很急!求详细操作过程!

    先搞清楚是WINDOWS程序还是WEB程序.

  10. Python的功能模块[2] -> abc -> 利用 abc 建立抽象基类

    abc模块 / abc Module 在定义抽象方法时,为了在初始化阶段就检测是否对抽象方法进行了重定义,Python 提供了 abc 模块. from abc import ABCMeta, abs ...