javaIO流-1

来源:互联网 发布:法院网络司法拍卖 编辑:程序博客网 时间:2024/05/18 01:19


IO(Input Output)流

 

概述

IO流用来处理设备之间的数据传输, Java对数据的操作是通过流的方式, Java用于操作流的对象都在IO包中。

 

结构

             流按流向分为:输入流,输出流。

             流按操作数据分为两种:字节流与字符流。

             字节流:InputStream,OutputStream  字符流:Reader,Writer

 

     InputStream:字节输入流的所有类的超类

          ByteArrayInputStream:含缓冲数组,读取内存中字节数组的数据,未涉及流

          FileInputStream:从文件中获取输入字节。媒体文件

          BufferedInputStream:带有缓冲区的字节输入流

          DataInputStream:数据输入流,读取基本数据类型的数据

          ObjectInputStream:用于读取对象的输入流

          PipedInputStream:管道流,线程间通信,与PipedOutputStream配合使用

          SequenceInputStream:合并流,将多个输入流逻辑串联

 

     OutputStream:此抽象类是表示输出字节流的所有类的超类

          ByteArrayOutputStream:含缓冲数组,将数据写入内存中的字节数组,未涉及流

          FileOutStream:文件输出流,将数据写入文件

          BufferedOutputStream:带有缓冲区的字节输出流

          PrintStream:打印流,作为输出打印

          DataOutputStream:数据输出流,写入基本数据类型的数据

          ObjectOutputStream:用于写入对象的输出流

          PipedOutputStream:管道流,线程间通信,与PipedInputStream配合使用

 

     Reader:读取字符流的抽象类

          BufferedReader:将字符存入缓冲区,再读取

          LineNumberReader:带行号的字符缓冲输入流

          InputStreamReader:转换流,字节流和字符流的桥梁,多在编码的地方使用

          FileReader:读取字符文件的便捷类。

 

     Writer:写入字符流的抽象类

          BufferedWriter:将字符存入缓冲区,再写入

          OutputStreamWriter:转换流,字节流和字符流的桥梁,多在编码的地方使用

          FileWriter:写入字符文件的便捷类。

IO异常处理方式

                   1.try的外边建立引用,在try内进行初始化

                   2.finally里要定义.closs()方法,一定执行关闭流

                   3.要对.close()判断流不等于空

字符流基本操作数据的对象

文件的续写

FileWriter(String filename,boolean append):根据给定的文件名以及指示是否附加写入数据的boolean值来构造FileWriter对象。append:一个boolean值,如果为true,则将数据写入文件末尾处,而不是写入文件开始处。

注意:在Windows中回车符是由两个字符来表示,\r\n

文本文件读取方式一

示例:读取单个字符

FileReader fr = new FileReader(“demo.txt”);//这里会出现:FileNotFoundException文件没找到异常。Int ch = 0;While((ch = fr.read())!=-1){//如果没有读到最后一个System.out.println((char)ch);//需要强转}fr.close();

文本文件读取方式二

示例:通过字符数组进行读取

FileReader fr = new FileReader(“demo.txt”);char[] buf = new char[1024];//一般缓冲区设置为1024的整数倍Int len = 0;While((len = fr.read(buf))!=-1){System.out.print(new String(buf,0,len));}fr.close();

拷贝文本文件

方式一:读取一个字符就写一个字符,这个方法很慢。

示例:

FileWriter fw = new FileWriter(“demo_copy.txt”);//创建目的地FileReader fr = new FileReader(“demo.txt”);//与已有文件关联int ch = 0;while((ch = fr.read())!=-1){fw.write(ch);}fw.close();fr.close();

方式二:先存起来在一起读出来。

示例:

FileWriter fw = null;FileReader fr = null;try{fw = new FileWriter("SystemDemo_copy.txt");fr = new FileReader("SystemDemo.java");char[] buf = new char[1024];int len = 0;while((len=fr.read(buf))!=-1){fw.write(buf,0,len);}}catch (IOException e){throw new RuntimeException("读写失败");}finally{if(fr!=null)try{fr.close();}catch (IOException e){}if(fw!=null)try{fw.close();}catch (IOException e){}}

字符流缓冲区

缓冲区的出现提高了对数据的读写效率,缓冲区要结合流才可以使用,它是在流的基础上对流的功能进行了增强。

            BufferWriter:写入流缓冲区。该缓冲区提供了一个跨平台的换行符:newLine()

            BufferReader:读取流缓冲区。该缓冲区提供一个一次读一行的方法:readLine,方便对文本数据的获取。当返回null时读到文件末尾。

通过缓冲区复制文本文件

示例:

