A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

本帖最后由 小石姐姐 于 2018-4-26 14:16 编辑

Java输入输出流笔记

Day_10输入流,输出流  
  标准输入和标准输出流
System.in -->InputStreamReader--Reader-->        
  • 要明白什么是System的类字段,
  • 其实标准输入和输出流就是
  • System.in   System.out   分别是 in和out类字段
  • System类的类字段

    • err: 标准错误输出流. 命令行输出错误信息

      • 是PrintStream, OutputStream的子类, 属于字节输出流.


    • in: 标准输入流. 键盘输入  

      • 是InputStream类, 属于字节输入流. InputStream in = System.in;


    • out: 标准输出流. 将数据输出到控制台

      • 是PrintStream, OutputStream的子类, 属于字节输出流.  OutputStream out = System.out;



    OutputStreamWriter概述和使用:
    • String类的相关方法

      • 构造方法 (作用: byte[] 转 String)

        • String(byte[] bys, int index, int length): 使用byte数组的一部分按照系统默认编码表(GBK)创建String, 即将byte数组转为String


      • 成员方法 (作用: String 转 byte[])

        • byte[] getBytes(): 按照默认编码表获取字符串的byte数组, 即将String转为byte数组


      • 因为OutputStreamWriter类是Writer的子类,数据字符输入流,是字符流通向字节流的桥梁,也就是中间人
      • 实现这种转换: Writer -> OutputStreamWriter -> OutputStream




打印流的特有功能
  • PrintWriter类

    • 构造方法

      • PrintWriter PrintWiter(String filepath)创建对象,字符流
      • PrintWriter PrintWriter(Writer out, boolean autoFlush): 包装字符输出流创建对象, 同时设置是否自动刷新
      • PrintWriter(OutputStream out, boolean autoFlush): 包装字节输出流创建对象, 同时设置是否自动刷新



  • PrintWriter, 字符打印输出流的特点

    • 自动换行. println(). 会根据系统自动确定换行符
    • 自动刷新. 通过构造方法的配置可以实现(只在调用println(), printf(), format()时有用)
    • 也是包装流, 类似于BufferedWriter, 自身没有写出功能
    • 可以把字节输出流转换为字符输出流
    • 不能输出byte字节, 可以输出其他任意类型(要输出字节可以使用PrintStream)
    • 关流不会抛出异常(此类中的方法不会抛出 I/O 异常,尽管其某些构造方法可能抛出异常)



转换流
  • OutputStreamWriter     以操作字符流的方式按字节流写入
  • InputStreamReader       以操作字符流的方式按字节流读入例如:


  • BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  • BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));


  
  ​
  ​
  # 对象流
  ​
   * ObjectInputStream            从文件中读入一个对象到内存中
   * ObjectOutputStream         将内存中的对象写入文件中
  ​
  创建集合对象,存储类的对象,然后直接写入类的对象
  ​
  读取数据时,直接读取集合对象,就不会报异常
  ​
  ​
  ​
  # 序列化接口
  ​
      但我们改变成员变量的时候,增删成员变量, 如果没有给类生成序列号,那么在读取类成员变量数据的时候,会报错。
  ​
      生成序列号的前提,我们**必须实现序列化接口**,否则无法生成序列号对象操作流概述
  • 对象操作流 (都属于字节流)

    • ObjectInputStream

      • 构造方法

        • ObjectInputStream(InputStream in): 创建对象输入流


      • 成员方法

        • Object readObject(): 从对象输入流读取对象, 一次只读取一个对象. 当读不到时抛出EOFException.



    • ObjectOutputStream

      • 构造方法

        • ObjectOutputStream(OutputStream out): 创建对象输出流


      • 成员方法

        • void writeObject(Object o): 将对象写入对象输出流





例题:
  
  ​编码表
把计算机底层的二进制数据转换成我们能看到的字符        * ASCII
  • GB2312 ----GBK

    • Unicode所有字符都占2字节


  • 读取不同类型编码表的数据,我们再读取和写出时要一致,否则会因为无法解析而产生乱码
  • 处理乱码的2种方式:

    • String通过指定编码转为byte数组, 然后再创建String: (GBK字符串转UTF-8字符串写入文件)

      • 先将String通过目标编码转为byte数组: byte[] bys = "月薪过万".getBytes("UTF-8");
      • 再将byte数组转换为String: String str = new String(bys);
      • 写入到文件: fw.write(str);


    • OutputStreamWriter可以指定编码写入文件, 免去使用String通过编码转换为byte数组的步骤

      • OutputStreamWriter OutputStreamWriter(OutputStream out, String charsetName): 创建转换流对象, 并指定编码




编码的读取和写入  /*
   * 有字符串“键盘敲烂,月薪过万”
      以“UTF-8”编码写到根路径下的aa.txt文件中
      以“UTF-8”编码读取并打印到控制台
      有字符串“键盘敲烂,月薪过万”
      以“UTF-8”编码写到根路径下的aa.txt文件中
      以“UTF-8”编码读取并打印到控制台
   */
  public class UTFDemo {
      public static void main(String[] args) throws IOException {
          // 输出流
          method();
          // 输入流
          method2();
      }
  ​
      private static void method2() throws FileNotFoundException, IOException, UnsupportedEncodingException {
          FileInputStream fi = new FileInputStream("demo.txt");
  ​
          // 定义一个字节数组
          byte[] by = new byte[1024];
  ​
          int line = fi.read(by);
          // 将读取的字节数据转换成UTF-8的格式成字符串来显示
          String str = new String(by, 0, line, "UTF-8");
          // 输出数据
          System.out.println(str);
  ​
          // 关闭资源
          fi.close();
      }
  ​
      private static void method() throws UnsupportedEncodingException, FileNotFoundException, IOException {
          // 定义一个字符串
          String s = "键盘敲烂,月薪过万!";
          // 将字符串转换成byte数组的形式
          byte[] by = s.getBytes("UTF-8");
          FileOutputStream fs = new FileOutputStream("demo.txt");
  ​
          fs.write(by);
          fs.close();
      }
  }
特殊的和Map类似Properties类
  • 继承了Hashtable<K, V>, 实现Map<K,V>接口, 以键值对方式存储数据
  • 作用:  保存键值对信息, 可与IO流结合使用, 将数据方便的写入到文件, 或从文件中读取到集合
  • 应用场景:  保存程序的配置信息


注意:
  • Properties不能存null的键和值
  • 只能保存英文数字和符号, 默认使用ISO-8859-1编码, 存中文会显示乱码

    • 注意: 如果配置文件保存为.txt, 使用Eclipse打开会变成GBK编码, 可以显示中文. 但一般都存为.properties, 使用ISO-8859-1, 显示不了中文


  • 键和值都是字符串

















0 个回复

您需要登录后才可以回帖 登录 | 加入黑马