Java中的输入是指从数据源等读到Java程序中,这里的数据源可以是文件,内存或网络连接,输出则是指从Java程序中写到目的地。

输入输出流可以分为以下几种类型(暂时不考虑File类)

类名 中文名
InputStream 字节输入流
OutputStream 字节输出流
Reader 字符输入流
Writer 字符输出流

Java IO共涉及40多个类,下图是字节流各个类之间的关系

InputStream

InputStream的子类及其说明有如下所示

名称 说明
BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。
ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。
DataInputStream 数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。
FileInputStream 从文件系统中的某个文件中获得输入字节。
FilterInputStream 包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。
ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。
PipedInputStream 管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。
PushbackInputStream 为另一个输入流添加性能,即“推回 (push back)”或“取消读取 (unread)”一个字节的能力。
SequenceInputStream 表示其他输入流的逻辑串联。

OutputStream

OutputStream的子类及其说明有如下所示

名称 说明
BufferedOutputStream 该类实现缓冲的输出流。
ByteArrayOutputStream 此类实现了一个输出流,其中的数据被写入一个 byte 数组。
DataOutputStream 数据输出流允许应用程序以与机器无关方式将基本 Java 数据类型写入输出流中。
FileOutputStream 文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。
FilterOutputStream 此类是过滤输出流的所有类的超类。
ObjectOutputStream ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。
PipedOutputStream 可以将管道输出流连接到管道输入流来创建通信管道。
PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。

对于类中方法的熟悉不详述了,可以参照JDK文档,或者可以试着在IDE中,实例化上面的类,使用此类对象时,按下.之后,会出现提示框,再一个一个熟悉就好了。

简单示例

了解了常用的字节流类,下面以文件数据的输入输出说明以上类的使用。

1.在java程序中生成1~20的平方数,并输出到文件中。


package com.songpu; import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream; public class MyFileOutputStream { public static void main (String[] args) throws IOException{
try{
FileOutputStream fos = new FileOutputStream("F:\\test1.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos,1024);
PrintStream ps = new PrintStream(bos,false);
System.setOut(ps);
for(int i= 0;i<20;i++){
System.out.println(i*i);
}
ps.close();
bos.close();
fos.close();
}catch(IOException e){
e.printStackTrace();
}
} }

2.将刚才生成的文件中的数据输入到程序,并将其打印到屏幕

package com.songpu;

import java.io.*;

public class MyFlieInputStream {

	public static void main(String[] args) throws IOException {
File file = new File("F:\\test1.txt");
FileInputStream in = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(in);
byte[] bytes = new byte[(int) file.length()]; do {
bis.read(bytes);
System.out.println(new String(bytes)); }while (bis.read() != -1);
bis.close();
in.close(); }
}

再以序列化与反序列化的例子说明ObjectInputStream和ObjectOutputStream的使用

Java序列化是将对象变成二进制形式的一连串字符描述的过程,反序列化就是序列化的相反过程,把这些字符重建为对象。

序列化和反序列化的作用,是保存对象到文件或数据库中,使对象能够传输,序列化的要求是实现Serializable接口,代码如下所示

package com.songpu.serial;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
/*
* 待序列化的类,实现序列化接口
*/
class Person implements Serializable{
public String name;
public int age;
public Person(String name, int age) {
//super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
} /*
* 测试类
*/
public class SerialTest{ public static void main(String[] args) throws IOException, ClassNotFoundException{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("F:\\test.txt"));
Person p0 = new Person("tangsong",21);
oos.writeObject(p0);
oos.flush();
oos.close();
deserial();
} public static void deserial() throws ClassNotFoundException, IOException{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("F:\\test.txt"));
Person p1 = (Person)ois.readObject();
ois.close();
System.out.println("Name="+p1.getName()+";Age="+p1.getAge());
}
}

运行上述代码的结果如下:

