第十四章、I/0输入输出

1、数据流的基本概念

(1)流的分类

①流从流动方向上看:一般分为输入流和输出流

• 输入流:如System.in是一个InputStream类型输入流

• 输出流:如System.out 是一个PrintStream类型输出流

②从读取类型上分:一般分为字节流和字符流

• 字节流:如System.in是一个InputStream类型字节流

• 字符流:如new InputStreamReader(System.in)是一个字符流对象

③流从发生的源头:分为节点流和过滤流类

• 节点流:直接操作目标设备对应的流,如文件流,标准输入输出流

• 过滤流:继承带有关键字Filter的流,用于包装操作节点流,方便读写各种类型的数据

(2)Java的标准输入输出流

标准输入,对象是键盘,Java对应类是System.in。

标准输出,对象是屏幕,Java对应类是System.out。

标准错误输出,对象也是屏幕,Java对应类是System.err。

标准输入输出的转向,见JDK中的System类的静态方法 。

从键盘输入字符,并对小写字母字符数目进行统计

2、字节流与字符流

(1)字节流

InputStream方法
InputStream方法

(2)字节流

OutputStream方法

(3)ByteArrayInputStream 和 ByteArrayOutputStream

将字节数组作为字节流的数据源
构造一个字节数组输出流,用于将多个字节写入到流中,最后可以整体转为一个字节数组


3、文件操作  

 
(1)FileInputStream 和 FileOutputStream

FileInputStream构造方法:FileInputStream(String name) :以文件路径名字构造一个文件输入流,打开一个与实际文件的连接,用于从该流中读取文件字节流

FileOutputStream构造方法: FileOutputStream(String name) :以文件路径名字构造一个文件输出流,打开一个与实际文件的连接,用于文件的写字节流操作

读取文件
写入文件

(2) PipedInputStream和PipedOutputStream

通常用于将一个程序的输出连接到另一个程序的输入。

输出流作为管道的发送端,输入流作为管道的接收端。

使用前需要调用connect方法将输出流和输入流连接起来。

通常一个线程执行管道输出流的写操作,另一个线程执行管道输入流的读操作。

(3)字节流与字符流之间的转化

输入字节流转为字符流需要用到inputstreamReader的构造方法:InputStreamReader(InputStream in)

例如:InputStreamReader ins = new InputStreamReader(System.in);

           InputStreamReaderins = newInputStreamReader(new FileInputStream(“test.txt”));

输出字符流转为字节流用到OutputStreamWriter或PrintWriter的构造方法: OutputStreamWriter(OutputStream out) 或 PrintWritr(OutputStream out)

例如:OutputStreamWriterouts = newOutputStreamWriter(new FileOutputStream(“test.txt”));

4、流的装配与串行化

(1)流的装配

过滤流:   BufferedInputStream和BufferedOutputStream, 缓存作用,用于装配文件磁盘、网络设备、终端等读写开销大的节点流,提高读写性能
过滤流BufferedReader的使用:用于缓存字符流,可以一行一行的读
过滤流:   DataInputStream和DataOutputStream, 可从字节流中写入、读取Java基本数据类型,不依赖于机器的具体数据类型,方便存储和恢复数据
PrintWriter的使用:可以向该字符流中写入Java基本数据类型,用于包装输出字符流类对象

PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.txt")));

等价于 PrintWriter out = new PrintWriter(“foo.txt”); //JDK1.5引入,简化编码,//仍然具有缓存功能

局限性:没有对应的输入流类用于恢复写入的Java基本类型数据

将字符串用流装配的方式输出到屏幕上

(2)流的串行化


串行化(Serialization):又称序列化,将实现了Seriallizable接口的对象转换成一个字节序列,并能够在以后将这个字节序列完全恢复为原来的对象,后者又称反序列化

串行化的目的:便于介质存储和网络传输

使用ObjectInputStream类和ObjectOutputStream类

对象序列化示例
对象序列化示例(接上)

(3)文件操作

文件操作相关类或接口
File类相关方法

例:将Write1.txt文件拷贝到当前目录的backup文件夹下:

文件复制
获取文件信息

(4)File类:public String[] list(FilenameFilter filter) 返回一个满足过滤器filter的文件列表

文件过滤器接口FilenameFilter,其包含一个抽象方法accept

例:列出当前目录中带过滤器的文件名清单,如:过滤出开头为w或W的文本文件

实现FilenameFilter接口的抽象方法accept, 在curdir.list(filter)方法内部调用

(5)随机文件操作

RandomAccessFile:文件指针可以随意定位,可以向前访问

构造方法:RandomAccessFile(File file, String mode)

                  RandomAccessFile(String name, String mode)

例:随机文件操作:对二进制文件primes.bin进行随机访问操作,先将2作为最小素数写入文件,再依次测试100以内的奇数,如果为素数,则写入文件尾

随机文件操作- 判断素数方法
随机文件操作- 输出素数方法

你可能感兴趣的:(第十四章、I/0输入输出)