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类的构造方法中可以传入一个字符串参数来指定编码表解析。创建转换字符流时,可以在构造函数中传入第二个参数来指定编码表。用于解决乱码问题。
- day10标准输入输出流
- *标准输入输出流
- JAVA标准输入输出流
- 标准输入输出流案例
- 标准输入输出流
- 标准输入输出流
- 标准输入输出流
- 标准输入输出流
- python 标准输入输出流
- java标准输入输出流
- C++ 标准输入输出流
- 改变标准输入输出流
- C++标准输入输出流
- 6.标准流的输入输出
- 重写系统标准输入输出流
- c++的标准输入输出流
- 标准输入输出流cin、cout
- System类--标准输入输出流
- Python startswith endswith
- UVA6642(树的点分治)
- hdu 1542(线段数+扫描线 求矩形并的面积)
- Qt 网络库各个类的信号
- iOS多线程——你要知道的RunLoop都在这里
- day10标准输入输出流
- LuoguP2679[NOIP2015] 子串 解题报告【多维DP】
- python3 数据类型集合
- Java字节码文件
- iOS多线程——RunLoop与GCD、AutoreleasePool
- day05常用对象
- js瀑布流
- Git命令——git log小结
- G. Orientation of Edges dfs