Java IO之字节流的更多相关文章

  1. Java IO: 其他字节流(上)

    作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中的PushbackInputStream,SequenceInputS ...

  2. [Java IO]02_字节流

    概要 字节流有两个核心抽象类:InputStream 和 OutputStream.所有的字节流类都继承自这两个抽象类. InputStream 负责输入,OutputStream 负责输出. 字节流 ...

  3. java IO之字节流和字符流-Reader和Writer以及实现文件复制拷贝

    接上一篇的字节流,以下主要介绍字符流.字符流和字节流的差别以及文件复制拷贝.在程序中一个字符等于两个字节.而一个汉字占俩个字节(一般有限面试会问:一个char是否能存下一个汉字,答案当然是能了,一个c ...

  4. Java IO流-字节流

    2017-11-05 17:48:17 Java中的IO流按数据类型分类分为两种,一是字节流,二是字符流.字符流的出现是为了简化文本数据的读入和写出操作. 如果操作的文件是文本文件,那么使用字符流会大 ...

  5. Java—IO流 字节流

    IO流(输入流.输出流),又分为字节流.字符流. 流是磁盘或其它外围设备中存储的数据的源点或终点. 输入流:程序从输入流读取数据源.数据源包括外界(键盘.文件.网络…),即是将数据源读入到程序的通信通 ...

  6. java——io、字节流缓冲区拷贝文件、字节缓冲流

    使用try catch finally关闭文件流: 写入文件: import java.io.*; public class exp{ public static void main(String[] ...

  7. java IO流——字节流

    字节流主要操作byte类型数据,以byte数组为准,主要操作类有InputStream(字节输入流).OutputSteam(字节输出流)由于IputStream和OutputStream都是抽象类, ...

  8. java IO的字节流和字符流及其区别

    1. 字节流和字符流的概念    1.1 字节流继承于InputStream    OutputStream,    1.2 字符流继承于InputStreamReader    OutputStre ...

  9. Java IO(三)--字节流基本使用

    I/O流分类: InputStream和Read的子类都有read(),用来读取单个字节或字节数组 OutputStream和write的子类都有write(),用来写入单个字节或字节数组 一般都是通 ...

随机推荐

  1. 同步博客到CSDN

    经过一些朋友的多次邀请,现同步博客到CSDN,地址:http://blog.csdn.net/knightswarrior.

  2. 策划编写一个新的Helper类

    https://code.csdn.net/jy02305022/blqw-data 有朋友看见的话给点意见呗

  3. EF:打开Oracle连接时报错

    基础提供程序在 Open 上失败. The underlying provider failed on Open. 解决:安装最新的ODTwithODAC121024.

  4. 固定Table的头部和左边的列-在Knockout Js使用场景下

    要求:固定Table的头部和左边的列 场景:Knockout Js被用于绑定Table的数据源. 固定HTML表格的头部和列是一个很常见的需求.此文:http://www.cnblogs.com/so ...

  5. jsp的 javascript中 嵌套 html 注释

    看到公司的代码,我也是蛋疼了,各种乱. 还发现有很多的jsp的 javascript中 嵌套 html 注释, 这个可行? 我之前可是没用过. 后面查找各种资料发现,这个也是可行的,主要是为了兼容不支 ...

  6. Java集合类的总结

    Java语言的java.until包中提供了一些集合类,这些集合类又被称为容器.说到集合就会想到数组,集合类与数组的不同之处是,数组的长度是固定的,集合的长度是可变的:数组用来存放基本数据类型,集合从 ...

  7. WebDriver--简单的元素操作

    以登录163邮箱为例,演示以下几个方法的使用 ①switch_to.frame() ②.clear() ③.send_keys() ④.click() ⑤switch_to_default_conte ...

  8. iOS开发-应用崩溃日志揭秘(一)

    作为一名应用开发者,你是否有过如下经历? 为确保你的应用正确无误,在将其提交到应用商店之前,你必定进行了大量的测试工作.它在你的设备上也运行得很好,但是,上了应用商店后,还是有用户抱怨会闪退 ! 如果 ...

  9. json、javaBean、xml互转的几种工具介绍

    json.javaBean.xml互转的几种工具介绍 转载至:http://blog.csdn.net/sdyy321/article/details/7024236 工作中经常要用到Json.Jav ...

  10. Java final 关键词修饰类、方法、变量

    1. final修饰类  被修饰的类不能被继承,也没有子类.假如随意创建这些类的子类,子类可能会错误的修改父类的实现细节.出于安全原因,类的实现细节不允许有任何改动.在创建对象模型的时候,确信这个类不 ...