IO流
来源:互联网 发布:curl post json body 编辑:程序博客网 时间:2024/05/17 10:42
IO流的输入/输出是从程序的角度来讲的。(从外部(磁盘)流到内存或者程序中,称为输入流【数据从程序外流向程序】。从内存输出到磁盘中,称为输出流【数据从程序流出】)。
流的分类
1、按照方向来分类:输入流(InputStream)、输出流(OutputStream)。
2、按照类型来分类:字节流(XXXStream)、字符流(Writer、Reader)。
3、按照操作方式来分类:节点流、过滤流
4、转换流(InputStremReader、OutPutStreamReader)
输入流
使用IO流的基本步骤:
1、定义流
2、创建流
3、创建一个字节数组来存取读取的信息
4、使用一个整数len来表示读取的长度
5、循环读取数据,只要len大于0说明读取到元素,可以直接对元素进行操作
6、读取完成后使用close方法关闭流
1、定义流
2、创建流
3、创建一个字节数组来存取读取的信息
4、使用一个整数len来表示读取的长度
5、循环读取数据,只要len大于0说明读取到元素,可以直接对元素进行操作
6、读取完成后使用close方法关闭流
流使用完成后应记得在finally块中关闭
通过文件输入流读取文件内容,并在控制台打印:
通过文件输入流读取文件内容,并在控制台打印:
import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;public class InputStreamTest {public static void main(String[] args) {//1、定义一个文件流FileInputStream fis = null;try {//2、创建流fis = new FileInputStream("d:/1.txt");//3、创建一个文件输入流byte[] array = new byte[1024];//4、创建一个字节数组来存取读取的信息int len = 0;//5、循环读取数据,只要len大于0说明读取到元素,可以直接对元素进行操作while((len = fis.read(array))!=-1){System.out.write(array,0,len);}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{try {if(fis != null){//读取完成后使用close方法关闭流fis.close();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
输出流
通过文件输出流实现实现文件的拷贝:
Writer和Reader
对于字符流而言:读用BufferedReader,写用PrintWriter
字符流用来读取字符数据,对于输入字符流而言,最为常用操作方法使用BufferedReader,因为该流有一个readLine()方法,该方法可以一行一行的读取数据并且返回字符串
import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;public class CopyFile {public static void main(String[] args) {FileInputStream fis = null;FileOutputStream fos = null;try {fis = new FileInputStream("d:/1.txt");//创建一个文件输出流fos = new FileOutputStream("d:/temp.txt");byte[] array = new byte[1024];int len = 0;//将数据通过输入流读取到程序中while((len = fis.read(array)) != -1){//将数据通过输出流输出,此时是一个文件输出流,就把数据输出到文件中fos.write(array, 0, len);}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{//关闭流try {if(fos != null){fos.close();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {if(fis != null){fis.close();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
字节流
通过字节读取数据,通常是XXXStream字符流
通过字符来读取数据,只要处理的数据是字符数据,全部用字符流
Writer和Reader
对于字符流而言:读用BufferedReader,写用PrintWriter
字符流用来读取字符数据,对于输入字符流而言,最为常用操作方法使用BufferedReader,因为该流有一个readLine()方法,该方法可以一行一行的读取数据并且返回字符串
import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter;public class CharacterTest {public static void main(String[] args) {BufferedReader br = null;PrintWriter pw = null;try {br = new BufferedReader(new FileReader("d:/1.txt"));//使用文件字符流写文件,加上缓冲流提高效率,写用PrintWriterpw = new PrintWriter(new BufferedWriter(new FileWriter("d:/temp.txt")));String str = null;while((str = br.readLine()) != null){pw.println(str);}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{if(pw != null){pw.close();}if(br != null){try {br.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}}
节点流
可以直接创建的流
过滤流
可以装饰节点流,增加相应的功能
对于缓冲流,一定要关闭,不然如果缓冲区不满就不会刷新,可以通过bos.flush()刷新缓冲
import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;public class FilterTest {public static void main(String[] args) {BufferedInputStream bis = null;BufferedOutputStream bos = null;try {//在文件输入流的基础上加入一个缓冲流,以此提高效率bis = new BufferedInputStream(new FileInputStream("C:\\Users\\asus\\Pictures\\1.jpg"));bos = new BufferedOutputStream(new FileOutputStream("d:/temp.jpg"));byte[] array = new byte[1024];int len = 0;while((len = bis.read(array)) != -1){bos.write(array, 0, len);}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{//对于缓冲流,一定要关闭,不然如果缓冲区不满就不会刷新,可以通过bos.flust()刷新缓冲try {if(bis != null){bis.close();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {if(bos != null){bos.close();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
转换流
将字节流转换为字符流
InputStreamReader
OutputStreamWriter
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Consoletest {public static void main(String[] args) {BufferedReader br = null;try {//把字节流转换为字符流方便进行字符处理br = new BufferedReader(new InputStreamReader(System.in));String str = null;while((str = br.readLine()) != null){if("exit".equals(str)){break;}System.out.println(str);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{try {if(br != null){br.close();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
流的操作
字节流的常用操作
读:
写:
字符流的操作
读数据使用BufferedReader,因为有readLine()方法,写数据使用PrintWriter,可以使用println
标准流的操作
System.in是标准输入流,但是由于是字节流,不方便操作,所以通过情况会将其转换为字符流来处理,通过转换流转换,然后再使用BufferedReader来封装
常用流
a)文件流(File):
非常常用,进行文件的读写操作
b)
缓冲流(Buffered):
过滤流用来提高效率的
c)数据流:
用来读取基本数据类型DataOuputStream和DateInputStream,数据流是过滤流
d)对象流(Object):对象流可以完成对对象的存储
1、必须实现Serializable接口
2、可以把一些属性设置为transient,此时这个属性就不会被存储
读取和存储对象可以使用ObjectOutputStream和ObjectInputStream读取,如果要从文件中读取,需要用这两个流封装一下文件流
序列化
1、一个类若想被序列化,则需要实现java.io.Serializable接口,该接口中没有定义任何方法,是一个标识性接口(Marker Interface),当一个类实现了该接口,就表示这个类的对象是可以序列化的。
2、在序列化时,static变量是无法序列化的;如果A包含了对B的引用,那么在序列化A的时候也会将B一并地序列化;如果此时A可以序列化,B无法序列化,那么当序列化A的时候就会发生异常,这时就需要将对B的引用设为transient,该关键字表示变量不会被序列化。
IO流中的装饰模式。。。
0 0
- 【IO流】IO框架
- IO流呀IO流
- 字符IO&数据流IO&对象流IO
- io流
- io流
- IO流
- IO流
- IO 流
- IO流
- io流
- IO流
- io流
- IO流
- IO流
- IO流
- IO流
- IO流
- IO流
- 排序---冒泡
- Go语言无法读取需要密码访问的PEM文件问题(failed to parse private key)
- 关于图的数据转为为邻接矩阵(第四次作业)
- hdu1009 FatMouse' Trade(贪心)
- MyBatis:Parameter Maps collection does not contain value for 的问题解决
- IO流
- 懒人服务器 - 教程一、运行示例程序
- NYOJ975 关于521
- 喷水装置(二)
- Activity样式android:theme=“*”
- 如何关闭selinux和防火墙
- 8051 Code Banking
- 111111111111
- This Android SDK requires Andriod Developer Toolkit version 20.0.0 or above