Loading

JavaIO流02

1. 字符流
(1) 字节流操作中文数据不是特别的方便,所以就出现了转换流。
转换流的作用就是把字节流转换字符流来使用。
(2) 转换流其实是一个字符流
字符流 = 字节流 + 编码表
(3) 编码表
  A:就是由字符和对应的数值组成的一张表
  B:常见的编码表
    ASCII  ISO-8859-1  GB2312  GBK  GB18030  UTF-8
  C:字符串中的编码问题
    编码
      String -- byte[]
    解码
      byte[] -- String
(4) IO流中的编码问题
  A:OutputStreamWriter
    OutputStreamWriter(OutputStream os):默认编码,GBK
    OutputStreamWriter(OutputStream os,String charsetName):指定编码。
  B:InputStreamReader
    InputStreamReader(InputStream is):默认编码,GBK
    InputStreamReader(InputStream is,String charsetName):指定编码
  C:编码问题其实很简单
    编码只要一致即可
(5) 字符流
Reader
  |--InputStreamReader
    |--FileReader
  |--BufferedReader
Writer
  |--OutputStreamWriter
    |--FileWriter
  |--BufferedWriter
(6) 复制文本文件(5种方式)

2. IO流小结
IO流
  |--字节流
    |--字节输入流
      InputStream
        int read():一次读取一个字节
        int read(byte[] bys):一次读取一个字节数组

        |--FileInputStream
        |--BufferedInputStream
    |--字节输出流
      OutputStream
        void write(int by):一次写一个字节
        void write(byte[] bys,int index,int len):一次写一个字节数组的一部分

        |--FileOutputStream
        |--BufferedOutputStream
  |--字符流
    |--字符输入流
      Reader
        int read():一次读取一个字符
        int read(char[] chs):一次读取一个字符数组

        |--InputStreamReader
          |--FileReader
        |--BufferedReader
          String readLine():一次读取一个字符串
    |--字符输出流
      Writer
        void write(int ch):一次写一个字符
        void write(char[] chs,int index,int len):一次写一个字符数组的一部分

        |--OutputStreamWriter
          |--FileWriter
        |--BufferedWriter
          void newLine():写一个换行符

          void write(String line):一次写一个字符串

3. 案例
A:复制文本文件 5种方式
B:复制图片(二进制流数据) 4种方式
C:把集合中的数据存储到文本文件
D:把文本文件中的数据读取到集合并遍历集合
E:复制单级文件夹
F:复制单级文件夹中指定的文件并修改名称
回顾一下批量修改名称
G:复制多级文件夹
H:键盘录入学生信息按照总分从高到低存储到文本文件
I:把某个文件中的字符串排序后输出到另一个文本文件中
J:用Reader模拟BufferedReader的特有功能
K:模拟LineNumberReader的特有功能

4. 数据操作流(操作基本类型数据的流)
(1) 可以操作基本类型的数据
(2) 流对象名称
  DataInputStream
  DataOutputStream

5. 内存操作流
(1) 有些时候我们操作完毕后,未必需要产生一个文件,就可以使用内存操作流。
(2) 三种
  A:ByteArrayInputStream,ByteArrayOutputStream
  B:CharArrayReader,CharArrayWriter
  C:StringReader,StringWriter

6. 打印流
(1) 字节打印流,字符打印流
(2) 特点:
  A:只操作目的地,不操作数据源
  B:可以操作任意类型的数据
  C:如果启用了自动刷新,在调用println()方法的时候,能够换行并刷新
  D:可以直接操作文件
  问题:哪些流可以直接操作文件呢?
    如果其构造方法能够同时接收File和String类型的参数,一般都是可以直接操作文件的
(3) 复制文本文件

BufferedReader br = new BufferedReader(new FileReader("a.txt"));
PrintWriter pw = new PrintWriter(new FileWriter("b.txt"),true);

String line = null;
while((line=br.readLine())!=null) {
    pw.println(line);
}

pw.close();
br.close();

7. 标准输入输出流
(1) System类下面有这样的两个字段
  in 标准输入流
  out 标准输出流
(2) 三种键盘录入方式
  A:main方法的args接收参数
  B:System.in通过BufferedReader进行包装
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  C:Scanner
    Scanner sc = new Scanner(System.in);
(3) 输出语句的原理和如何使用字符流输出数据
  A:原理
    System.out.println("helloworld");

    PrintStream ps = System.out;
    ps.println("helloworld");
  B:把System.out用字符缓冲流包装一下使用
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

8. 随机访问流
(1) 可以按照文件指针的位置写数据和读数据。
(2) 案例:
  A:写数据
  B:读数据
  C:获取和改变文件指针的位置

9. 合并流
(1) 把多个输入流的数据写到一个输出流中。
(2) 构造方法:
  A:SequenceInputStream(InputStream s1, InputStream s2)
  B:SequenceInputStream(Enumeration<? extends InputStream> e)

10. 序列化流
(1) 可以把对象写入文本文件或者在网络中传输。
  序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。
  可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
(2) 如何实现序列化呢?
  让被序列化的对象所属类实现序列化接口(Serializable接口)。
  该接口是一个标记接口。没有功能需要实现,只是为了标注该对象是可被序列化的。
  然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,
  接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
(3)注意问题:
  把数据写到文件后,在去修改类会产生一个问题。
  如何解决该问题呢?
    在类文件中,给出一个固定的序列化id值。
    而且,这样也可以解决黄色警告线问题
(4) 什么时候序列化?
  ①:对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。
  ②:java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。
  利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。
(5) 什么是反序列化?
  把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成Java对象模型的过程。
  也就是将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。Java反序列化是指把字节序列恢复为Java对象的过程。

11. Properties
(1) 是一个集合类,Hashtable的子类
(2) 特有功能
  A:public Object setProperty(String key,String value)
  B:public String getProperty(String key)
  C:public Set<String> stringPropertyNames()
(3) 和IO流结合的方法
  把键值对形式的文本文件内容加载到集合中
    public void load(Reader reader)
    public void load(InputStream inStream)

  把集合中的数据存储到文本文件中
    public void store(Writer writer,String comments)
    public void store(OutputStream out,String comments)

12. NIO
(1) JDK4出现的NIO,对以前的IO操作进行了优化,提供了效率。但是大部分我们看到的还是以前的IO
(2) JDK7的NIO的使用
  Path:路径
  Paths:通过静态方法返回一个路径
  Files:提供了常见的功能
    复制文本文件
    把集合中的数据写到文本文件

posted @ 2019-10-30 15:07  brynchen  阅读(139)  评论(0)    收藏  举报