Java流的原理
一般在Java对数据的输出和输入是通过流(stream)来进行操作。
J2SDK提供了各种各样的“流”类,用以获取不同种类的数据:程序中通过标准的方法输入或输出数据
🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲分割线🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲
流的分类
通过流的在不同的角度可以把流分为很几种类型。
按数据流的方向不同可以分为输入流和输出流
按照处理数据单位不同可以分为字节流和字符流
按照功能不同可以分为节点流和处理流
什么是输入流和输出流?
用一个通道一端链接文件,一端连接程序,读取文件的话,则认为这通道是输出流还是输入流呢?
站在文件的角度是输出流。
站在程序的角度是输入流。
J2SDK所提供的所有流类型位于包 Java.io内,都分别继承自以下四种抽象流类型。
输入流:InputStream (字节流),Reader (字符流)
输出流: OutPutStream (字节流), Writer (字符流)
这四个类都是抽象类,可以把这四个类想象成四根不同的管道。一端接着你的程序,另一端接着数据
源,你可以通过输出管道从数据源里面往外读数据,也可以通过输入管道往数据源里面输入数据,总
之,通过这四根管道可以让数据流进来和流出去。
字节流和字符流
按照内存我们能知道字节流是8(bit),字符流是16(bit)。
字节流就是通过一个字节一个字节的读取,字符流则是通过字符读取。一般情况下,一个字符是两个字节。
补充:
1.对于文本文件(.txt,.c,.java,.cpp),使用字符串处理。
2.对于非文本文件(.jpg,.mp3,.mp4,.avi,.doc,.ppt),使用字节流处理。
节点流和处理流
概念:
节点流:节点流可以是从一个特定的数据源读取写入数据。
处理流:处理流是链接在已经存在的节点流或者处理流之上,通过对数据的处理为程序提供更强大的读写功能!
节点流:
处理流:
注:一般处理流比节点流的效率快,但是并不是处理流越多越好。
节点流类型
类型 字符流 字节流
File(文件)
Memory,Array CharArrayReader、CharArrayWriter ByteArrayInputStream、ByteArrayOutputStream
Memory,String StringReader、StringWriter --------
Pipe(管道) PipedReader、PipedWriter PipedInputStream、PipedOutputStream
节点流就是一根管道直接插到数据源上面,直接读数据源里面的数据,或者是直接往数据源里面写入数据。典型的节点流是文件流:文件的字节输入流(FileInputStream),文件的字节输出流(FileOutputStream),文件的字符输入流(FileReader),文件的字符输出流(FileWriter)。
处理流类型
处理类型 字符流 字节流
Buffffering BufffferedReader、BufffferedWriter BufffferedInputStream、BufffferedOutputStream
Filtering FilterReader、FilterWriter FilterInputStream,FilterOutputStream
Converting between,bytes and chaacter InputStreamReader、OutputStreamWriter ----------
Object Serialization -------- ObjectInputStream、ObjectOutputStream
Data conversion ---------- DataInputStream、DataOutputStream
Counting LineNumberReader LineNumberInputStream
Peeking ahead PusbackReader PushbackInputStream
Printing PrintWriter PrintStream
处理流是包在别的流上面的流,相当于是包到别的管道上面的管道。
🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲分割线🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲
InputStream
InputStream的基本使用
通过对源码的分析我们能知道inputStream的一些功能函数的作用和使用方法。
1.
int read() throws IOException
读取一个字节并以整数的形式返回(0~255),如果返回-1就说明已经到了输入流的末尾。
2.
int read(byte[] buffer) throws IOException
读取一系列字节并存储到一个数组buffer ,返回实际读取的字节数,如果读取前已到输入流的末尾,则返回-1。
3.
int read(byte[] buffer,int offset,int length) throws IOException
读取length个字节
并存储到一个字节数组buffer,从length位置开始
返回实际读取的字节数,如果读取前以到输入流的末尾返回-1.
4.
void close() throws IOException
关闭流释放内存资源 .
5.
long skip(long n) throws IOException
跳过n个字节不读,返回实际跳过的字节数
方法1和方法2的区别
方法1中的read()就是表示一个个字节的读取,而方法2中的read(buffer)则是先把一定长度的字节放在buffer的数组里面然后在读取。这就好比用不同大小的桶来进行取水。
案例
【演示:使用 FileInputStream 流来读取 FileInputStream.java 文件的内容】
import java.io.IOException; public class zj_bit { public static void main(String[] args) throws IOException { FileInputStream fileInputStream = null; try { String pathName ="E:\\IO-stream\\src\\ceshi.TXT"; File file = new File(pathName); fileInputStream = new FileInputStream(file); byte[] buffer = new byte[100]; int len ; while ( (len = fileInputStream.read(buffer)) != -1 ){ String print = new String(buffer,0,len); System.out.println(print); } } finally { fileInputStream.close(); } } }
结果:
hello铁甲小宝//输出出来的文本内容。