一起学JAVA——数据流
在我们的现实世界里,任何事物的移动都会行程“流”。如:水流、车流、人流、泥石流等。同样道理,程序中的数据从一个地方移动到另一个地方也会行程“流”,那就是数据流。如:上传文件时,文件数据要流动到网络上;下载文件时数据要从网络流动到本地;播放视频时,数据要从硬盘上流量到内存等等。
在java中数据流也是有一组类来表示的,今天的主要内容就是流对象的用法。
什么是流
流是一个抽象的概念。 和电流、水流一样,只不过这里是数据流。当Java程序需要从数据源读取数据时,会开启一个到数据源的流。数据源可以是文件,内存或者网络等。同样,当程序需要输出数据到目的地时也一样会开启一个流,数据目的地也可以是文件、内存或者网络等。流的创建是为了更方便地处理数据的输入输出。
流的分类
按流动方向分为:输入流和输出流
按最小单位分为:字节流和字符流
按功能分为:文件流、缓冲流、内存流、网络流、数据流、对象流等。
字节流处理概述
对于字节流处理的类都继承自InputStream和OutputStream这两个抽象类。
InputStream提供的最重要的方法是:
OutputStream提供的最重要的方法是:
字节输入流:
先谈谈输入流,输入流中跟数据源直接接触的类有:FileInputStream和ByteArrayInputStream,他们分别实现了从文件或者内存中的字节数组读入数据到输入流。
其他的输入流处理类都是装饰类(Decorator模式),如:
BufferedInputStream: 提供了缓冲功能。
DataInputStream: 允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。
字节输出流:
基本上每个输入流类都有一个相应的输出流类,提供相应的输出流处理。
同样,跟数据目的地直接接触的类有:FileOutputStream和ByteArrayOutputStream,前者实现了把数据流写入文件的功能,后者实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray()和 toString() 获取数据。
其它的装饰类,如下:
BufferedOutputStream: 提供了缓冲功能的输出流,在写出完成之前要调用flush来保证数据的输出。
DataOutputStream: 数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。
字符流处理概述
所有的字符流操作类都继承自Reader或者Writer这两个抽象类。
Reader提供的重要方法有:
Writer提供的重要方法有:
字符输入流:
跟数据源直接接触的类:
CharArrayReader: 从内存中的字符数组中读入数据,以对数据进行流式读取。
StringReader:从内存中的字符串读入数据,以对数据进行流式读取。
FileReader:从文件中读入数据。注意这里读入数据时会根据JVM的默认编码对数据进行内转换,而不能指定使用的编码。所以当文件使用的编码不是JVM默认编码时,不要使用这种方式。
其他字符输入装饰类:
BufferedReader:提供缓冲功能,可以读取行:readLine();
LineNumberReader: 提供读取行的控制:getLineNumber()等方法。
InputStreamReader: 字节流通向字符流的桥梁:它使用指定的 charset
读取字节并将其解码为字符。
字符输出流:
根数据目的相关的类:
CharArrayWriter:把内存中的字符数组写入输出流,输出流的缓冲区会自动增加大小。输出流的数据可以通过一些方法重新获取。
StringWriter: 一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串。
FileWriter:把数据写入文件。
其他字符输出装饰类:
BufferedWriter:提供缓冲功能。
OutputStreamWriter:字符流通向字节流的桥梁:可使用指定的 charset
将要写入流中的字符编码成字节。
PrintWriter: 向文本输出流打印对象的格式化表示形式。
flush:Writer或者OutputStream中的flush(): 刷新该流的缓冲,用于确保数据的输出。
close(): 关闭流并释放与之关联的所有系统资源。
注意:字符最终也是已字节的形式存储在计算机里的,所以字符流只能读取字符文件(文本文件),但字节流既能读字符文件也能读字节文件(二进制文件)。
流基本应用小结
流是用来处理数据的。 处理数据时,一定要先明确数据源,或者数据目的地 数据源可以是文件,可以是键盘或者其他设备。 数据目的地可以是文件、显示器或者其他设备。 而流只是在帮助数据进行传输,并对传输的数据进行处理,比如过滤处理、转换处理等。
精品推荐:
一起学JAVA——常用类
一起学JAVA——异常处理
一起学JAVA——面对对象(其他)
编程技术笔记——Nginx反向代理和负载均衡