流简介
流(Stream)是从起源(source)到接收(sink)的有序数据。
① 按照流向可分为输入流和输出流
输入流:只能从中读取数据,不能写入数据。
外部设备流向程序(内存):基类是InputStream和Reader。
输出流:只能向其中写入数据,不能读取数据。
程序(内存)流向外部设备:基类是OutputStream和Writer。
② 按照操作的数据单元分为字节流和字符流。
字节流:处理声音或者图片等二进制格式的数据流,操作的数据单元是8位的字节。
字符流:处理文本数据的流,操作的数据单元是16位的字符。
可用高低端流来区分,所有的低端流都是字节流,所有的高端流是字符流。
③ 按照流数据的包装过程可分为节点流(低级流)和处理流(高级流)。
节点流:可以从/向一个特定的IO设备中读写数据的流,也称低级流、原始流。
处理流:用于对一个已存在的流进行连接或封装来实现读/写功能的流,也称高级流、包装流。
文件字节流
文件字节输入流:
①FileInputStream(File file)
②FileInputStream(String fileName)
序号 | 方法及描述 |
---|---|
1 | public void close() 关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。 |
2 | protected void finalize() 这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常。 |
3 | public int read(int r) 这个方法从 InputStream 对象读取指定字节的数据。返回为整数值。返回下一字节数据,如果已经到结尾则返回-1。 |
4 | public int read(byte[] r) 这个方法从输入流读取r.length长度的字节。返回读取的字节数。如果是文件结尾则返回-1。 |
5 |
public int read(byte[] r,int off,int len) 这个方法从输入流中将最多len个字节的数据,从偏移量off开始的字节读入一个数组。 |
6 |
public int available() |
文件字节输出流:
①FileOutputStream(File file)
②FileOutputStream(String fileName)
③FileOutputStream(File file,boolean append)
注意:
指定的文件中已经有内容,那么当使用FOS对其写入数据时,会将原有的数据覆盖替换。
第二个布尔型参数:true——追加写入 false——覆盖写入
序号 | 方法及描述 |
---|---|
1 | public void close() 关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。 |
2 | protected void finalize() 这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常。 |
3 | public void write(int w) 这个方法把指定的字节写到输出流中。 |
4 | public void write(byte[] w) 把指定数组中w.length长度的字节写到OutputStream中。 |
5 |
public void write(byte[] w,int off,int len) 将指定数组中的字节从偏移量off开始的len个字节写入此输出流。 |
文件字节流读写操作
FileOutputStream fos = new FileOutputStream("fos.txt",true); //默认当前程序目录下 fos.write(1); //写出1的二进制 byte[] data = "我爱北京天安门".getBytes("UTF-8"); //字符串内容转换为一组字节 fos.write(data); fos.close(); FileInputStream fis = new FileInputStream("fos.txt"); //方法一 byte[] data = new byte[20]; int len = fis.read(data); String str = new String(data,0,len,"UTF-8"); //字节转换为字符串 System.out.println(str); fis.close(); //方法二 int d; while((d=fis.read())!=-1){ System.out.print((char)d); }
转换流(字符流)
转换流的特点是以字符为单位读写数据。
由于底层读写还是字节,所以字符流只是简化了我们在字符串与字节之间的转换工作。
InputStreamReader字符输入流
使用该流可以设置字符集,并按照指定字符集从流中按照该编码将字节数据转换为字符并读取。
OutputStreamReader字符输出流
设置字符集,并按照指定的字符集将字符转换为对应字节后进行数据转换为字符并读取。
转换流的应用示例
FileOutputStream fos = new FileOutputStream("osw.txt"); OutputStreamWriter osw = new OutputStreamWriter(fos,"GBK"); //根据指定编码写出字符串,默认UTF-8 osw.write("好好学习"); osw.write("天天向上"); osw.close(); FileInputStream fis = new FileInputStream("osw.txt"); InputStreamReader isr = new InputStreamReader(fis,"GBK"); int d = -1; //方法一 while((d=isr.read())!=-1){ System.out.println((char)d); }
//方法二
char[] data = new char[10]; int len = isr.read(data); System.out.println(new String(data,0,len)); //对于字符数组转换的字符串,不能添加编码格式