/*通过缓冲区复制一个.java文件。*/import java.io.*;class  CopyTextByBuf{public static void main(String[] args) {BufferedReader bufr = null;BufferedWriter bufw = null;try{bufr = new BufferedReader(new FileReader("BufferedWriterDemo.java"));bufw = new BufferedWriter(new FileWriter("bufWriter_Copy.txt"));String line = null;while((line=bufr.readLine())!=null){bufw.write(line);bufw.newLine();bufw.flush();}}catch (IOException e){throw new RuntimeException("读写失败");}finally{try{if(bufr!=null)bufr.close();}catch (IOException e){throw new RuntimeException("读取关闭失败");}try{if(bufw!=null)bufw.close();}catch (IOException e){throw new RuntimeException("写入关闭失败");}}}}

装饰设计模式

当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。那么自定义的该类称为装饰类。

 

装饰与继承的区别

装饰模式比继承要灵活。避免了继承体系臃肿,而且降低了类于类之间的关系。

装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。

所以装饰类和被装饰类通常是都属于一个体系中的。

LineNumberReader:是BufferedReader的子类。跟踪行号的缓冲字符输入流。

.getLineNumber():获取行号。

字节流基本操作数据的对象

操作数据

           FileOutputStream:写入字节数据。如果没有指定缓冲区,它可以不用刷新的,但还是要关资源。

           FileIntputStream:读取字节数据。与字符流一样有两种方式。

           int available();返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。作用:可以定义一个刚刚好的缓冲区:byte[] buf = new byte[.available()];不用在循环了。

注意:这种方法容易内存溢出异常,所以要慎用。

复制一个图片

示例:

/*思路:1,用字节读取流对象和图片关联。2,用字节写入流对象创建一个图片文件。用于存储获取到的图片数据。3,通过循环读写,完成数据的存储。4,关闭资源。*/import java.io.*;class  CopyPic{public static void main(String[] args) {FileOutputStream fos = null;FileInputStream fis = null;try{fos = new FileOutputStream("c:\\2.bmp");fis = new FileInputStream("c:\\1.bmp");byte[] buf = new byte[1024];int len = 0;while((len=fis.read(buf))!=-1){fos.write(buf,0,len);}}catch (IOException e){throw new RuntimeException("复制文件失败");}finally{try{if(fis!=null)fis.close();}catch (IOException e){throw new RuntimeException("读取关闭失败");}try{if(fos!=null)fos.close();}catch (IOException e){throw new RuntimeException("写入关闭失败");}}}}

字节流缓冲区

复制mp3文件

示例:通过缓冲区来复制

import java.io.*;class  CopyMp3{public static void main(String[] args) throws IOException{long start = System.currentTimeMillis();//查看拷贝时间copy_1();long end = System.currentTimeMillis();System.out.println((end-start)+"毫秒");}//通过字节流的缓冲区完成复制。public static void copy_1()throws IOException{BufferedInputStream bufis = new BufferedInputStream(new FileInputStream("c:\\0.mp3"));BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("c:\\1.mp3"));int by = 0;while((by=bufis.read())!=-1){bufos.write(by);}bufos.close();bufis.close();}}

转换流:将字节转换为字符,可通过相应的编码表获得

                                   转换流都涉及到字节流和编码表

读取键盘录入

InputStream in = System.in;

读取转换流

InputStreamReader:是字节流通向字符流的桥梁。

BufferedReader buf = new BufferedReader(newInputStreamReader(System.in));//定义一个键盘输入流

写入转换流

OutputStreamReader:是字符流通向字节流的桥梁。

BufferedWriter buf = new BufferedWriter(new OutputStreamReader(System.out));

流操作规律:

     明确源和目的:

          数据源:读取,InputStreamReader

          目的:写入:OutputStreamWriter

     数据是否是纯文本:

          是:字符流,ReaderWriter

          否:字节流,InputStreamOutStream

     明确数据设备:也是明确要操作的对象

          源设备:内存、硬盘、键盘(System.in)

          目的设备:内存、硬盘、控制台

     是否提高效率:用BufferedXXX

     是否需要指定编码表:转换流

           OutputStreamWriter(OutputStream out,String charsetName)

             InputStreamReader(InputStream in,String charsetName)

System类其他操作

改变标准输入输出设备,在System类中

setIn(InputStream in):重新分配标准输入流。setOut(PrintStream out): 重新分配标准输出流。

异常的日志信息

把异常信息存到文件里

示例:

import java.io.*;import java.util.*;import java.text.*;class  ExceptionInfo{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.log");ps.println(s);System.setOut(ps);}catch (IOException ex){throw new RuntimeException("日志文件创建失败");}e.printStackTrace(System.out);}}}

系统信息

示例:

import java.util.*;import java.io.*;class  SystemInfo{public static void main(String[] args) throws IOException{Properties prop = System.getProperties();prop.list(new PrintStream("sysinfo.txt"));}}


 

总结:

     缓存技术的最终原理就是这个对象里面封装了数组,缓冲区的关闭其实是关闭缓冲区的流对象。

      readLine方法返回的时候只返回回车符之前的数据内容,并不返回回车符。

       装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。

       不可以用字符流操作媒体文件,字符流只用来处理文字数据。

       需要明确编码表就要用转换流。

0 0
原创粉丝点击