黑马程序员-----输入输出流及文件操作

来源:互联网 发布:手写数字识别软件 编辑:程序博客网 时间:2024/04/28 22:07

 

Java基础知识-----输入输出流及文件操作

http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训、期待与您交流

 

一、概述:

流(Stream)是输入输出设备的一种抽象表示。

Java中的流类基本上包含两大类:字节流(由java.io包的抽象类InputStream/OutputStream来统领,即大多数字节流类都是他们衍生出来的子类)和字符流(由java.io包的抽象类Reader/Writer来统领,即大多数字符流类都是他们衍生出来的子类)。字节流又称二进制流,字符流是双字节流,应为Unicode码是使用两个字节表示一个字符的。

字节流和字符流各自又分为输入流和输出流两个部分。

二、计算机中数据的I/O方向

1.流的概念

“流”的概念是1984年由C语言第一次引入的。“流”可以看做是一个流动的数据缓冲区,数据从数据源流向数据目的地。流的传送是串行的。最常见的数据源是键盘,最常见的数据目的地是屏幕。从键盘输入文本,文本字符通过内存流向屏幕,最终在屏幕上显示出来。

2.I/O流的方向

从软件角度观察,在Java程序设计语言中,一个可以读取字节序列的对象称为输入流(InputStream),一个可以写入字节序列的对象称为输出流(OutputStream)

从硬件角度观察,凡是从外部设备输入的流向中央处理器的数据,称为输入(Input)流;反之,称之为输出(Output)流。输入输出在计算机系统中起到了采集数据和提供数据处理结果的双重作用,它是以中央处理器为中心,以网络及外部设备为输入输出的双向数据传输机制。 

三、Java中的标准输入/输出类

操作系统通常定义了3个标准的流,按照标准I/O模型,Java提供了System.inSystem.outSystem.err,他们可以通过java.lang.System类的成员访问。System.outSystem.inSystem.err都是java.io.PrintStream的对象。

 案例:

1.程序的功能是实现键盘的输入输出流

package inputoutput;import java.io.*;import javax.management.*;public class BufferedSystemIn {/** * @param args * 程序的功能是实现键盘的输入输出流 *  */public static void main(String[] args) {//定义一个自带缓冲区的字符流输入对象BufferedReader  bfReader = null;try {//使用流的嵌套功能把键盘输入字节流转换成为字符流读入bfReader = new BufferedReader(new InputStreamReader(System.in));String str=null;//使用循环方式从键盘输入流中按照行的方式读取字节流while((str = bfReader.readLine())!=null){//如果输入的字符是over时结束循环if("over".equals(str))break;System.out.println(str);}} catch (Exception e) {//如在打开流的过程中发生异常在此处理throw new RuntimeException();}finally{//在结束或方式异常时关闭流对象try{//判断流是否打开,若打开则关闭,若没有打开则不存在关闭if(bfReader!=null)bfReader.close();}catch (Exception e) {//如果关闭流是出现异常在此处理throw new RuntimeException();}}}}

2.File是java.io包中的一个重要的非流类。File以一种系统无关的方式表达一个文件或目录名字,提供列举目录的方法,查询文件属性,重命名文件或删除文件。File描述了文件本身的属性。目录作为文件对象处理。File类中封装了对文件系统进行操作的功能。如果流类关心的是文件的内容,那么File类所关心的是文件在磁盘上的存储。

Package inputoutput;import java.io.*;public class FileView {/** * @param args * 对文件的操作 * 实现对目录文件中的文件通过循环的方式打印 */public static void main(String[] args) {File dir = new File("d:/");try {showFile(dir);} catch (Exception e) {throw new RuntimeException();}}public static void  showFile(File  file) throws  Exception{File[]  files = file.listFiles();for(int i=0;i<files.length;i++){if(files[i].isDirectory()){System.out.println(files[i]);showFile(files[i]);}elseSystem.out.println(files[i]);}}}

3.自定义输入输出流

   通过自定义输入流的方式,了解输入流的工作原理,从而更好的理解流的工作原理,方便日后开发。

package inputoutput;import java.io.*; import javax.management.RuntimeErrorException;public class MyBufferedReaderDemo { /** * @param args * @throws IOException  * 功能:模拟输入输出流的实现方式 */public static void main(String[] args) throws IOException {//实例化MyBufferReader对象MyBufferReader  mBufferReader = null;//输入输出流的异常处理try {//通过FileReader作为输入的嵌套得到输入对象mBufferReader = new MyBufferReader(new FileReader("d:/file.txt"));String str=null; //同过循环的方式对文件按行的方式读取文件内容while((str=mBufferReader.myreadLine())!=null){System.out.println(str);}} catch (FileNotFoundException e) {throw new RuntimeException();}finally{try{//关闭流对象if(mBufferReader!=null)mBufferReader.close();}catch(IOException e){throw  new RuntimeException();}}}}class MyBufferReader {/** * 功能:自定义的输入流对象实现流的输入读取功能 */FileReader fReader=null;public  MyBufferReader(FileReader  file){this.fReader=file;}public String myreadLine() throws IOException {int len=0;StringBuffer  sBuffer = new StringBuffer();while((len=fReader.read())!=-1){if(len=='\r')continue;if(len=='\n')return  sBuffer.toString();sBuffer.append((char)len);}if(len!=0)sBuffer.toString();return null;}public  void close() throws  IOException{  fReader.close();}}

0 0