Java中的IO流详解:IO流,缓冲区,数据流
?1,、在Java中,IO流的分类:
?????1) 根据方向分: 输入流(I) 和? 输出流(O);
?????2) 根据单位分: 字节流(byte) 和 字符流(char);???
? ???3) 根据功能(是否有数据源)分:? 节点流 和 处理流。
??2、在Java中,所有流均由四个抽象的类派生而来。四个抽象的类分别如下:
?????1) 抽象的字节输入流类:? InputStream;
?? ??2) 抽象的字节输出流类:? OutputStream;?
?????3) 抽象的字符输入流类:? Reader;
????4) 抽象的字符输出流类:? Writer;
???注意: IO流的类等均来自 java.io.* 包。
??3、抽象的字节输入流类: InputStream,其特性如下:
????1) 它以字节方式来读取数据。
????2) 它提供的常用方法如下:
?????int read();? 它用来读取一个字节,反馈该字节对应的整数,其范围是[0, 255]。
?????void close(); 关闭输入流。
????3) 它针对文件操作的子类有:? FileInputStream文件的字节输入流类。
?4、FileInputStream 文件的字节输入流类,其特性如下:?
?????1) 它以字节方式来读取数据(文件的内容)。
?????2) 它提供的常用方法如下:
??????int read();? 它用来读取一个字节,反馈该字节对应的整数,其范围是[0, 255]。
??????若读取完毕,则反馈一个 -1。
?????void close(); 关闭输入流,释放所占资源,确保数据源的安全。??
5、抽象的字节输出流类:? OutputStream 的特性如下:
????1) 它用来将给定的数据以字节方式输出。
????2) 它提供的常用方法:
?????void write(int x);? 将给定的整数以字节方式输出。
??????void flush();? 将缓冲区的数据一次性输出,确保输出成功!
??????void close(); 关闭输出流。
?
?????3) 它针对文件操作的子类有:? FileOutputStream 文件的字节输出流类。
?
6、FileOutputStream文件的字节输出流类,其特性如下:
????1) 它用来将给定的整数以字节方式输出。
????2) 它提供的常用方法:
?????void write(int x);? 将给定的整数以字节方式输出。因此,当给定的整数超出了[0, 255]时,则会失真。
?????void flush();? 将缓冲区的数据一次性输出,确保输出成功!?
?????void close(); 关闭输出流,释放所占资源,确保输出成功。?
?
public static void main(String[] args) {
//1 准备,读取的流必须已经存在,
String path = "d:\\a1.txt";
//2 声明一个字节输入流 fis
FileInputStream fis = null;
//3创建 一个字节输入流对象
try {
fis = new FileInputStream( path );
int x = fis.read(); //4读取一个字节
//5 遍历完成时,会反馈一个 -1
while ( x != -1 ){
System.out.print( (char) x ); //6 现在在控制台上
x = fis.read(); //7 继续读取
} //返回 去判断
System.out.println("\n读取 " + path + " 文件完毕。 ");
} catch (FileNotFoundException e) {
System.out.println(path + " 文件找不到!");
} catch (IOException e) {
System.out.println("读取文件内容失败!");
} finally {
//8关闭
try {
if( fis != null ){
fis.close();
System.out.println("关闭成功。");
}
} catch (IOException e) {
System.out.println("关闭失败!");
}
}
}
}
?字节流
1、抽象的字符输入流类: Reader?
?? ?1) 它以字符的方式来读取数据。
????2) 它的常用方法:?
???? int read();? 用来读取一个字符,反馈该字符对应的整数。
?????void close(); 用来关闭输入流。
????3) 它针对文件操作的子类:? FileReader.?
?2、FileReader 文件的字符输入流类,其特性如下:
???1) 它以字符方式来读取文件的内容。??
???2) 它的常用方法:
?????int read(); 用来读取文件中的一个字符,反馈该字符对应的整数,其范围是[0, 65535]。
????????当它反馈一个-1时,则表示结束了。?
????void close(); 用来关闭输入流,释放所占资源,确保文件的安全。?
?3、抽象的字符输出流类 : Writer?
????1) 它将给定的整数以字符方式输出。?
????2) 它的常用方法:
?????void write( int x );? 将给定的整数以字符方式输出。
?????void flush();? 将缓冲区中的数据一次性输出,?
?????void close(); 关闭输出流。?
????3) 它针对文件操作的子类有:? FileWriter??
?4、FileWriter文件的字符输出流类,其特性如下:
????1) 它用来将给定的整数以字符方式输出到文件中。
????2) 它的常用方法:
?????void write(int x); 将给定的整数以字符方式输出到文件中。?
?????void flush(); 将缓冲区中的数据一次性输出,确保输出成功。
?????void close(); 关闭输出流,释放所占资源,确保存盘成功。?
public static void main(String[] args) {
//1 准备一个文件
String path = "d:\\a1.txt";
//2 声明 FileReader对象
FileReader fr = null;
//3 创建 FileReader的实例
try {
fr = new FileReader( path );
//4 读取
int x = fr.read();
//5 判断,当读取完成时,反馈一个 -1
while( x != -1 ){
System.out.print( (char)x ); //6输出到控制台的内容
x = fr.read(); //7继续读取
} //返回
System.out.println("\n读取 " + path + " 文件完毕。");
} catch (FileNotFoundException e) {
System.out.println("你给定的文件不存在!");
} catch (IOException e) {
System.out.println("读取失败!");
} finally {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
?
?* ?小结:? 两对类针对文件操作
?* ???1) FileInputStream 和?? FileOutputStream 文件的字节输入、输出流类.
?* ???2) FileReader 和? FileWriter 文件的字符输入/输出流类.
?5、将 FileInputStream 和 FileOutputStream两者相互结合实现文件和复制。??
?6、将 FileReader 和? FileWriter 结合实现文件的复制。
?* 注意:
?* 字节流可以复制任何类型的文件,字符流只能复制文本文档类型的文件
?? 文件中的换行和屏幕上的换行是不一样
??? 在文件中是 \r\n ,屏幕上的是\n
?
实例代码如下:
public class FileCopyTest {
public static void main(String[] args) {
//1 准备文件路径
String path1 = "d:\\a1.txt";
String path2 = "d:\\newa1.txt";
System.out.println("正在复制文件,需要一点时间,请等待.......");
//2声明 对象
FileInputStream fis = null;
FileOutputStream fos = null;
//3 创建对象
try {
fis = new FileInputStream( path1 );
fos = new FileOutputStream( path2 );
int x = fis.read(); //读取一个字节
//5 判断
while( x != - 1 ){
//6存盘
fos.write( x );
//7继续读取
x = fis.read();
} //返回
//8 确保存盘成功
fos.flush();
System.out.println("\n已将 " + path1 + " 复制到 " + path2 + " 中了。");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
?缓冲区
?1、在Java中,为了提高输入输出流的速度,从而提供了缓冲流类。
????1) BufferedInputStream 和 BufferedOutputStream 。
?????缓冲的字节输入流类和缓冲的字节输出流。
????2) BufferdReader 和 BufferedWriter?
?????缓冲的字符输入流类和缓冲的字符输出流。
????3) 缓冲流属性处理流,因此,在使用它们时必须将其套接在节点流。
?????BufferedInputStream 和 BufferedOutputStream , 这一对缓冲的字节输入、输出流往往
????套接在 FileInputStream? 和? FileOutputStream 上。
?????BufferdReader 和 BufferedWriter ,这一对缓冲的字符输入、输出流往往套接在
???FileReader 和?? FileWriter 上。
??目的: 提高 文件的读取和存盘的速度 。
public static void main(String[] args) {
//1 准备文件路径
String path1 = "e:\\歌曲.mp3";
String path2 = "e:\\歌曲.mp3";
System.out.println("正在复制文件,请等待....... ");
//2声明对象类型
FileInputStream fis = null;
FileOutputStream fos = null;
//缓冲技术
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
long t1 = System.currentTimeMillis(); //计时
//3 创建对象
try {
fis = new FileInputStream( path1 );
fos = new FileOutputStream( path2 );
bis = new BufferedInputStream( fis ); //创建缓冲流对象,目的提高输入输出的效率。
bos = new BufferedOutputStream( fos );
//4 读取
int x = bis.read(); //fis.read();
//5判断,读取完成时,反馈一个 -1
while( x != -1 ){
bos.write(x); //fos.write( x ); //6 存盘
x = bis.read(); //fis.read(); //7 继续读取
}//返回
//8 确保存盘成功
bos.flush(); //fos.flush();
long t2 = System.currentTimeMillis();//计时
System.out.println("\n将 " + path1 + " 复制到 " + path2 + "中了。");
System.out.println("所有时间为: " + (t2 - t1 ) + " 毫秒。");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bis.close(); //关闭缓冲输入流
} catch (IOException e2) {
e2.printStackTrace();
}
try {
fis.close();//关闭输入流
} catch (IOException e1) {
e1.printStackTrace();
}
try {
bos.close();//关闭缓冲输出流
} catch (IOException e1) {
e1.printStackTrace();
}
try {
fos.close(); //关闭输出流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
?
数据流
????1、在java中,为便于处理八种基本类型的数据,从而提供了数据流。
????? 它由 DataInputStream 和 DataOutputStream 数据的字节输入、输出流类。?
??? ?1) 它作用: 用来处理八种基本类型的数据和字符串。?
?? ??2) 它提供了相应的方法:
?????void writeByte(byte);??? byte? readByte();
?????void writeShort(short);? short readShort();
???????...
?
???注意: 数据流也属于处理流,需要套接在节点流。 如: 套接在 FileOutputStream和FileInputStream上。?
???注意: 数据流在读取和存盘时数据的输入输出的顺序要一致。;?
???注意: 数据流通常适合在网上传递数据使用。
将八种基本类型的数据保持类型不变的情况下实现输入输出。
public static void main(String[] args) {
//1 准备
byte b1 = 127;
short s1 = 32767;
int i1 = 2147483647;
long l1 = 9876543210L;
float f1 = 1.78f;
double d1 = 3.1415926;
char ch = ‘A‘;
boolean flag = true;
String str = "Hello";
String path1 = "D:\\datas.dat";
//2 声明对象类型
DataOutputStream dos = null;
DataInputStream dis = null;
//3 创建对象
try {
dos = new DataOutputStream( new FileOutputStream(path1) );
//4存盘;用DataOutputStream 类型的对象进行存盘
dos.writeByte( b1 );
dos.writeShort( s1 );
dos.writeInt( i1 );
dos.writeLong( l1 );
dos.writeFloat( f1 );
dos.writeDouble( d1 );
dos.writeChar( ch );
dos.writeBoolean( flag );
dos.writeUTF( str ); //String 类型用writeUTF()
//5确保存盘成功。
dos.flush();
System.out.println("已将 八种基本类型的数据 存盘到" + path1 + "中了。");
//现在从path1对应的文件中读取其内容。
dis = new DataInputStream( new FileInputStream(path1) );
//开始读取
b1 = dis.readByte();
s1 = dis.readShort();
i1 = dis.readInt();
l1 = dis.readLong();
f1 = dis.readFloat();
d1 = dis.readDouble();
ch = dis.readChar();
flag = dis.readBoolean();
str = dis.readUTF() ; //String 类型读取方法用readUTF()
System.out.println("b1 = " + b1 );
System.out.println("s1 = " + s1 );
System.out.println("i1 = " + i1 );
System.out.println("l1 = " + l1 );
System.out.println("f1 = " + f1 );
System.out.println("d1 = " + d1 );
System.out.println("ch = " + ch );
System.out.println("flag = " + flag );
System.out.println("str = " + str );
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
dos.close(); //关闭输出数据流
} catch (IOException e1) {
e1.printStackTrace();
}
try {
dis.close();//关闭输入数据流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
?
?
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。