流的应用很多,其中一个就是Socekt(包括TCP和UDP),需要结合学习
一、基础概念
1.流是什么?
用于程序和设备之间数据传输的管道,这个管道上有很多按钮,用不同的按钮实现不同的功能
2.流的分类?
(1)按照流的方向:输入流、输出流
(2)按照传输的数据类型:字节流、字符流
(3)按照功能的不同:原始流(节点流)、包裹流(处理流)
3.一些流的区别
(1)四大基本流:InputStream,OutputStream,Reader,Writer是原始流
方法注意:所有的输出流中有flush方法,而输入流中并没有
(2)文件流:FileInputStream,FileOutputStream,FileReader,FileWriter是包裹流。
其中字节流可用来完成所有格式的文件的复制,但是字符流只能完成文本文件的复制;
另外,字节流在处理输入输出时不会用到缓存,但是字符流会用到缓存(主要区别);
将文本文件的内容输入电脑并显示出来时,字符流可以,但是字节流因为读入的是字节,输入到显示屏时以字符输出便会产生乱码!
(3)缓冲流:BufferInputStream,BufferOutputSream,BufferReader,BufferWriter是包裹流
特点:可以减少对IO的访问次数,从而保护计算机硬盘
BufferInputStream和BufferOutputStream可以完成大容量文件的复制,这比单纯使用InputStream和OutputStream要快得多
需要注意:bis,read(buf,0,1024)是从bis所关联的的文件中读取数据,并将其写入bis自己默认的缓冲区中,然后将缓冲区的内容写入buf数组中,
每次最多写入1024个字节,返回实际写入buf数组的字节个数,若到尾,则无法再向buf数组中写数,返回-1
BufferedReader流中有个非常重要有用的方法readLine,可提高读写速度。
也要注意readLine()方法遇到换行就停止,但是会将读取的换行符自动丢弃,所以一般需要自己再newLine();
(4)数据流:DataInputStream,DataOutputStream,是包裹流;没有DataReader,DataWriter
特点就是其中包含的可以读取或写出任意基本类型的数据的方法,比如dos.writeLong(n) 另外还有readBoolean readInt readChar readFloat readUTF其实是读取String类
也要注意,DataOutputStream流中的writeLong(Long n)是把n变量的内存中的二进制代码写入该流所关联的设备中
(5)转换流:InputStreamReader,OutputStreamWriter
实例:将键盘输入的字符显示
(6)Print流:PrintStream,PrintWriter
特点:用于不同数据类型的格式化输出(将一个数据用其字符串格式输出)(区别数据流)
PrintStream只能封装OutputStream类的字节流,而PrintWriter不仅能封装OutputStream还能封装Writer.另外PrintWriter中的println具有跨平台性
其中两种用法:System.setOut(psOut);//
System.setErr(psError);//将错误信息输出到关联设备显示屏中
(7)Object流,也叫做对象序列化
特别注意,这里对象序列化也就是把一个object类对象直接转换成字节流,然后把字节流直接写入本地硬盘或网络。
必须实现serializable接口,是一个标识接口,里面没有任何的方法
用transient修饰的方法不被序列化
文本文件的复制,用字符流比字节流好
package fileCopyTest; import java.io.*; public class TestFileReaderWriterCopy { public static void main(String[] args){ try{ FileReader fr=new FileReader("F:\\test.text");//此处应该抛异常 FileWriter fw=new FileWriter("F:/result.text");//此处应该抛异常 int ch; ch=fr.read();//没有fr.read(ch); while (-1!=ch){ fw.write(ch); ch=fr.read(); } fw.flush(); fr.close(); fw.close(); } catch (Exception e){ System.out.printf("aaaa"); } } }
一般用缓冲流来实现文件的读取,速度较快