黑马程序员 —— Java高级视频_IO输入与输出(第十九天)2
2015-02-02 16:55
1826 查看
-------
android培训、java培训、期待与您交流! ----------
关键是要掌握了流操作的基本规律,掌握了规律操作起来就容易了。
上面的程序,我们刚开始源和目的是 —— 源:键盘录入、目的:控制台,
如果我们需求改变了,需求:想把键盘录入的数据存储到一个文件中 —— 源:键盘录入、目的:文件,
如果需求在此发生变化,需求:将一个文件的数据打印到控制台上 —— 源:文件、目的:控制台,
可见,“源和目的”不一样,所使用的流对象也不一样。
源:输入流 — InputStream、Reader
目的:输出流 —OutputStream、Writer
(2)操作的数据是否纯文本
是:字符流
不是:字节流
(3)当体系明确后,再通过设备来区分,明确要使用哪个具体的对象
源设备:内存、硬盘、键盘
目的设备:内存、硬盘、控制台
是否需要提高效率:是则加入缓冲区技术(推荐加入);否则不加
注意:(1)、(2)是用来明确体系,(3)是用来决定使用对象的。
(1) 源
因为是源,所以使用读取流,IputStream或者Reader
是不是操作文本文件:是,所以使用 Reader
这样就明确了体系,接下来明确要使用该体系中的那个对象。
明确设备,硬盘上的一个文件 → 硬盘
Reader 体系中可以操作文件的是,FileReader
FileReader fr = new FileReader("a.txt");
是否需要提高效率?
BufferedReader bufr = new BufferedReader(fr);
(2) 目的
写入流:OutputStream或者Writer
是否纯文本:是Writer
设备:硬盘上的一个文件 → 硬盘
Writer体系中可以操作文件的对象 FileWriter
FileWriter fw = new FileWriter("b.txt");
是否需要提高效率?是: BufferedWriter bufr = new BufferedWriter(fr);
练习:复制文件,将一个图片文件中的数据存储到另一个文件中。要按照以上格式自己完成三个明确。
这个需求中有源和目的都存在,那么分别分析
(1) 源
InputStream或者Reader
是不是纯文本:是,用Reader
是不是设备:是,键盘,对应的对象是 System.in
不是选择Reader吗?System.in 对应的不是字节流吗?
为了操作键盘的文本数据方便,字节流可以转换成字符流,按照字符串操作最方便。
既然明确了 Reader 就将 System.in 转换成 Reader
用到了Reader 体系中的转换流,InputSteamReader
InputStreamReader isr = InputStreamReader(System.in);
需要提高效率吗?需要,BufferedReader
BufferedReader bufr = new BufferedReader(isr);
(2)目的:
OutputStream或者Writer
是否是纯文本?是,Writer
是不是设备?是,硬盘,使用FileWriter
FileWriter fw = new FileWriter("b.txt");
需要提高效率吗?需要
BufferedWriter bufw = new BufferedWriter(fw);
目的:OutputStream Writer
是否是纯文本?是,Writer
是不是设备?是,硬盘,使用FileWriter
但是存储时需要加入指定的编码表,FileWriter默认使用GBK编码表。对于指定编码表,只有转换流可以指定。
所以要使用的对象是 OutputStreamWriter.
而该转换流对象要接收一个字节输出流。而且还可以操作文件的字节输出流,FileOutputStream
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d.txt"),"UTF-8");
需要高效吗?需要,BufferedWriter bufw = new BufferedWriter(osw);
所以要记住,转换流什么时候使用,字符和字节之间的桥梁,通常,涉及到字符编码转换时,需要用到转换流。
练习:将一个文本数据打印在控制台上。要按照以上格式自己完成三个明确。
二十 改变标准输入输出设备
通过System类中的setIn()、setOut()方法可以改变设备,
例如,将键盘录入改成文件,System.setIn(new FileInputStream("buf.txt"));
将输出目的改为文件,System.setOut(new PrintStream("buf.txt"));
如果源和目的都改成文件,就是复制。
static void setIn(InputStream in)重新分配“标准”输入流。
static void setOut(PrintStream out)重新分配“标准”输出流。
异常中,异常对象调用printStackTrace(),将异常信息打印在控制台,底层调用System.out,
或者创建一个PrintStream对象,将信息打印在控制台。PrintStream也可以调用println()方法。
需要将异常信息打印在某个文件中,便于观察,
例如,System.setOut(newPrintStream("exception.log"));e.printStackTrace(System.out);最好在加上时间。
一般使用网络上的log4j工具,帮助完成日志信息的建立。
二十二 系统信息
static Properties getProperties():确定当前的系统属性。
------- android培训、java培训、期待与您交流! ----------
android培训、java培训、期待与您交流! ----------
十八 流操作规律1
上面学习了如果之多的流(其实后面的章节还有不少),那么到底应该如何确定什么情况用什么流呢?关键是要掌握了流操作的基本规律,掌握了规律操作起来就容易了。
1、引入“源和目的”的概念
import java.io.*; public class Demo { public static void main(String args[]) throws IOException { BufferedReader bufr = new BufferedReader(new InputStreamReader( System.in)); //这里是“源” BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter( System.out)); //这里是“目的” String line = null; while ((line = bufr.readLine()) != null) { if (line.equals("over")) { break; } bufw.write(line.toUpperCase()); bufw.newLine(); bufw.flush(); } bufr.close(); } }
上面的程序,我们刚开始源和目的是 —— 源:键盘录入、目的:控制台,
如果我们需求改变了,需求:想把键盘录入的数据存储到一个文件中 —— 源:键盘录入、目的:文件,
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("demo.txt")));
如果需求在此发生变化,需求:将一个文件的数据打印到控制台上 —— 源:文件、目的:控制台,
BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileInputStream("CopyPic.java"))); BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
可见,“源和目的”不一样,所使用的流对象也不一样。
2、流的操作规律
(1) 明确源和目的源:输入流 — InputStream、Reader
目的:输出流 —OutputStream、Writer
(2)操作的数据是否纯文本
是:字符流
不是:字节流
(3)当体系明确后,再通过设备来区分,明确要使用哪个具体的对象
源设备:内存、硬盘、键盘
目的设备:内存、硬盘、控制台
是否需要提高效率:是则加入缓冲区技术(推荐加入);否则不加
注意:(1)、(2)是用来明确体系,(3)是用来决定使用对象的。
3、通过具体需求掌握规律
需求:复制文件,将一个文本文件中的数据存储到另一个文件中。(1) 源
因为是源,所以使用读取流,IputStream或者Reader
是不是操作文本文件:是,所以使用 Reader
这样就明确了体系,接下来明确要使用该体系中的那个对象。
明确设备,硬盘上的一个文件 → 硬盘
Reader 体系中可以操作文件的是,FileReader
FileReader fr = new FileReader("a.txt");
是否需要提高效率?
BufferedReader bufr = new BufferedReader(fr);
(2) 目的
写入流:OutputStream或者Writer
是否纯文本:是Writer
设备:硬盘上的一个文件 → 硬盘
Writer体系中可以操作文件的对象 FileWriter
FileWriter fw = new FileWriter("b.txt");
是否需要提高效率?是: BufferedWriter bufr = new BufferedWriter(fr);
练习:复制文件,将一个图片文件中的数据存储到另一个文件中。要按照以上格式自己完成三个明确。
十九 流操作规律2
1、分析需求
需求:将键盘录入的数据保存到一个文件中。这个需求中有源和目的都存在,那么分别分析
(1) 源
InputStream或者Reader
是不是纯文本:是,用Reader
是不是设备:是,键盘,对应的对象是 System.in
不是选择Reader吗?System.in 对应的不是字节流吗?
为了操作键盘的文本数据方便,字节流可以转换成字符流,按照字符串操作最方便。
既然明确了 Reader 就将 System.in 转换成 Reader
用到了Reader 体系中的转换流,InputSteamReader
InputStreamReader isr = InputStreamReader(System.in);
需要提高效率吗?需要,BufferedReader
BufferedReader bufr = new BufferedReader(isr);
(2)目的:
OutputStream或者Writer
是否是纯文本?是,Writer
是不是设备?是,硬盘,使用FileWriter
FileWriter fw = new FileWriter("b.txt");
需要提高效率吗?需要
BufferedWriter bufw = new BufferedWriter(fw);
2、扩展一下
想要把录入的数据按照指定的编码表(UTF-8),将数据存到文件中。(使用转换流,可以指定编码)目的:OutputStream Writer
是否是纯文本?是,Writer
是不是设备?是,硬盘,使用FileWriter
但是存储时需要加入指定的编码表,FileWriter默认使用GBK编码表。对于指定编码表,只有转换流可以指定。
所以要使用的对象是 OutputStreamWriter.
而该转换流对象要接收一个字节输出流。而且还可以操作文件的字节输出流,FileOutputStream
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d.txt"),"UTF-8");
需要高效吗?需要,BufferedWriter bufw = new BufferedWriter(osw);
所以要记住,转换流什么时候使用,字符和字节之间的桥梁,通常,涉及到字符编码转换时,需要用到转换流。
练习:将一个文本数据打印在控制台上。要按照以上格式自己完成三个明确。
二十 改变标准输入输出设备
通过System类中的setIn()、setOut()方法可以改变设备,例如,将键盘录入改成文件,System.setIn(new FileInputStream("buf.txt"));
将输出目的改为文件,System.setOut(new PrintStream("buf.txt"));
如果源和目的都改成文件,就是复制。
static void setIn(InputStream in)重新分配“标准”输入流。
static void setOut(PrintStream out)重新分配“标准”输出流。
import java.io.*; public class Demo { public static void main(String args[]) throws IOException { System.setIn(new FileInputStream("ArrayToolDemo.java")); System.setOut(new PrintStream("buf2.txt")); } }
二十一 异常的日志信息
import java.io.*; import java.util.*; import java.text.*; public class Demo { public static void main(String args[]) { try { int[] arr = new int[2]; System.out.println(arr[3]); } catch (Exception e) { try { Date d = new Date(); SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); String s = sdf.format(d); PrintStream ps = new PrintStream("exeception.txt"); ps.println(s); System.setOut(ps); } catch (IOException ex) { throw new RuntimeException("日志文件创建失败"); } e.printStackTrace(System.out); } } }
异常中,异常对象调用printStackTrace(),将异常信息打印在控制台,底层调用System.out,
或者创建一个PrintStream对象,将信息打印在控制台。PrintStream也可以调用println()方法。
需要将异常信息打印在某个文件中,便于观察,
例如,System.setOut(newPrintStream("exception.log"));e.printStackTrace(System.out);最好在加上时间。
一般使用网络上的log4j工具,帮助完成日志信息的建立。
二十二 系统信息
import java.io.*; import java.util.*; import java.text.*; import java.text.*; public class Demo { public static void main(String args[]) throws IOException { Properties prop = System.getProperties(); prop.list(new PrintStream("demo.txt")); } }
static Properties getProperties():确定当前的系统属性。
------- android培训、java培训、期待与您交流! ----------
相关文章推荐
- 黑马程序员 —— Java高级视频_IO输入与输出(第十九天)1
- 黑马程序员-JAVA高级视频_IO输入与输出-20天-3(File文件递归)
- 黑马程序员-JAVA高级视频_IO输入与输出-19天-10(读取转换流)
- 黑马程序员-JAVA高级视频_IO输入与输出-18天-1(System)
- 黑马程序员 —— Java高级视频_IO输入与输出(第十八天)2
- 黑马程序员-JAVA高级视频_IO输入与输出-19天-8(拷贝图片)
- 黑马程序员-JAVA高级视频_IO输入与输出-18天-3(IO异常处理方式)
- 黑马程序员--java高级视频_io输入与输出
- 黑马程序员 —— Java高级视频_IO输入与输出(第二十天)
- 黑马程序员-JAVA高级视频_IO输入与输出-19天-5(装饰设计模式)
- 黑马程序员-JAVA高级视频_IO输入与输出-19天-4(MyBufferedReader)
- 黑马程序员-JAVA高级视频_IO输入与输出-20天-6(File文件删除)
- 黑马程序员-JAVA高级视频_IO输入与输出-19天-7(字节流File读写操作)
- 黑马程序员-JAVA高级视频_IO输入与输出-20天-4(File文件写入)
- 黑马程序员-JAVA高级视频_IO输入与输出-20天-5(File打印流)
- 黑马程序员-JAVA高级视频_IO输入与输出-18天-4(文件的续写)
- 黑马程序员-JAVA高级视频_IO输入与输出-20天-9(切割合并文件)
- 黑马程序员-JAVA高级视频_IO输入与输出-18天-5(文本文件读取方式一)
- 黑马程序员 —— Java高级视频_IO输入与输出(第十八天)1
- 黑马程序员-JAVA高级视频_IO输入与输出-20天-7(Properties练习)