你的位置:首页 > Java教程

[Java教程]Java的IO流


流的应用很多,其中一个就是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修饰的方法不被序列化