I/O 流

I/O操作的相似性

I/O输出处理是程序设计中非常重要的一部分,比如从键盘读取数据、从文件中读取数据或向文件中写数据等等。这些操作都有相似性,如:

控制台(console)——打印/读入

文件(file)——读/写

File类

File类是IO包中唯一代表磁盘文件本身信息的类,而不是文件中的内容;

File类定义了一些与平台无关的方法来操纵文件,例如;创建、删除文件和重命名文件。

流的抽象

Java把这些不同类型的输入、输出源抽象为流(stream),用统一接口来表示,从而使程序简单明了。



什么是流

流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动起来。



Java I/O流的分类

java.io 包中定义了多个流类型(类或抽象类)来实现输入/输出功能:可以从不同的角度对其进行分类;

按数据流的方向不同可以分为输入流和输出流;

按处理数据单位不同可以分为字节流和字符流;

按照功能不同可以分为节点流和处理流。

JDK所提供的所有流类型位于包java.io内,都分别继承自以下四种抽象流接口:



字节流(byte stream):一个字节(8-bit)一个字节读/写

字符流(character stream):一个字符一个字符读/写(具有特定字符编码的数据)

InputStream

继承自InputStream的流都是用于向程序中输入数据,且数据的单位为字节(8 bit)

InputStream基本方法

public abstract int read( ) throws IOException

读取一个字节并以整数的形式返回(0~255),如果返回-1表示到达输入流的结尾

public int read(byte[] buffer) throws IOException 

读取一系列字节并存储到一个数组buffer,返回实际读取的字节数,到末尾返回-1

public long skip(long n) throws IOException 

跳过n个字节不读,返回实际跳过的字节数

public void close( ) throws IOException

关闭流释放内存资源

读(Reading)

建立联系

选择流

操作流

关闭资源

代码实现示例:

     //1建立联系
       String path = "D:/Test/1.txt";
       File src = new File(path );
       //2选择流
       InputStream is = null;//提升作用域
       try {
        is = new FileInputStream(src );
        //3操作流,不断读取
        byte[] car = new byte[1024];
        int leg = 0;//接受实际读取的大小
        //循环读取
        while(-1!=(leg =is .read(car ))){
            String inf = new String(car,0,leg );
            System. out.println(inf );
        }     
    }
catch (FileNotFoundException e) {
        System. out.println("文件不存在" );
        e.printStackTrace();
    } catch (IOException e) {
         e.printStackTrace();
       System. out.println("文件读取失败" );
    }finally {
        try {
            //4.关闭资源
            is.close();
       } catch (IOException e ) {
            e.printStackTrace();
           System. out.println("关闭失败" );
       }
    }

文件处理

类FileInputStream和FileOutputStream用来进行文件I/O处理,由它们所提供的方法可以打开本地主机上的文件,并进行顺序的读/写。

OutputStream

继承自OutputStream的流都是用于程序中输出数据,且数据的单位为字节(8 bit)

OutputStream基本方法

public abstract void write(int b) throws IOException

向输出流中写入一个字节数据,该字节数据为参数b的第8位

public void write(byte[] data) throws IOException 

将一个字节类型的数组中的数据写入输出流

public void close( ) throws IOException 

关闭流释放内存资源

public void flush( ) throws IOException 

将输出流中缓存的数据全部写出到目的地

流的写出过程

写(Writing)

建立联系

选择流

输出

关闭流

代码实现示例:

File f = new File("D:" + File.separator+"test.txt");
OutputStream out=new FileOutputStream(f);//如果文件不存在会自动创建
//OutputStream out=new FileOutputStream(f,true);//追加内容
String str="Hello World";
byte[] b=str.getBytes();
out.write(b);//因为是字节流,所以要转化成字节数组进行输出
out.close();

字符流Reader

继承自Reader的流都是用于向程序中输入数据,且数据的单位为字符(2个字节)

Reader基本方法

public int read( ) throws IOException 
public int read(char[] text) throws IOException 
public long skip(long n) throws IOException 
public void close() throws IOException

流代码实现:

public static void main(String[] args) throws IOException {
		File f = new File("D:" + File.separator + "text.java");
		Reader input = new FileReader(f);
		int b=0;
		while((b=input.read())!=-1){
			System.out.println((char)b);
		}
		input.close();
	}

字符流Writer

继承自Writer的流都是用于程序输出数据,且数据的单位为字符(16 bit)

Writer基本方法

public void write(int c) throws IOException 
public void write(char[] text) throws IOException 
public void write(String string) throws IOException
public void flush(char[] text) throws IOException
public void close(char[] text) throws IOException

Writer代码实现示例:

public static void main(String[] args) throws IOException {
		File file = new File("D:/text.java");
		Writer w = new FileWriter(file);
		String str = "测试";
		w.write(str);
		w.close();
	}

节点流和处理流



节点流:可以从或向一个特定的地方(节点)读写数据。如:FileReader

处理流:是对一个已存在的流的连接和封装,通过所封装的功能调用实现数据读写。如:BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。

常用的节点流

父类:InputStream、OutputStream、Reader、Writer

对文件进行处理的节点流

FileInputStream 、FileOutputStream 、FileReader、FileWriter

常用的处理流

父类:InputStream、OutputStream、Reader、Writer

缓冲流

BufferedInputStream、BufferedOutputStream

BufferedReader、BufferedWriter

需要父类作为参数构造,增加缓存功能,避免频繁读写硬盘,可以初始化缓冲数据的大小,由于带了缓冲功能,所以就写数据的时候需要使用flush方法。

转换流

InputStreamReader、OutputStreamWriter   要inputStream或OutputStream作为参数,实现从字节流到字符流的转换

通过处理流读数据到程序

第一步:创造一个字符流/字节流,直接操作文件

Reader in = new FileReader("G:/Book1.csv");

第二步:在节点流的基础上,套一个缓冲流,实现缓冲和按行读取

BufferedReader  reader = new BufferedReader(in);

第三步:读取

String line=null;

第四步:关闭流,有两种方式

1. 可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法

2. 关闭原则:先打开的后关闭,后打开的先关闭。否则会抛出异常

通过处理流写数据到文件

第一步:创造一个字符流/字节流,直接操作文件

Writer out = new FileWriter("G:/Book2.csv");

第二步:在节点流的基础上,套一个缓冲流,实现缓冲

BufferedWriter writer = new BufferedWriter(out);

第三步:写入

writer.write("ddddd");  换行的方法是writer.newLine();

第四步:写完之后,关闭之前,必须flush!

writer.flush();

第五步:关闭流,有两种方式

1. 可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法

2. 关闭原则:先打开的后关闭,后打开的先关闭。否则会抛出异常

中文乱码的解决方案

第一步:创造一个节点流/字符流,直接操作文件

InputStream file = new FileInputStream("G:/Book1.csv");

第二步:按照指定编码从字节流转化为字符流

InputStreamReader in = new InputStreamReader(file, "GBK");

第三步:在节点流的基础上,套一个缓冲流,实现缓冲和按行读取

BufferedReader  reader = new BufferedReader(in);

总结

父类:InputStream、OutputStream、Reader、Writer

对文件进行处理的节点流

FileInputStream 、FileOutputStream 、FileReader、FileWriter

处理流中的缓冲流

BufferedInputStream、BufferedOutputStream

BufferedReader、BufferedWriter

处理流中的转化流实现从字节到字符的转换

nputStreamReader、OutputStreamWriter









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值