Java IO流详细总结

时间:2024.5.8

I/O流(输入/输出流)

一、字节流

1)基本字节流

InputStream抽象了以字节读取数据的方式;

OutputStream抽象了以字节写出数据的方式;

2)EOF=End =读到-1就读到结尾;

3)InputStream基本方法:

in.read();//读取一个字节无符号填充到int低八位,-1是EOF

in.read(byte[] buf);

in.read(byte[] buf,int start,int size)

4)OutputStream基本方法

out.write(int b); //写出一个byte到流,b的低八位

out.write(byte[] buf);//将buf字节数组都写入到流

out.write(byte[] buf,int start,int size)

5)文件字节流

FileInputStream ---> 具体实现了在文件上读取byte数据的方法

FileOutputStream ---> 具体实现了向文件中写出byte数据的方法

6)DataOutputStream/DataInputStream

对流功能的扩展,可以更加方便的读取int,long,字符等类型数据

DataOutputStream:由FileOutputStream构造出来,通过包装FileOutput,可以调用FileOutput类的write方法来构造新的更方便的写方法:

DataOutputStream dos =new DataOutputStream(new FileOutputStream(file))

dos.writeInt(10);

dos.writeLong(10l);

dos.writeDouble(10.5);

(DataInputStream和DataOutputStream类似)

8)BufferedInputStream/BufferedOutputStream

为IO提供了带缓冲区的操作,提高了流模式的IO的性能

FileOutputStream--->write() 方法相当于一滴一滴地把水"转移"过去

DataOutputStream--->write()方法相当于一瓢一瓢地把水"转移"过去

BufferedOutputStream--->write()方法相当于一瓢一瓢先放入桶中(缓冲区),再从桶中倒入到另一缸中. --单字节读取:方法:int b=in.read()

效率低(没有缓冲区),一般不用与大文件的读取

--批量读取:方法:int bytes=in.read(byte[] b,int start,int length)

效率高(利用了缓冲区),一般用于大文件读取,是常用的文件读取方法

9)输入输出流的联合使用:

1、开启流

FileInputStream in=new FileInputStream(srcFile);

//需要判断的是srcFile是否存在,是否是文件;若是文件,则进行后续操作

FileOutputStream out=new FileOutputStream(destFile);

//因为destFile即使不自己创建,程序也会帮忙创建,所以不用判断是否存在,是否文件

2、进行读写操作。

批量读取——建立缓冲区

byte[] buf=new byte[2*1024];

int b=in.read(buf));

// 判断是否读完,-1则读完,b的值是读到的个数,他并不会等于-1 只是b=in.read(buf)整个等于-1则代表读取完毕了。如果第一次不等于-1则读取第二次,直到读完为-1为止.

循环批量读取

int bytes;

while((bytes=in.read(buf,0,buf.length))!=-1){

out.write(buf,0,bytes);

}

二、字符流

1、基本字符流

Reader抽象了以字符读取数据的方式

Writer抽象了以字符写出数据的方式

1)Reader基本方法:

int b=in.read(); //读一个字符,当流中没有数据可读时,返回值为-1

in.readread(char[] c);//根据数组尺寸从流中读字符,置于数组中。返回读取字符个数。 in.read(char[] c,int off,int len)//读入len 个字符,从下标off 开始置入数组cbuf in.close() // 关闭流

2)Writer基本方法

out.write(int b); //写一个字符数据

out.write(char[] cbuf); //向流中写字符数组cbuf

out.write(String s); //向流中写一个字符串(很实用)

out.flush();//将缓冲区中数据立即写入到输出流, 刷新缓冲区

out.close();// 关闭流

注:字符流一次处理一个字符,底层仍然是基本的字节序列;字符流操作的是文本文件

2、字符流的基本实现

1)InputStreamReader/OutputStreamWriter

--InputStreamReader:完成byte流解析为char流,按照编码解析

FileInputStream in = new FileInputStream("e:\\javaio\\imoocutf8.txt"); //获取字符输入流

InputStreamReader isr = new InputStreamReader(in,"utf-8");

//默认项目的编码,操作的时候,要写文件本身的编码格式

--OutputStreamWriter 提供char流到byte流,按照编码处理。

OutputStreamWriter:提供char流到byte流,按照编码处理

