java基础之IO流

来源:互联网 发布:淘宝客服介入处理时间 编辑:程序博客网 时间:2024/04/30 19:23
1. 流的分类:
根据 输入流(读) 和 输出流(写)。

同时也可以输入或输出的数据不同分为 字节流 和字符流。

流的体系因功能的不同,但是根据他们的共性,不断的抽取,形成继承体系。一共有四个基类,并且都是抽象类:

字节流 : InputStream OutputStream

字符流:  Reader Writer

在这四个体系中,他们的子类有一个共同的特点,前缀是功能名称,后缀是父类名称。例如:

字符流: FileReaderFileWriter

BufferReader BufferWriter

字节流: FileInputStream FileOutputStream

BufferInputStreamBufferOutputStream

IO流:用于处理设备上的数据。 流:可以理解为数据的流动,就是数据流。IO 流最终要以对象来体现,对象都封装在 IO 包中。

2. 字节流:处理字节数据的流对象。设备上的数据无论是图片或者dvd,文字,它们都以二进制存储的。二进制的最终都是以一个8位为数据单元进行体现,所以计算机中的最小数据单元就是
字节。意味着,字节流可以处理设备上的所有数据,所以字节流一样可以处理字符数据。

3. 字符流:因为字符每个国家都不一样,所以涉及到了字符编码问题,那么GBK编码的中文用unicode编码解析是有问题的,所以需要获取中文字节数据的同时+ 指定的编码表才可以解析正确
数据。为了方便于文字的解析,所以将字节流和编码表封装成对象,这个对象就是字符流。只要操作字符数据,优先考虑使用字符流体系。

4. 注意 close() 和 flush() 的区别:
前者将缓冲区的数据刷出,但是流还是可以使用的;后者则是直接将流关闭了,同时缓冲区的数据会被刷出,并且该动作是流操作最后必须执行的。这样可以避免资源的浪费。

5. IO 异常的处理:一定要写 finally() 语句。

6. FileWriter写入数据的细节:
1:window中的换行符:\r\n两个符号组成。 linux:\n。
2:续写数据,只要在构造函数中传入新的参数true。
3:目录分割符:window \\  /

7. FileReader:使用Reader体系,读取一个文本文件中的数据。返回 -1 ,标志读到结尾。

8. 字符流的缓冲区: 提高对数据的读写效率

对应类: BufferedWriterBufferedReader 

缓冲区中提供了一个跨平台的换行符  newLine();

9. 装饰设计模式: 当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。那么自定义的该类称为装饰类

装饰类通常会通过构造方法接收被装饰的对象

并基于被装饰的对象的功能,提供更强的功能

10. 装饰类比继承类要灵活,避免了继承体系的臃肿。 而且降低了类与类之间的关系

装饰类因为增强已有对象,具备的功能与已有的的是相同。只不过提供了更加强大的功能。所以装饰类与被装饰类通常属于一个体系中的

11. IO中的使用到了一个设计模式:装饰设计模式。
装饰设计模式解决:对一组类进行功能的增强。

包装:写一个类(包装类)对被包装对象进行包装;
  1、包装类和被包装对象要实现同样的接口;
2、包装类要持有一个被包装对象;
  3、包装类在实现接口时,大部分方法是靠调用被包装对象来实现的,对于需要修改的方法我们自己实现;

12. 字符流:
Reader:用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。
    
|---BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
        
|---LineNumberReader:跟踪行号的缓冲字符输入流。此类定义了方法 setLineNumber(int) 和 getLineNumber(),它们可分别用于设置和获取当前行号。
     
|---InputStreamReader:是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的
字符集。

        |---FileReader:用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。

        |---CharArrayReader:
     
|---StringReader:

13. 字符流:
Writer:写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。
     
|---BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
    
|---OutputStreamWriter:是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默
认的字符集。
      
 |---FileWriter:用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。要自己指定这些值,可以先在 FileOutputStream 上构造一个 OutputStreamWriter。
    
|---PrintWriter:
     
|---CharArrayWriter:
    
|---StringWriter:

14. 字节流:
InputStream:是表示字节输入流的所有类的超类。
    
|--- FileInputStream:从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请
考虑使用 FileReader。

        |--- FilterInputStream:包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。
   
        |--- BufferedInputStream:该类实现缓冲的输入流。
        
|--- Stream:
        
  |--- ObjectInputStream:

        |--- PipedInputStream:

15. 字节流:
OutputStream:此抽象类是表示输出字节流的所有类的超类。
 
     |--- FileOutputStream:文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。
 
     |--- FilterOutputStream:此类是过滤输出流的所有类的超类。
 
       |--- BufferedOutputStream:该类实现缓冲的输出流。
        
       |--- PrintStream:
       
       |--- DataOutputStream:
     
     |--- ObjectOutputStream:

     |--- PipedOutputStream:

16. 缓冲区是提高效率用的,给谁提高呢?
BufferedWriter:是给字符输出流提高效率用的,那就意味着,缓冲区对象建立时,必须要先有流对象。明确要提高具体的流对象的效率。

17. 流对象:其实很简单,就是读取和写入。但是因为功能的不同,流的体系中提供N多的对象。那么开始时,到底该用哪个对象更为合适呢?这就需要明确流的操作规律。

