黑马程序员——IO流1

---------------------- 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

 

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值