您的位置:首页 > 职场人生

黑马程序员 —— Java高级视频_IO输入与输出(第十九天)2

2015-02-02 16:55 1826 查看
-------
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培训、期待与您交流! ----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