十八、Java基础--------IO流体系以及字符流
在上一章节中详细介绍集合框架的相关知识,在接下来的几篇文章中将讲述Java中另一个及其重要的知识——IO流,本文主要是讲述IO流的一些基本概念以及字符流的相关应用。
IO流
介绍IO流之前先介绍一下什么是IO,IO是input、output的简称,所以所谓的IO流也就是输入输出流,明白了这一点对后面的学习有很大的促进作用。
流向分类
正如干电池有正极与负极一样,流也有方向的区别,我们常用的分类是按照流的流向进行分类, "流"向当前程序的流成为输入流也就是I的一端,"流"出当前程序的流成为输出流也就是O的一端,有了这个概念,我们便将IO流分为输入流和输出流。
流的基类
我们按照操作对象的不同将流分为两大门派,一派是操作字符数据的我们称之为字符流,操作字节的一派我们称之为字节流。体系结构如下:
字符流:Reader、Writer
字节流:InputStream、OutputStream
字节流:处理字节数据的流对象。我们熟知的设备上的数据无论是图片或者视频,文字,它们都以二进制存储的。二进制的最终都是以一个8位为数据单元进行体现,所以计算机中的最小数据单元就是字节。也就是说,字节流可以处理设备上的所有数据,所以字节流一样可以处理字符数据。
字符流:在中文平台的计算机上存储数据的编码是GBK,国标是unicode所以在互相转化时就会出现乱码,因此需要在获取中文字节数据的同时指定编码表才可以正确的解析数据。为了方便操作,所以将字节流和编码封装成对象,这个对象就是字符流。
需要特别指出的是,上述四个类别两个门派作为基本有一个特点,就是其子类都是以父类的名字结尾,这样就极大的方便我们去掌握,比如InputStream的子类FileInputStream;Writer的子类FileWriter.
字符流
抽象基类:
|--Reader:字符输入流
|--Writer:字符输出流
FileWriter
FileWriter是Writer的一个子类(而且是OutputStreamWriter的子类),用来写入字符文件的便捷子类
构造方法:
|--FileWriter(File file)
根据给定的 File 对象构造一个 FileWriter 对象。
|--FileWriter(File file, boolean append)
根据给定的 File对象构造一个 FileWriter 对象。
|--FileWriter(FileDescriptor fd)
构造与某个文件描述符相关联的 FileWriter 对象。
|--FileWriter(String fileName)
根据给定的文件名构造一个 FileWriter 对象。
|--FileWriter(String fileName, boolean append)
根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。
可以实现文件的追加写入,第二个参数表示是否追加写入,默认是false,就会重头开始写入,如果是true,就会追加写入
常用方法:
|--void write(String str):写入字符串。
|--abstract void flush():刷新该流的缓冲
|--abstract void close():关闭此流,但要先刷新它。
应用示范
1、FileWriter的使用范例
新建文件,并在文件中写入字符
import java.io.FileWriter;
import java.io.IOException;
public class Demo2 {
public static void main(String[] args) throws IOException {
//创建流对象,建立数据存放文件,指定目录和文件名
FileWriter f=new FileWriter("E:/aa.txt");
//调用FilterWriter的writer(String s)方法,向新建的文件中输出指定字符
f.write("我是 FileWriter创建的文件");
//刷新字符流中的数据,如果不刷新且不关闭流对象会出现空文件的现象
f.flush();
//关闭流对象,回收流资源,关闭流对象后流对象将无法使用,这与flush有着重大区别
f.close();
}
}
2、在已有的文件结尾添加字符,其实只需改动一处
FileWriter f=new FileWriter("E:/aa.txt",true);
其他部分内容相同
FileReader
FileReader是Reader的一个子类(是InputStreamReader的直接子类),用来读取字符文件的便捷类
构造方法:
|--FileReader(File file)
在给定从中读取数据的 File 的情况下创建一个新 FileReader。
|--FileReader(FileDescriptor fd)
在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader。
|--FileReader(String fileName)
在给定从中读取数据的文件名的情况下创建一个新 FileReader。
两种读取方法:
|--int read():读取单个字符。
|--int read(char[] cbuf):将字符读入数组。
应用示范
1、 read()
import java.io.FileReader;
import java.io.IOException;
public class Demo2 {
public static void main(String[] args) throws IOException {
//第一种方式read();
FileReader fr = new FileReader("E:/aa.txt");
//创建一个文件读取流对象,和指定名称的文件相关联。
//要保证该文件是已经存在的,如果不存在,会发生异常FileNotFoundException
int ch = 0;
while((ch = fr.read())!=-1){
System.out.print((char)ch);
}
fr.close();
}
}
第二中方式read(char[])
import java.io.FileReader;
import java.io.IOException;
public class Demo2 {
public static void main(String[] args) throws IOException {
//第二种方式read(char[]);
FileReader fr = new FileReader("E:/aa.txt");
int i = 0;
char[] ch2 = new char[1024];
while((i = fr.read(ch2))!=-1){
System.out.print(new String(ch2,0,i));
}
fr.close();
}
}
在上面介绍了基类Writer以及Reader的基本用法,不管是Writer还是Reader上面的用法有一个缺陷就是效率低,为了提高效率我们需要学习下面的内容——字符流缓冲区
字符流缓冲区
字符流缓冲区的出现就是为了提高对数据的读写效率,在流的基础上对功能进行增强,这里涉及一种设计模式——装饰设计模式,关于常见的设计模式在后面的文章中会有专题进行介绍这里不再详解。
常见缓冲区对应的类
BufferedWriter(? Extends Writer)
BufferedReader(? Extends Reader)
BufferedWriter
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。该缓冲区中提供了一个跨平台的换行符:newLine();
本类方法(全部方法返回类型void):
|--close():关闭此流,但要先刷新它。
|--flush():刷新该流的缓冲。
|--newLine():写入一个行分隔符。 可跨平台使用
|--write(char[] cbuf, int off, int len):写入字符数组的某一部分。
|--write(int c):写入单个字符。
|--write(String s, int off, int len):写入字符串的某一部分。
使用示范
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class Demo2 {
public static void main(String[] args) throws IOException {
//创建一个字符写入流对象。
FileWriter fw = new FileWriter("E:/aa.txt");
//为了提高字符写入流效率。加入了缓冲技术。
//只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可。
BufferedWriter bufw = new BufferedWriter(fw);
for(int x=1; x<5; x++){
bufw.write("第"+x+"次写入");
bufw.newLine();
bufw.flush();//只要用到缓冲区,就要记得刷新。
}
//其实关闭缓冲区,就是在关闭缓冲区中的流对象。
bufw.close();
}
}
BufferedReader
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
该缓冲区提供了一个一次读一行的方法 readLine(),方便于对文本数据的获取。当返回null时,表示读到文件末尾。(注:readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。)
常用方法:
|--void close():关闭该流并释放与之关联的所有资源。
|--int read():读取单个字符。
|--int read(char[] cbuf, int off, int len):将字符读入数组的某一部分。
|--String readLine():读取一个文本行。
使用范例
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Demo2 {
public static void main(String[] args) throws IOException {
//创建一个读取流对象和文件相关联。
FileReader fr = new FileReader("E:/aa.txt");
//为了提高效率。加入缓冲技术。将字符读取流对象作为参数传递给缓冲对象的构造函数。
BufferedReader bufr = new BufferedReader(fr);
String line = null;//定义一个用作临时存储数据的变量
while((line=bufr.readLine())!=null)//返回值不为null就一直循环
{
System.out.print(line);
}
bufr.close();
}
}
十八、Java基础--------IO流体系以及字符流的更多相关文章
- 二十、Java基础--------IO流之其他对象
在上面两篇文章中介绍了IO体系并详细介绍了字节流以及字符流,本文主要是讲述操作文件的File.转化流.标准输入与输出.Properties.打印流以及序列流. File File英文为"文件 ...
- Java从零开始学三十八(JAVA IO- 重定向IO)
一.三个静态变量 java.lang.System提供了三个静态变量 System.in(默认键盘) System.out(默认显示器) System.err 二.重写向方法 System提供了三个重 ...
- Java基础IO类之字节数组流
package IODemo; //字节数组流 :内部维护这着一个字节数组,我们可以利用流的读取机制来处理字符串 无需关闭,不会报IO异常 // ByteArrayInputstream ByteAr ...
- java基础-IO流对象之Properties集合
java基础-IO流对象之Properties集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Properties集合的特点 Properties类表示了一个持久的属性集. ...
- Java基础-IO流对象之字符类(FileWrite与FileReader)
Java基础-IO流对象之字符类(FileWrite与FileReader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常见编码简介 1>ASCII 我们知道计算机是 ...
- Java基础学习总结(13)——流IO
一.JAVA流式输入/输出原理 流是用来读写数据的,java有一个类叫File,它封装的是文件的文件名,只是内存里面的一个对象,真正的文件是在硬盘上的一块空间,在这个文件里面存放着各种各样的数据,我们 ...
- Java实习生常规技术面试题每日十题Java基础(八)
目录 1.解释内存中的栈(stack).堆(heap)和静态区(static area)的用法. 2.怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串? 3.运行时异常与受检异常有 ...
- java基础IO流综合加习题
IO流初学者在学习时都有一点迷糊,今天我们就讲讲IO流,希望通过讲解可以帮助大家 IO流分为字节流,字符流,缓冲流.我们只要记住这三个就可以了. 1*字节流有:字节输入流(FileInputStrea ...
- Java基础---IO(一)---IO流概述、字符流、字节流、流操作规律
第一讲 IO概述 概述 1.IO流:即InputOutput的缩写. 2.特点: 1)IO流用来处理设备间的数据传输. 2)Java对数据的操作是通过流的方式. 3)Java用于操作流的对象都 ...
随机推荐
- jsp实现过滤器的简单例子
web.xml配置如下: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns=&quo ...
- LaTeX算法排版
需要包含的 \usepackage[noend]{algpseudocode} \usepackage{algorithmicx,algorithm} 源码 \begin{algorithm}[t]\ ...
- spark reduce类操作
reduce类函数分析: ---------------------------------------------------------------------------- 待补全 ------ ...
- Linux常用命令(持续更新)
lsb_release -a 查看linux操作系统信息 getconf LONG_BIT 查看linux操作系统位数 useradd [-g groupname] username 创建用户,并指定 ...
- for memory long term update
xargs是一条Unix和类Unix操作系统的常用命令.它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题. #例如,下面的命令: rm `find /path -type f ...
- Socket客户端/服务端简单实例
1.client端 package demo.socket; import java.io.BufferedReader;import java.io.IOException;import java. ...
- Java序列化机制
java的序列化机制支持将对象序列化为本地文件或者通过网络传输至别处, 而反序列化则可以读取流中的数据, 并将其转换为java对象. 被序列化的类需要实现Serializable接口, 使用Objec ...
- 解决安装sql server 需要重启问题
解决办法: 一.在SQL服务器的安装盘中找到MSDE这个目录,并且点击setup.exe安装它. 二.安装完毕后,重启系统WINDOWSXP,这下就可以看到SQL服务的图标出现了. 三.再直接安装根目 ...
- BizTalk动手实验(五)Map开发测试
1 课程简介 通过本课程熟悉Map的相关开发与测试技术 2 准备工作 熟悉XML.XML Schema.XSLT等相关XML开发技术 新建BizTalk空项目 演示 3.1 基本操作 打开MapDev ...
- BizTalk开发系列(三十四) Xpath
XPath 是在 XML 文档中查找信息的语言,在BizTalk的开发中应用非常广泛,当然你可以不必先学Xpath再去学BizTalk.但是如果对Xpath有一定了解的 话,在很多应用下会使你的开发更 ...