JAVA基础之IO流
2015-07-23 22:03
363 查看
IO流:用来处理设备间的数据传输;流只能操作数据,不能操作文件。
IO流分为一个是输入流和输出流,输入和输出是相对于内存而言的,将数据从外设设备写到内存用输入流,将数据从内存写到硬盘中用输出流。
按照操作数据又可分为字符流和字节流。他们之间的关系是,字符流是编码表加字节流。字节流除了可以操作字符外,还可以操作其他媒体文件。
IO体系有一个明显的特点,就是每个子类的后缀名都是所属体系的父类的名称,因此可以很容易区分所属体系。并且,每个子类前缀名是该子类的功能体系。
字节流的抽象基类是OutputStream和InputStream;
其常用子类有:FileInputStream和FileOutputStream;
字符流的抽象基类是Reader和Writer;
常用的子类为:FileReader和FileWriter;
下面是视频中所讲的,使用IO流的技巧:
使用IO流进行数据操作前,要知道将要操作的源数据是否是纯文本,如果操作的数据源是纯文本,那么流就选择Reader,即字符流;如果操作的数据源不是纯文本,那么选择InputStream,即字节流;
同样的,如果数据目的地是纯文本,那么选择Writer,即字符流,反之则使用OutputSteam,即字节流。
接下来,要明确具体的设备,即数据源是从哪个设备来的,这个分为几种情况:
(1).来自于硬盘,那么用File;
(2).来自于键盘,用Sysem.in;
(3).来自于内存,用数组;
(4).来自于网路,用socket流;
目的地的原理也是一样,只不过把键盘的System.in改成System.out。
之后,完成上面两步之后,还要考虑是否需要额外功能,例如:
1.是否需要转换?如果需要,就要用到转换流InputStreamReader和OutputStreamWriter.
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.FileOutputStream、FileInputStream的flush方法内容为空,没有任何实现,调用没有意义。
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、一旦操作文本涉及到具体的指定编码表时,必须使用转换流。
IO流分为一个是输入流和输出流,输入和输出是相对于内存而言的,将数据从外设设备写到内存用输入流,将数据从内存写到硬盘中用输出流。
按照操作数据又可分为字符流和字节流。他们之间的关系是,字符流是编码表加字节流。字节流除了可以操作字符外,还可以操作其他媒体文件。
IO体系有一个明显的特点,就是每个子类的后缀名都是所属体系的父类的名称,因此可以很容易区分所属体系。并且,每个子类前缀名是该子类的功能体系。
字节流的抽象基类是OutputStream和InputStream;
其常用子类有:FileInputStream和FileOutputStream;
字符流的抽象基类是Reader和Writer;
常用的子类为:FileReader和FileWriter;
下面是视频中所讲的,使用IO流的技巧:
使用IO流进行数据操作前,要知道将要操作的源数据是否是纯文本,如果操作的数据源是纯文本,那么流就选择Reader,即字符流;如果操作的数据源不是纯文本,那么选择InputStream,即字节流;
同样的,如果数据目的地是纯文本,那么选择Writer,即字符流,反之则使用OutputSteam,即字节流。
接下来,要明确具体的设备,即数据源是从哪个设备来的,这个分为几种情况:
(1).来自于硬盘,那么用File;
(2).来自于键盘,用Sysem.in;
(3).来自于内存,用数组;
(4).来自于网路,用socket流;
目的地的原理也是一样,只不过把键盘的System.in改成System.out。
之后,完成上面两步之后,还要考虑是否需要额外功能,例如:
1.是否需要转换?如果需要,就要用到转换流InputStreamReader和OutputStreamWriter.
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.FileOutputStream、FileInputStream的flush方法内容为空,没有任何实现,调用没有意义。
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、一旦操作文本涉及到具体的指定编码表时,必须使用转换流。
相关文章推荐
- Java容器类
- java中Class.forName与new
- Java注解(一)
- 在eclipse的配置文件里指定jdk路径
- Dom4j初步封装
- 切点表达式无法识别
- Java 堆内存模型
- java拾遗4----一个简单java程序的运行全过程
- 编写使用SpringSecurity的JUnit测试提醒
- 深入理解JAVA虚拟机笔记 - 04
- this关键字 #Java#
- Java基础之接口、内部类
- Spring(六)使用构造器装配属性
- Day20 Java使用Socket发送文件
- java中的集合类
- Java Iterator和增强for循环 for each详解
- 如何利用MyEclipse将Java工程导出jar包
- JavaBean的一个小例子
- 2015第30周四Java日志组件
- Java练习题(一)