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

黑马程序员——IO流1

2013-07-03 21:39 316 查看
---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

        IO流主要用来处理设备之间的数据传输,JAVA语言定义了许多类专门负责各种方式的输入输出,这些类都被放在java.io包中。

        流按操作数据分为字节流和字符流,按流向分为输入流和输出流。
  一、字符流:其实就是,字节流读取文字字节数据后,不直接操作而是先查指定的编码表。获取对应的文字。在对这个文字进行操作。简单说:字节流+编码表
字符流顶层父类:Reader,Writer

1,FileReader与FileWriter

FileWriter向文件写入数据步骤:创建带文件构造函数的FileWriter对象;调用write方法写入数据;刷新并关闭流

flush()与close()区别:flush()只是刷新缓冲区,以后还可以操作流对象;close()刷新缓冲区后关闭流,以后无法操作流对象,对一个流对象操作完毕后一定要关闭流,以释放内存资源。

获取系统换行符:System.getProperty("line.separator")

IOException处理方式:只要FileWriter创建成功,中间操作出异常,流必须要关闭,如果FileWriter创建失败,不需要关闭流,如果此时运行关流操作又会出现异常,因此要把关流操作放在finally里面单独try。示例如下:

package itcast;

import java.io.FileWriter;
import java.io.IOException;

public class IOExceptionDemo {
//获取与系统无关的换行符常量
private static final String LINE_SEPARATOR = System.getProperty("line.separator");
public static void main(String[] args) {
//声明FileWriter类型变量引用
FileWriter fw = null;
try {
//初始化fw
fw = new FileWriter("k:\\demo.txt");
//通过write方法添加数据
fw.write("abcde" + LINE_SEPARATOR + "hahaha");

} catch (IOException e) {
System.out.println(e.toString());
} finally {
//避免出现空指针异常
if (fw != null)
try {
fw.close();
} catch (IOException e) {
// code....
throw new RuntimeException("关闭失败");
}
}
}
}

FileReader读取文件步骤:创建读取字符数据的流对象,在创建读取流对象时,必须要明确被读取的文件,一定要确定该文件是存在的;用Reader中的read方法读取字符。

2,BufferedReader与BufferedWriter字符流缓冲区,提高字符流读写效率。

LineNumberReader是BufferedReader的子类,跟踪行号的缓冲字符输入流。此类定义了方法
setLineNumber(int)

getLineNumber()
,它们可分别用于设置和获取当前行号。

package itcast;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CopyText {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("buf.txt");
BufferedReader bufr = new BufferedReader(fr);
FileWriter fw = new FileWriter("buf_copy.txt");
BufferedWriter bufw = new BufferedWriter(fw);
String line = null;
while((line=bufr.readLine())!=null){
bufw.write(line);
bufw.newLine();
bufw.flush();
}
bufw.close();
bufr.close();
}
}

一、字符流:InputStream,OutputStream

1,FileInputStream ,FileOutputStream用于创建一个能操作文件字节的输入或输出流。

2,BufferedInputStream,BufferedOutputStream分别是InputStream、OutputStream的缓冲区,完成字节输入输出流的高效操作。

一个带缓冲区的复制Mp3的示例

package itcast;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyMp3{
public static void main(String[] args) throws IOException {
copy();
}
public static void copy() throws IOException {
FileInputStream fis = new FileInputStream("c:\\0.mp3");
BufferedInputStream bufis = new BufferedInputStream(fis);
FileOutputStream fos = new FileOutputStream("c:\\2.mp3");
BufferedOutputStream bufos = new BufferedOutputStream(fos);
int ch = 0;
while((ch=bufis.read())!=-1){
bufos.write(ch);
}
bufos.close();
bufis.close();
}
}

问:能不能用字符流操作媒体文件。

不能,字符流是字节流加上编码表,当字符流读取媒体文件字节后,回去查编码表,媒体文件是没有码表的,这样就会出现输入输出的字节不一样,导致操作失败。

3,InputStreamReader与OutputStreamWriter:转换流

InputStreamReader :字节到字符的桥梁,读取字节并将其解码为字符。

OutputStreamWriter:字符到字节的桥梁,将要写入流中的字符编码成字节。

4,System.out与System.in

System.in:“标准”输入流。此流已打开并准备提供输入数据。通常,此流对应于键盘输入或者由主机环境或用户指定的另一个输入源。 返回类型为InputStream

System.out:“标准”输出流。此流已打开并准备接受输出数据。通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标。返回类型为PrintStream

package cn.itcast.io.p1.transstream.demo;
/*需求:将从键盘读取到的字符,转换成大写打印在控制台上。
*如果读取到 over 程序结束
*步骤:1,因为键盘录入只读取一个字节,要判断是否是over,需要将读取到的字节拼成字符串。
* 2,那就需要一个容器。StringBuilder.
* 3,在用户回车之前将录入的数据变成字符串判断即可。
* 4,把字符串转换成大写,将字符串转换成字节用打印流打印在控制台上
*/
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

public class TransStreamDemo {
public static void main(String[] args) throws IOException {

//字节流。
InputStream in = System.in;
//将字节转成字符的桥梁。转换流。
InputStreamReader isr = new InputStreamReader(in);
//字符流,缓冲区
BufferedReader bufr = new BufferedReader(isr);

OutputStream out = System.out;
OutputStreamWriter osw = new OutputStreamWriter(out);
BufferedWriter  bufw = new BufferedWriter(osw);
String line = null;
//循环读取键盘录入字符串
while((line=bufr.readLine())!=null){
if("over".equals(line))
break;
//把得到的字符转换成大写,并打印在控制台
bufw.write(line.toUpperCase());
//补充换行标记
bufw.newLine();
bufw.flush();
}
}
}

总结发现读取键盘录入可以简化为:new BufferedReader(new InputStreamReam(System.in));

打印到控制台的流操作简化为:new BufferedWriter(new OutputStreamWriter(System.out));

        小结:IO流操作文本文文件规律

1)文本文件 -- 文本文件

    BufferedReader br = new BufferedReader(new FileReader("a.txt"));

    BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));

2)文本文件 -- 控制台输出

    BufferedReader br = new BufferedReader(new FileReader("a.txt"));

    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

3)键盘录入 -- 文本文件

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));

4)键盘录入 -- 控制台输出

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

流的操作规律:

1,明确源和目的(汇)

     源:InputStream  Reader

     目的:OutputStream  Writer

2,明确数据是否是纯文本数据。

      源:是 纯文本:Reader

             否:InputStream

      目的:是 纯文本 Writer

                否:OutputStream

 到这里,就可以明确需求中具体要使用哪个体系。

3,明确具体的设备。

    源设备:

         硬盘:File

        键盘:System.in

        内存:数组

        网络:Socket流

  

 目的设备:

        硬盘:File

        控制台:System.out

        内存:数组

        网络:Socket流

4,是否需要其他额外功能。

         1),是否需要高效(缓冲区);   是,就加上buffer.

         2),转换。

总结:操作流的对象太多,具体应用时应注意以下几点:数据源和数据目的地,数据的内容是否是纯文本,具体设备,是否需要提高效率。只有这样才能在运用起来得心应手,事半功倍。

----------------------   ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  io流 黑马程序员