day10标准输入输出流

来源:互联网 发布:美橙域名注册 编辑:程序博客网 时间:2024/06/06 05:13

标准输入输出流概述:

InputStream类:    public stati final InputStream in;//字节输入流。用来读取键盘录入的数据。OutputStream类:    public static final PrintStream out;//字节输出流;用来将数据输出到控制台。

案例1:

数据源:文本文件    BufferedReader              字符输入流目的地: 控制台    System.out(OutputWriter)    字节输出流通过转换流OutputStreamWriter(Writer的子类) 然后包装成BufferedWriter.     BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

案例2:

数据源:键盘录入    System.in(InputStream)      字节输入流。目的地:文本文件    BufferedWriter              字符输出流(带缓冲)弊端:用字符流写字节和字节数组不行,必须将字节数组转成字符串或字符数组,在写入文件。需要通过转换流,将字节输入流转换r InputStreamReader(Reader子类)然后包装成BufferedReader.    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

怎么样拿到键盘录入的数据:

1,Scanner sc = new Scanner(System.in);2,InputStream is = System.in;  //只可以拿字节,如果输入的就是一行字符串3,InputStream is = System.in; //指向键盘  //利用转换流把字节流转换成字符流  Reader r = new InputStreamReader(is);  //,由于字符流没有读取一行的功能,必须对其进行包装  BufferedReader br = new BufferedReader(r);  String str = br.readLine();  System.out.println(str);

读取文件里的数据,打印到控制台

(行为:只读 , 用字符流)

第一种解决方案:

​ 用标准的输出流把数据打印到控制台

//创建输入流对象BufferedReader br = new BufferedReader(new FileReader("SystemInOutDemo.java"));//创建输出流对象OutputStream os = System.out;String line;//用于存储读取到的数据while((line = br.readLine()) != null) {  os.write(line.getBytes());  //把字符串转成字节数组  os.write("\r\n".getBytes());  //System.out.println(line);}

​ 第一种可以做,但是由于 System.out;是一个字节流,所以在输出字符串的时候,需要把字符串转成对应的字节数组(不推荐!!!)

第二种解决方案:

//创建输入流对象BufferedReader br = new BufferedReader(new FileReader("SystemInOutDemo.java"));//创建输出流对象//OutputStream os = System.out;Writer w = new OutputStreamWriter(System.out);//多态,父类型引用指向子类对象//进行数据的读写String line;//用于存储读取到的数据while((line = br.readLine()) != null) {    w.write(line);    w.write("\r\n");}//通过这行代码 Writer w = new OutputStreamWriter(System.out);//把字节流转成了 字符流,其目的 就是为可以 直接写字符串

第三种解决方案:

//创建输入流对象BufferedReader br = new BufferedReader(new FileReader("SystemInOutDemo.java"));//创建输出流对象OutputStream os = System.out;//Writer w = new OutputStreamWriter(System.out);//多态,父类型引用指向子类对象//BufferedWriter bw = new BufferedWriter(w);BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));//进行数据的读写String line;//用于存储读取到的数据while((line = br.readLine()) != null) {    bw.write(line);    bw.newLine();}//第三种:对字符流又进行包装,就是为了可以输出一个  换行

第四种解决方案:

用字符流来读,用 System.out.print("直接打印读到的数据");

转换流:(理解!)

InputStreamReaderOutputStreamWriter

作用:

  • [ ] 1,都是把字节流转成字符流
  • [ ] 2,可以用指定的编码表来读写数据

打印流:

​ (只能操作目的地,不能操作数据源)

printStream:    System.out//就是该打印流printWriter:(Writer一种)//字符输出流,向文本输出的流。该类实现了所有System.out.print方法。

特点:

  • [ ] ​ 1,PrintWriter 它的构造不仅可以接收一个字节流,也可以接收一个字符流并且还可以直接关联 文件 以及在构造里直接放一个 File 对象

  • [ ] ​ 2,通过某些配置,可以实现自动刷新((需要通过(输出流,boolean开关)构造该打印流,通过调用特有方法pringln()、pringf()、print()))

  • [ ] ​ 3,可以自动换行,需要使用PrintWriter的特有方法pringln()该方法与系统无关)
  • [ ] ​ 4,可以保证数据的原样性 (写 123 在文件里就是 123)(需要使用特有方法print、println)

