IO流

IO流

1,I是指Input(输入),O是指Output(输出)。
2,在Java中,文件的输入和输出是通过流(Stream)来实现的,流的概念源于Unix中管道(pipe)的概念。在Unix系统中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。
3,一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。对于流而言,我们不用关心数据是如何传输的,只需要向源端输入数据,向目的端获取数据即可。
4,流按照处理数据的单位,可以分为字节流和字符流;按照流向分为输入流和输出流(注意:输入流和输出流都是站在程序的角度参照的)。

字节流

字节流用于处理以字节为单位的二进制文件(如音乐、图片等)
1,InputStream抽象类是所有输入字节流类的直接或间接父类,FileInputStream是其重要子类:

FileInputStream

FileInputStream常用构造方法:

FileInputStream(File file) :通过File对象创建FileInputStream对象。
FileInputStream(String name) :通过文件(非“目录”)路径创建FileInputStream对象。

FileInputStream常用方法:

int read():从输入流中读取单个字节的数据;如果已到达文件末尾,则返回 -1。
int read(byte[] b):从输入流中将最多b.length个字节的数据读入一个byte数组中,以整数形式返回存入数组中的实际字节个数;如果已到达文件末尾,则返回 -1。
void close():关闭此文件输入流并释放与此流有关的所有系统资源。
2,OutputStream抽象类是所有输出字节流类的直接或间接父类,FileOutputStream是其重要子类:

FileOutputStream

FileOutputStream常用构造方法:

FileOutputStream(File file) :通过File对象创建FileOutputStream对象。
FileOutputStream(String name) :通过文件(非“目录”)路径创建FileOutputStream对象。
FileOutputStream(File file, boolean append):通过File对象创建FileOutputStream对象;第二个参数如果为true ,则字节将被写入文件的末尾而不是开头。

FileOutputStream常用方法:

