JAVA基础之IO流

来源:互联网 发布:edg网络黄金 编辑:程序博客网 时间:2024/05/01 00:21


IO流:用来处理设备间的数据传输;流只能操作数据,不能操作文件。

IO流分为一个是输入流和输出流,输入和输出是相对于内存而言的,将数据从外设设备写到内存用输入流,将数据从内存写到硬盘中用输出流。

按照操作数据又可分为字符流和字节流。他们之间的关系是,字符流是编码表加字节流。字节流除了可以操作字符外,还可以操作其他媒体文件。

IO体系有一个明显的特点,就是每个子类的后缀名都是所属体系的父类的名称,因此可以很容易区分所属体系。并且,每个子类前缀名是该子类的功能体系。

字节流的抽象基类是OutputStreamInputStream;

其常用子类有:FileInputStreamFileOutputStream

字符流的抽象基类是ReaderWriter

常用的子类为:FileReaderFileWriter

下面是视频中所讲的,使用IO流的技巧:

使用IO流进行数据操作前,要知道将要操作的源数据是否是纯文本,如果操作的数据源是纯文本,那么流就选择Reader,即字符流;如果操作的数据源不是纯文本,那么选择InputStream,即字节流;

同样的,如果数据目的地是纯文本,那么选择Writer,即字符流,反之则使用OutputSteam,即字节流。

接下来,要明确具体的设备,即数据源是从哪个设备来的,这个分为几种情况:

(1).来自于硬盘,那么用File

(2).来自于键盘,用Sysem.in

(3).来自于内存,用数组;

(4).来自于网路,用socket流;

目的地的原理也是一样,只不过把键盘的System.in改成System.out

之后,完成上面两步之后,还要考虑是否需要额外功能,例如:

1.是否需要转换?如果需要,就要用到转换流InputStreamReaderOutputStreamWriter.

2.是否需要高效?如果需要,就要用到缓冲区Buffered.

下面举两个例子:

需求:复制一个文本文件

1.   明确体系

源:InputStream,Reader

目的:OutputStream,Writer

2.   明确数据:

源:是纯文本吗?是。用Reader

目的:是纯文本吗?是,用Writer

3.   明确设备

源:硬盘上的文件。用FileReader

目的:硬盘上的文件。用FileWriter

4.   需要额外功能吗?

需要,需要高效复制,那么用Buffered.

BufferedReader bufr=new BufferedReader(newFileReader(“test.txt”));

BufferedWriter bufw=new BufferedWriter(newFileWriter(“testcopy.text”));

需求二:读取键盘录入的数据,并将该数据存储到硬盘上的文件中。

1.   明确体系

源:InputStream,Reader

目的:OutputStream,Writer

2.   明确数据

源:是纯文本吗?是,用Reader;

目的:是纯文本吗?是,用Writer

3.   明确设备

源:键盘,System.in

目的:硬盘:FileWriter

InputStream in =System.in;

FileWriter fw=new FileWriter(“haha.txt”);

4.   需要额外功能吗?

需要,因为明确的体系是Reader,可是源设备是System.in

      因此需要将源转成字符流,需要用到转换流,InputStreamReader

InputStreamReader isr=new InputStreamReader(System.in);

需要高效吗?需要,用到缓冲流,Buffer

BufferedReader bufr=new BufferedReader(newInputStreamReader(System.in));

BufferedWriter bufw=new BufferedWriter(newFileWriter(“haha.txt”));

下面是一个完整的例子:



其他知识点总结:

1.FileWriter当文件不存在时会自动创建,当文件存在时,则会覆盖;

2.FileWriter如果在构造函数中加上true,便能实现对文件的续写;

3.FileReader读取文件时,程序如下:(记住时read,不是readLine

方法一: int ch=0;

 while((ch=fr.read())!=-1){System.out.println((char)ch); }

 fr.close();

方法二:

char[] buf=newchar[3];

int len=0;

while((len=fr.read(buf))!=-1){

 System.out.println(new String(buf,0,len));

}

fr.close();

4.用字节流(FileInputStream)读取文件:

 FileInputStreamfis=new FileInputStream("bytedemo.txt");

 byte[] buf=new byte[1024];

 intlen=0;

 while((len=fis.read(buf))!=-1)

{

  System.out.println(new String(buf,0,len));//写就换成fos.write(buf,0,len);

}

5.FileOutputStreamFileInputStreamflush方法内容为空,没有任何实现,调用没有意义。

6使用缓冲区:提高效率,写入换行用newLine();读取一行数据用readLine();

 用缓冲区读数据程序:

  BufferReaderbufr=new BufferedReader(fr);

  String line=null;

while(line=bufr.readLine()!=-1)

{

  System.out.println(line);

}

bufr.close();

bufr.read():这个read方法是从缓冲区读取字符数据,所以覆盖了父类中的read方法;

bufr.readLine():另外开辟了一个缓冲区,存储的是原缓冲区的一行数据,不包含换行符;

原理:使用了读取缓冲区的read方法,将读取到的字符进行缓冲并判断换行标记,将标记前的缓冲数据变成字符串范围。

7、装饰设计模式:对原有类进行功能的改变,增强。跟继承功能相同,但是比继承更灵活。

 特点:装饰类和被装饰类都必须所属同一个接口。

8.转换流:字节流和字符流之间的桥梁

应用:字节流中的数据都是字符时,转成字符流更加高效;

转换流有两种:InputStreamReader:字节到字符的桥梁,解码;

             OutputStreamWriter:字符到字节的桥梁,编码;

举例:

什么时候使用转换流呢?

1、源或者目的对应的设备是字节流,但是操作的却是文本数据,可以使用转换作为桥梁,提高对文本操作的便捷。

2、一旦操作文本涉及到具体的指定编码表时,必须使用转换流。


    



 





0 0
原创粉丝点击