​ 主要用的方法:
​ printlin(数据);//如果调用的还是 write(); 那么不会换行,也不会保证数据的原样性,更不自动刷新

注意:

  • [ ] 不能输出字节,可以输出其他任意类型
  • [ ] 该输出流的底层是构建了一个高效字符输出流BufferedWriter.
  • [ ] 也可以将字节输出流转换成字符输出流。(通过不同的构造方法实现)
  • [ ] 只能输出,不能输入。

对象操作流:

ObjectInputStream://对象(字节)输入流,ObjectOutputStream://对象(字节)输出流//可以用于读写对象。当使用对象输出流写入的对象,只能够使用对象输入流读取出来。只能够将支持java.io.Serializable的对象写入对象输出流。

构造函数:

//ObjectInputStream();一般不用无参//ObjectOutputStream();ObjectInputStream(InputStream in);//传入一个字节输入流对象。ObjectOutputStream(OutputStream out);

一般方法:

readObject(Object o);//该方法用于读取对象,如果到达文件末尾,会抛出EOFException异常,需要try...catch处理此异常。反序列化过程。writerObject(Object o);//写对象,序列化过程。

注意:传入的对象必须实现Serializable接口,该接口是一个标识接口,只起标识作用,没有抽象方法。

解决对象输入流读取对象出现异常(到达文件末尾)的问题。

  • [ ] ​ 将要存入的对象先存入集合中,将集合存入文件,读取对象时,先读取集合,再遍历集合。存入集合中的元素也必须是实现了Serializable接口。

  • [ ] ​ 或者使用下面方法

try{    while(true)    //读取对象数据,打印(或存入集合)}catch(EOFException e){    //不处理。}

当写入对象到文件后,修改了类中的成员,解决读取对象时出现的异常
​ 在写入对象前,将对象所在的类的序列号添加进去,再写入文件,这样修改了该类的成员,读取对象文件时不会出现异常。

Properties类:(重点)

​ 表示一个持久的属性集。 属性列表中每个键和对应的值都是一个字符串

是一个双列集合

Map<K,V>|--Hashtable    |--Properties

重点是Properties和IO流结合使用的功能,用于读取写入配置文件信息。

一般方法:与IO流相关(重点掌握)

void list(PrintWriter out);将配置信息写入到打印输出流对象,需要传入打印输出流对象。(只能放打印输出流对象,可以是PrinttStream)void load(Reader reader);将文件中的配置信息以键值对的形式读取到属性集对象中。需要传入字符输入流对象(也可以是字节流)void store(Writer w,String comments);也是写出键值对到文件,可以一次性写入集合所有配置信息。需要传入两个参数,前一个接收任何字符(也可以是字节)输出流类型,后一个是需要写到配置文件第一行的说明性文字。

一般方法:(与双列集合相关)

​ 该集合是一个双列集合Map的实现子类,有特有的存入键值对和获取键值对的方法

setProperties("str","str2");功能同map的put方法。getProperties("str","str2");功能同map的

编码表:

概述:就是将计算机底层的二进制转换成字符。

  • [ ] ASCII:ASC码表。一共123位字符和对应的数字。
  • [ ] GB2312—GBK
  • [ ] Unicode国际标准编码表,所有字符占2个字节
  • [ ] UTF-8 :长度可变的码表,一般英文字母占1个字节,中文占3个字节。
  • [ ] ANSI:本地编码表。(例如操作系统是中文,本地编码表就是GBK)

    特点:

  • [ ] GBK:一个中文占2个字节,16位

  • [ ] UTF-8 :一个中文占3个字节,24位。

注意:

  • [ ] java中的中文默认是本地码表ANSI,(如果是中文操作系统,码表就是GBK)
  • [ ] 乱码问题:使用编码和解码时保持前后一致即可。
  • [ ] String类的构造方法中可以传入一个字符串参数来指定编码表解析。创建转换字符流时,可以在构造函数中传入第二个参数来指定编码表。用于解决乱码问题。


原创粉丝点击