关于java中的文件读写java io【复习1】
来源:互联网 发布:淘宝基础版不能设背景 编辑:程序博客网 时间:2024/06/03 19:57
原文一:点击打开链接
原文二:点击打开链接
java io体系介绍
Java语言的I/O库提供了四大等级结构:InputStream,OutputStream,Reader,Writer四个系列的类。
InputStream和OutputStream处理8位字节流数据;
Reader和Writer处理16位的字符流数据;
InputStream和Reader处理输入;
OutputStream和Writer处理输出。
为了方便比较这几种类型,顺便附上Java语言的I/O层次结构图:
Java语言的I/O层次结构图
下面的图表示:以InputStream和OutputStream形成的层次关系
下面的图表示:以Reader和Writer形成的层次关系:
体系解读:
Java IO体系结构看似庞大复杂,其实有规律可循,要弄清楚其结构,需要明白两点:
1. 其对称性质:InputStream 与 OutputStream, Reader 与 Writer,他们分别是一套字节输入-输出,字符输入-输出体系
2. 原始处理器(适配器:接收的是“流源对象”:String,byte数组等)与链接流处理器(装饰器:接收的是“流对象”:stream类)【具体是什么, 原文一 中有介绍】
a.基类:
InputStream和OutputStream是所有字节输入输出流的基抽象类,同时也是适配器(原始处理器)需要适配的对象,也是装饰器(链接流处理器)装饰对象的基类;
b.原始处理器
原始流处理器接收Byte数组对象,String对象,FileDescriptor对象将其适配成InputStream,以供其他装饰器使用,他们都继承自InputStream 包括如下几个:
ByteArrayInputStream: 接收Byte数组为流源,为多线程通信提供缓冲区操作功能
FileInputStream: 接收一个File作为流源,用于文件的读取
PipedInputStream: 接收一个PipedOutputStream,与PipedOutputStream配合作为管道使用
StringBufferInputStream: 接收一个String作为流的源(已弃用)
c. 链接流处理器
链接流处理器可以接收另一个流处理器(InputStream,包括链接流处理器和原始流处理器)作为源,并对其功能进行扩展,所以说他们是装饰器.
1) FilterInputStream继承自InputStream,是所有装饰器的父类,FilterInputStream内部也包含一个InputStream,这个InputStream就是被装饰类--一个原始流处理器,它包括如下几个子类:
BufferedInputStream: 用来将数据读入内存缓冲区,并从此缓冲区提供数据
DataInputStream: 提供基于多字节的读取方法,可以读取原始数据类型(Byte, Int, Long, Double等等)
LineNumberInputStream: 提供具有行计数功能的流处理器
PushbackInputStream: 提供已读取字节"推回"输入流的功能
2) ObjectInputStream: 可以将使用ObjectOutputStream写入的基本数据和对象进行反串行化
3) SequenceInputStream: 可以合并多个InputStream原始流,依次读取这些合并的原始流
对于OutputStream, Reader, Writer的体系结构也跟InputStream的结构类似
部分IO类的简介:
InputStream: 所有字节输入流的超类,这个类的父类是Object,且实现了Closeable(表明是可以关闭的数据源或目标);
FileInputStrean:继承InputStream,操作文件的,有三个构造方法:传入一个File对象,传入一个FileDescriptor对象,传入一个文件的路径;
FilterInputStream:是一个装饰器类,包含其他一些输入流,它将这些流作为基本数据源,它可以直接传输数据或提供一些额外的功能。
PipedInputStream:管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。通常,数据由某个线程从PipedInputStream
对象读取,并由其他线程将其写入到相应的 PipedOutputStream
。不建议对这两个对象尝试使用单个线程,因为这样可能死锁线程。
SequenceInputStream:按照顺序读取一个集合中所有的文件,从第一个开始读到该文件最后一个字节,然后继续读取下一个文件,直到将这个集合中所有的文件读取完;
StringBufferInputStream:已过时
ObjectInputStream:对对象反序列化。例如,某个对象实现了Serializable,表明这个对象可以被序列化,然后我们使用ObjectOutputStream将这个对象进行序列化,之后我们就可以使用ObjectInputStream将这个对象再还原回来(反序列化)。
BufferdInputStream:为另一个输入流添加一些功能,即缓冲输入以及支持 mark
和reset
方法的能力。
PushBackInputStream:为另一个输入流添加性能,即“推回 (push back)”或“取消读取 (unread)”一个字节的能力。
LineNumberInputStream:已过时 ,提供跟踪当前行号的附加功能。
DataInputStream:可以读取JAVA的基本数据类型,int,float。boolean都可以,但是对文件就不可以了。
其他的都类似,比如对于OutputSteeam。与InputStrean相比较,,一个是字节输出流,一个是字节输入流。
file(内存)----输入流---->【程序】----输出流---->file(内存)
当我们读写文本文件的时候,采用Reader是非常方便的,比如FileReader,InputStreamReader和BufferedReader。其中最重要的类是InputStreamReader, 它是字节转换为字符的桥梁。你可以在构造器重指定编码的方式,如果不指定的话将采用底层操作系统的默认编码方式,例如GBK等。使用FileReader读取文件:
public class FileTest01 {/* * 使用FileReader读取文件 */public static void main(String[] args) throws IOException {File file = new File("E:/data.txt");FileReader fr = new FileReader(file);char ch;System.out.println();while (fr.read() != -1) {ch = (char) fr.read();System.out.println(ch);}fr.close();}}
其中read()方法返回的是读取得下个字符。当然你也可以使用read(char[] ch,int off,int length)这和处理二进制文件的时候类似。
事实上在FileReader中的方法都是从InputStreamReader中继承过来的。read()方法是比较好费时间的,如果为了提高效率我们可以使用BufferedReader对Reader进行包装,这样可以提高读取得速度,我们可以一行一行的读取文本,使用readLine()方法。
使用BufferedReader读取文件:
public class FileTest02 {public static void main(String[] args) throws IOException {/* * 使用BufferdReader进行读取文件操作 */File file = new File("E:/data.txt");/* * 第一种 */BufferedReader br1 =new BufferedReader(new FileReader(file));while((br1.readLine() != null)){ System.out.println(br1.readLine());}/* * 第二种 */BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));while(br.readLine()!=null){System.out.println(br.readLine());}}}这个程序的运行结果会有点小问题,可以参考:点击打开链接
我写了两种,都能读取出来。 不知道这两个有什么区别??【等有结果了在更新】
了解了FileReader操作使用FileWriter写文件就简单了,这里不赘述。
综合实例:
public class FileTest03 {public static void main(String[] args) throws Exception {//创建一个文件File file = new File("E:/data.txt");file.createNewFile();//向文件中写入内容FileWriter fw = new FileWriter(file);BufferedWriter bw = new BufferedWriter(fw);String str = "迷人的大狼狗";bw.write(str);bw.close();//从文件中读取内容FileReader fr = new FileReader(file);BufferedReader br = new BufferedReader(fr);String val = null;while((val = br.readLine()) != null){System.out.print(val);}br.close();}}
未完待续.......
- 关于java中的文件读写java io【复习1】
- 关于java中的读写文件
- java中关于IO文件读写
- JAVA IO读写文件
- Java IO 读写文件
- JAVA-IO读写文件
- java IO读写文件
- Java IO 读写文件
- Java IO 读写文件
- Java IO文件读写
- java文件IO流复习
- JAVA复习笔记--------文件IO
- 关于java中的文件读写操作
- java io流读写文件
- java文件读写(IO)
- java IO流读写文件
- Java IO 之文件读写
- JAVA IO 简单读写文件
- C#操作EXCEL
- python中文件读取操作及注意事项
- Android平台dalvik模式下java Hook框架ddi的分析(1)
- 我的CV路
- ActivityManager框架之简要
- 关于java中的文件读写java io【复习1】
- RecyclerView 的简单使用
- HDU4325-Flowers
- 【Linux基础系列之】同步机制介绍
- python之read和tell 和SEEK_SET、SEEK_CUR、SEEK_END
- Linux Shell脚本之利用mysqldump备份MySQL数据库(详细注解)
- java与javac版本不一致问题
- Windows操作系统下安装MAC OS系统虚拟机
- nginx+keepalived实现高可用