void write(int b):将指定的单个字节数据写入此文件输出流。
void write(byte[] b, int off, int len):将byte数组中从off开始的len个字节写入此文件输出流。
void flush():刷新字节输出流并强制写出缓冲内所有字节数据。
void close():关闭此文件输出流并释放与此流有关的所有系统资源。
用如下例子说明上述字节流中方法的使用:
在这里插入图片描述
追踪传输过程:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
为了提高传输速度,使用如下代码

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Text {

	public static void main(String[] args) {
		FileInputStream input=null;//提升变量
		FileOutputStream output=null;
		try {
			input=new FileInputStream("D://1.mp4");//输入流
			output=new FileOutputStream("D://3.mp4");//输出流,文件为空,创建。
			byte [] car=new byte[1024];	//载货工具
			int validLength=0;
			while((validLength=input.read(car))!=-1) {//以1024字节为单位传输。-1表示传输完成。传输过快,也容易出错
				output.write(car, 0, validLength);
			}
			output.flush();
		} catch (Exception e) {
			e.printStackTrace();
		}finally {//释放资源,先关闭输出流。
			if(input!=null) {
				try {
					input.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(output!=null) {
				try {
					output.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

特别注意:FileOutputStream(File file) 、 FileOutputStream(String name) 或FileOutputStream(File file, false)创建FileOutputStream对象时会创建一个新的空文件;如果使用FileOutputStream(File file, true)创建FileOutputStream对象,则只在第一次执行时创建一个新的空文件。

字符流

Java虚拟机将字节转化为2个字节的Unicode字符就形成了字符流,字符流用于处理以Unicode字符为单位的文本文件(如记事本文件等)。
1,Reader抽象类是所有输入字符流类的直接或间接父类, FileReader是其重要子类:

FileReader

FileReader常用构造方法:

FileReader(File file) :通过File对象创建FileReader对象。
FileReader(String fileName) :通过文件(非“目录”)路径创建FileReader对象。

FileReader常用方法:

int read():从输入流中读取单个字符的数据,如果已到达流的末尾,则返回 -1 。
int read(char[] cbuf):从输入流中将最多cbuf.length个字符的数据读入一个char数组中,以整数形式返回存入数组中的实际字节个数,如果已到达流的末尾,则返回 -1 。
void close():关闭此文件输入流并释放与此流有关的所有系统资源。
2,Writer抽象类是所有输出字符流类的直接或间接父类,FileWriter是其重要子类:

FileWriter

FileWriter常用构造方法:

FileWriter(File file) :通过File对象创建FileWriter对象。
FileWriter(String fileName) :通过文件(非“目录”)路径创建FileWriter对象。
FileWriter(File file, boolean append):通过File对象创建FileWriter对象;第二个参数如果为true ,则字节将被写入文件的末尾而不是开头。

FileWriter常用方法:

void write(int c):将指定的单个字符数据写入此文件输出流。
void write(char[] cbuf, int off, int len):将char数组中从off开始的len个字符写入此文件输出流。
void flush():刷新字符输出流缓冲。
void close():关闭此文件输出流并释放与此流有关的所有系统资源。
用如下例子说明上述字符流中方法的使用:

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Text {

	public static void main(String[] args) {
		try {
			FileReader reader=new FileReader("D://5.java");
			FileWriter writer=new FileWriter("D://51.java");
			int data=0;
			while((data=reader.read())!=-1) {//data=reader.read()是从文件中读出来。
				writer.write(data);//将data写在新的文件中。由于文件太小,所以在缓存中。用output.flush();
			}
			writer.flush();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

在这里插入图片描述
提高传输速度用如下代码:

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Text {

	public static void main(String[] args) {
		FileReader reader=null;
		FileWriter writer=null;
		try {
			reader=new FileReader("D://5.java");
			writer=new FileWriter("D://52.java");
			char [] str=new char[1024];
			int data=0;
			while((data=reader.read(str))!=-1) {//data=reader.read()是从文件中读出来。
				writer.write(str, 0, data);;//将data写在新的文件中。由于文件太小,所以在缓存中。用output.flush();
			}
			writer.flush();//任何输出流都有flush
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			if(writer!=null) {
				try {
					writer.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(reader!=null) {
				try {
					reader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

特别注意: FileWriter (File file) 、 FileWriter (String fileName) 或FileWriter (File file, false)创建FileWriter对象时会创建一个新的空文件;如果使用FileWriter (File file, true)创建FileWriter对象,则只在第一次执行时创建一个新的空文件。

转换流

由于文件自身编码方式和程序运行时使用的默认编码方式不一致,致使程序读取或输出字符文件时可能会出现乱码,这时可以使用字节流操作文件,然后再将字节流转换成字符流,这一转换过程可以借助转换流实现。

InputStreamReader

InputStreamReader(字节输入流——>字符输入流):
InputStreamReader(InputStream in) :
InputStreamReader(InputStream in, String charsetName):

OutputStreamWriter

OutputStreamWriter(字节输出——>字符输出流):
OutputStreamWriter(OutputStream out) :
OutputStreamWriter(OutputStream out, String charsetName) :
看如下例子:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Text {
	public static void main(String[] args) {
		InputStreamReader reader=null;
		OutputStreamWriter writer=null;
		try {
			reader=new InputStreamReader(new FileInputStream("D://5.java"),"GBK");
			writer=new OutputStreamWriter(new FileOutputStream("D://53.java"),"GBK");
			char [] car=new char[1024];
			int validLength=0;
			while((validLength=reader.read(car))!=-1) {//从car里读取字节的有效长度
				writer.write(car, 0, validLength);
			}
			writer.flush();
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			if(writer!=null) {
				try {
					writer.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(reader!=null) {
				try {
					reader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

根据前面所学知识,可以通过字符流或者缓冲字符流实现文本文件的复制,但是这种复制方法有可能会出现乱码,为了解决该问题可以通过字节流+转换流实现文本文件的复制。

缓冲流

缓冲流是一种装饰器类,目的是让原字节流、字符流新增缓冲的功能以提高读取或写入。
缓冲字节输入流:
BufferedInputStream(InputStream in):
缓冲字节输出流:
BufferedOutputStream(OutputStream out):
缓冲流实现二进制文件拷贝
在这里插入图片描述
缓冲字符输入流:
BufferedReader(Reader in):
缓冲字符输出流:
BufferedWriter(Writer out):
缓冲流实现文本文件拷贝
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值