JAVA基础之IO流
来源:互联网 发布:edg网络黄金 编辑:程序博客网 时间:2024/05/01 00:21
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、一旦操作文本涉及到具体的指定编码表时,必须使用转换流。
- java基础之 IO流
- Java基础之IO流
- Java基础之IO流
- Java基础之IO流
- Java基础之IO流
- JAVA基础之IO流
- java基础之IO流
- java基础之io流
- java基础之io流
- Java基础之IO流
- java基础之IO流
- Java基础之IO流
- Java基础之IO流
- java基础之io
- java基础之IO
- java基础之IO
- java基础之IO
- Java基础之IO
- Linux下Nagios的安装与配置
- 启动第二个Activity
- Android基础之HttpUrlConnection小案例
- Postgres数据库的进程结构---菜鸟的PG分析之路
- 学习CSS(7)
- JAVA基础之IO流
- 通过“分布式系统的8大谬误”反思APP的设计 第二篇 谬误2:网络没有时延
- Shiro源码分析之两种Session的方式
- eclipse git 插件集成与本地使用(傻瓜教程 一)
- 给部分培训学生的建议
- iOS中UITableview实现跨区域拖动效果的实现
- 产生一个随机序列
- 个人整理--OC中的数组
- 图的邻接表表示法及深度搜索与广度搜索