18. 流的操作规律:
1,明确源和目的。
数据源:就是需要读取,可以使用两个体系:InputStream、Reader;
数据汇:就是需要写入,可以使用两个体系:OutputStream、Writer;

2,操作的数据是否是纯文本数据?
如果是:数据源:Reader
   数据汇:Writer 
如果不是:数据源:InputStream
    数据汇:OutputStream

3,虽然确定了一个体系,但是该体系中有太多的对象,到底用哪个呢?
明确操作的数据设备。
数据源对应的设备:硬盘(File),内存(数组),键盘(System.in)
数据汇对应的设备:硬盘(File),内存(数组),控制台(System.out)。

4,需要在基本操作上附加其他功能吗?比如缓冲。
如果需要就进行装饰。

19. 转换流特有功能:转换流可以将字节转成字符,原因在于,将获取到的字节通过查编码表获取到指定对应字符。
转换流的最强功能就是基于 字节流 + 编码表 。没有转换,没有字符流。

20. 发现转换流有一个子类就是操作文件的字符流对象:
InputStreamReader
|--FileReader
OutputStreamWriter
|--FileWrier

想要操作文本文件,必须要进行编码转换,而编码转换动作转换流都完成了。所以操作文件的流对象只要继承自转换流就可以读取一个字符了。

21. 如果需要制定码表,必须用转换流。
转换流 = 字节流+编码表。

转换流的子类File = 字节流 + 默认编码表。

凡是操作设备上的文本数据,涉及编码转换,必须使用转换流。

22. File 类:用来将文件或者文件夹封装成对象,方便对文件和文件夹的属性信息进行操作。File 类可以作为参数传递给流的构造函数

23. File 类常见方法:
1:创建。
boolean createNewFile():在指定目录下创建文件,如果该文件已存在,则不创建。而对操作文件的输出流而言,输出流对象已建立,就会创建文件,如果文件已存在,会
覆盖。除非续写。

boolean mkdir():创建此抽象路径名指定的目录。

boolean mkdirs():创建多级目录。 

2:删除。
boolean delete():删除此抽象路径名表示的文件或目录。

void deleteOnExit():在虚拟机退出时删除。

注意:在删除文件夹时,必须保证这个文件夹中没有任何内容,才可以将该文件夹用delete删除。window的删除动作,是从里往外删。注意:java删除文件不走回收站。要慎用。

3:获取.
long length():获取文件大小。

String getName():返回由此抽象路径名表示的文件或目录的名称。

String getPath():将此抽象路径名转换为一个路径名字符串。

String getAbsolutePath():返回此抽象路径名的绝对路径名字符串。

String getParent():返回此抽象路径名父目录的抽象路径名,如果此路径名没有指定父目录,则返回 null。

long lastModified():返回此抽象路径名表示的文件最后一次被修改的时间。

File.pathSeparator:返回当前系统默认的路径分隔符,windows默认为 “;”。

File.Separator:返回当前系统默认的目录分隔符,windows默认为 “\”。

4:判断:
boolean exists():判断文件或者文件夹是否存在。

boolean isDirectory():测试此抽象路径名表示的文件是否是一个目录。

boolean isFile():测试此抽象路径名表示的文件是否是一个标准文件。

boolean isHidden():测试此抽象路径名指定的文件是否是一个隐藏文件。

boolean isAbsolute():测试此抽象路径名是否为绝对路径名。

5:重命名。
boolean renameTo(File dest):可以实现移动的效果。剪切+重命名。

构造函数可以接受的参数类型:
1.file 对象。File
2. 字符串路径。 String
3. 字节输出流。 OutputStream
4. 字符输出流。 Writer

24. Java.io.outputstream.PrintStream:打印流
1:提供了更多的功能,比如打印方法。可以直接打印任意类型的数据。

2:它有一个自动刷新机制,创建该对象,指定参数,对于指定方法可以自动刷新。

3:它使用的本机默认的字符编码. 

4:该流的print方法不抛出IOException。

25. PrintWriter:具备了PrintStream的特点同时,还有自身特点:
该对象的目的地有四个:1:File对象。2:字符串路径。3:字节输出流。4:字符输出流。 开发时尽量使用PrintWriter。

26. SequenceInputStream:序列流,作用就是将多个读取流合并成一个读取流。实现数据合并。静态不能被序列化。

27. 管道流:管道读取流和管道写入流可以像管道一样对接上,管道读取流就可以读取管道写入流写入的数据。

28. ByteArrayOutputStream:目的:内存。 
这两个流对象不涉及底层资源调用,操作的都是内存中数组,所以不需要关闭。

直接操作字节数组就可以了,为什么还要把数组封装到流对象中呢?因为数组本身没有方法,只有一个length属性。为了便于数组的操作,将数组进行封装,对外提供方法操作数组中的元素。

29. 转换流的字符编码

编码: 字符串变成字节数组

解码: 字节数组变成字符串

美国: Acinal码   欧洲: iso8859-1 中国: GBK统一的: unicode( UTF-8)

30. Tomcat 服务器默认编码方式: iso8859-1
0 0
原创粉丝点击