FileOutputStream out = new FileOutputStream("e:\\javaio\\imoocutf81.txt"); //获取字符输出流

OutputStreamWriter osw = new OutputStreamWriter(out,"utf-8");

2)FileReader / FileWriter (字符流过滤器)

专用对文件字符流的操作,无需进行嵌套构造

FileReader fr = new FileReader ("目录/路径");

FileWriter fw = new FileWriter ("目录 / 路径", true ); //加上true参数表示追加 或

FileReader fr = new FileReader("e:\\javaio\\imooc.txt"); //输入流

FileWriter fw = new FileWriter("e:\\javaio\\imooc2.txt");//输出流

3)BufferedReader/BufferedWrite(字符缓冲流)

--BufferedReader、BufferedWriter继承于Reader、Writer.

--BufferedReader构造函数参数是Reader抽象类,所以要用他的另一个子类InputStreamReader来构造。而InputStreamReader的构造方法是InputStream对象,所以要用InputStream的子类FileInputStream来构造.

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file))); String line;

line = br.readLine(); //一次读取一行,不能识别换行

System.out.println(line);//一次写入一行

BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file))); bw.write(line);

bw.newLine(); //单独换行操作

bw.flush(); //字符流的所有Output的流write()后都要flush()来刷新此流缓冲

4) PrintWriter(打印流)

PrintWriter继承于Writer,构造方法是File或String name; 构造方便。

PrintWriter pw=new PrintWriter("E:\\java\\text.txt")

pw.println(line);//自动换行

三、对象的序列化,反序列化

(1)对象序列化:将Object转换成 byte序列,反之叫对象的反序列化

(2)序列化流(ObjectOutputStream)-----writeObject

反序列化流(ObjectInputStream)----readObject

(3)序列化接口(Serializable)

--对象必须实现序列化接口,才能进行序列化,否则将出现异常

--这个接口,没有任何方法,只是一个标准

--其实序列化,就是把对象的各个属性,写入到文件中,以字节的形式存储。

//序列化

String file = "demo/obj.dat"; //相对路径下可以使用单斜杠

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));

Student stu = new Student("10001", "张三", 20);

oos.writeObject(stu);

oos.flush();

oos.close();

//通过反序列化 把序列化后的对象读出

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));

Student stu = (Student) ois.readObject();

System.out.println(stu); ois.close();


第二篇:JAVA_IO流总结


          Java开发中IO流介绍

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

   IO流的分类

?根据处理数据类型的不同分为:字符流和字节流

?根据数据流向不同分为:输入流和输出流

  一、流的分类

1、按功能分

  读取流:InputStream Reader

  写出流:OutPutStream Writer

2、按流的类型分类

  字节流:InputStream OutputStream

  字符流:Reader    Writer

  二、流功能分析

读取流是从输入设备或数据对象中读取数据到程序,用程序进行处理读入的数据,写出流是把程序处理的数据输出到输出设备上比如硬盘和控制台。

字节流读取和写入的数据单位是字节,可以读取和写入任何类型的数据。达内西安Java培训讲师表示,字符流读取跟写入的数据单位是字符,只能读取和写入文本类型的数据。当需要读取或写入文本型的数据时要用字符流,因为它会比字节流读写字符更方便和高效,相反当数据不是文本型时只能用字节流来读取跟写入。

  三、流中读写方法的示例。(当用到IO流时就有可能出现IO异常,所以需要处理可能的异常)

  字节流:

FileOutputStream fos = new FileOutputStream("D://xxx.xxx");

fos.write("dsfdsf".getBytes());//写入字节数组

fos.close();           //用完后需要关闭流,释放资源。字节流不需要Flush

FileInputStream fis = new FileInputStream("D://xxx.xxx");

fis.read();       //读取一个字节

fis.close();

 四、转换流

  当需要流之间的转换时会用到转换流。

1、把字节读取流转换成字符读取流

InputStreamReader isr = new InputStreamReader(newFileInputStream("xxx.xxx"));

2、把字符输出流转化成字节输出流

OutputStreamWriter osw = new OutputStreamWriter(newFileOutputStream("xx.xxx"));

  五、缓冲流

  需要提高流的读写效率时会用到缓冲流

1、字节缓冲流

BufferedInputStream bis = new BufferedInputStream(newFileInputStream("xx"));

BufferedOutputStream bos = new BufferedOutputStream(newFileOutputStream("xx"));

2、字符缓冲流

BufferedReader br = new BufferedReader(isr);

PrintWriter bw = new PrintWriter(osw);

  缓冲流对读写功能进行了增强,而且使用缓冲技术提高了读写效率,所以当需要提高程序的读写效率时要使用缓冲流。

  六、File类的使用

1、创建

boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false.

  和输出流不一样,输出流对象已建立创建文件。而且文件已经存在,会覆盖。

boolean mkdir()创建文件夹

boolean mkdirs()创建多级文件夹

2、删除。

boolean delete();删除失败时返回false.如果文件正在被使用,则删除不了返回false.

void deleteOnExit();在程序退出时删除指定文件。

3、判断

boolean exists();文件是否存在。

isFile():是不是文件

isDirectory();是不是文件夹

isHidden();是不是隐藏文件

isAbsolute();是不是绝对路径

4、获取信息

getName();文件名

getPath();文件路径

getParent();上一层路径

getAbsolutePath();绝对路径

更多相关推荐:
java各知识点详细总结

Java基础知识总结写代码1明确需求我要做什么2分析思路我要怎么做1233确定步骤每一个思路部分用到哪些语句方法和对象4代码实现用具体的java语言代码把思路体现出来学习新技术的四点1该技术是什么2该技术有什么...

Java详细总结(精辟版++)

Java总结开始于20xx97092748Java概述Java分类javaSE主要是桌面程序控制台程序开发是java基础javaEE企业级开发网站开发和基于bs模式的编程javaME嵌入式开发手机软件小家电第一...

高手总结java常用API(免费下载)

Java常用API的运用效率及技巧1Java面向对象基本概念2System3StringStringBuffer4数值字符布尔对象与简单类型的操作5ClassClassLoader6JavaIO系统7Java集...

java基础知识总结(超级经典)1

Java基础知识总结写代码1明确需求我要做什么2分析思路我要怎么做1233确定步骤每一个思路部分用到哪些语句方法和对象4代码实现用具体的java语言代码把思路体现出来学习新技术的四点1该技术是什么2该技术有什么...

java知识点总结

Java程序设计基础知识点总结1类首字母大写如果一个类名由多个单词构成那么每个单词的首字母都大写中间不使用任何的连接符比如Person类MemberTest类2方法首字母小写如果一个方法由多个单词构成那么第一个...

Java个人总结(仅供参考)

第一章(1)了解J2SE、J2EE、J2ME?J2SE(Java2StandardEdition):标准版?主要目的是为台式机和工作站提供一个开发和运行的平台。包括标准的Java2SDK、工具、运行时环境和AP…

java基础知识总结(超级经典)

Java基础知识总结超级经典写代码1明确需求我要做什么2分析思路我要怎么做1233确定步骤每一个思路部分用到哪些语句方法和对象4代码实现用具体的java语言代码把思路体现出来学习新技术的四点1该技术是什么2该技...

Java常用类总结

Java常用类总结1Java基本类型的封装类Java的8大基本类型有intlongshortfloatdoublebooleancharbyte对应的封装类是IntegerLongShortFloatDoubl...

毕向东java基础总结(完整版)

克己宽容仁德博学厚黑坚毅稳重Java基础知识总结168克己宽容仁德博学厚黑坚毅稳重Java基础知识总结超级经典写代码1明确需求我要做什么2分析思路我要怎么做1233确定步骤每一个思路部分用到哪些语句方法和对象4...

java面向对象总结

面向对象面向对象是一种思想能让复杂的问题简单化让我们角色从执行者变成指挥者不要知道过程只要知道结果一切皆对象描述一个事物其实就是在描述事物的属性和行为对象的特点在于封装数据数据包含着属性和行为我们用类来描述一个...

Java关键字总结

Java关键字总结21abstractJava关键字abstract关键字可以修改类或方法abstract类可以扩展增加子类但不能直接实例化abstract方法不在声明它的类中实现但必须在某个子类中重写示例pu...

java经典总结(超级经典)

java经典总结超级经典写代码1明确需求我要做什么2分析思路我要怎么做1233确定步骤每一个思路部分用到哪些语句方法和对象4代码实现用具体的java语言代码把思路体现出来学习新技术的四点1该技术是什么2该技术有...

java 总结(38篇)