流是一种有序的数据序列,根据操作的类型,可将其分为输入流和输出流。I/O流提供了一条通道程序,可以使用这条通道把源中的字节序列送到目的地。这里回顾字节输入输出流和字符输入输出流。
1.字节输入输出流:
InputStream类是所有字节输入流的抽象类,是所有字节输入流的父类。它定义了操作输入流的各种方法。其中read()和close()最为常用。
read方法有两种构造方法。
read()从当前输入流中读取一个字节数据。若已到流结尾,则返回-1.
read(byte[] bytes,int off,int len)从当前输入流读取一定的byte数据,并存在数组中,然后返回读取的byte数据的数量,若到达流结尾,则返回-1.
OutputStream类是所有字节输出流的类的父类。其常用的方法write()和close(),flush();
write(int ib)将指定的字节写入此输出流
write(byte[] by)将by.length个字节从指定的byte数组写入此输出流
write(byte[] by,int off,int len)将指定by数组中从偏移量off开始的len个字节写入此输出流。
FileInputStream文件字节输入流,可以从指定路径的文件中读取字节数据。该类继承自InputStream类,并实现了读取输入流的各种方法。可以通过以下两种方式创建InputStream实例。
new FileInputStream(File file);
或
new FileInputStream(String path);
FileOutputStream类可实现向文件中写入数据。该类继承自OutputStream类。其主要跟创建实例方法同InputStream类似。
BufferedInputStream类可以说是I/O的一种优化。缓存流为I/O增加了内存缓冲区。其构造实例方法:
new BufferedInputStream(InputStream in);
或
new BufferedInputStream(InputStream ins,int size);//ins为底层输入流;size为指定缓冲区的大小
BufferedOutputStream类可以实现将各个字节写入底层输出流中,其构造方法同BufferedInputStream类似。只不过BufferedOutputStream类有一个flush()方法将缓存区中的数据强制输出完。
DataInputStream类,数据输入流允许应用程序与机器无关的方式从底层输入流读取基本的java数据类型。也就是说,在读取数值时,不必关心这个数值有多少个字节。其创建实例方法:
new DataInputStream(InputStream in);
其常用方法:readByte():读取一个字节;readChar():读取一个字符;readInt():读取一个int值;readUTF():读取一个UTF字符串
DataOutputStream类,数据输出流将基本的java数据类型写入输出流中,然后,应用程序可以使用数据输入流将数据读入。
2.字符输入输出流:
Reader类和Writer类分别用于处理字符数据的读取和输出。它们是所有字符输入输出类的父类。Reader类常用的方法:read(),close();Writer类常用的方法:write(char[] cbuf);
write(char cbuf,int off,int len);write(String str);write(String str,int off,int len);
FileReader类用于从指定路径中读取字符数据,FileWriter类用于通过文件字符输出流义字符为单位输入并保存到文件中。
PrintWriter类用于输出字符数据。
应用实例:
1从指定路径下读取文件信息:(使用字节输入流)
import java.io.File;
import java.io.FileInputStream;
public class Demo1 {
//FileInputStream流
public static void main(String[] args) throws Exception{
File file = new File("C:\\Users\\lenovo\\Desktop\\wen.txt");
FileInputStream fileInput = new FileInputStream(file);
byte[] buffer = new byte[1024];
int length;
//文件读取完最后一个为-1
while((length=fileInput.read(buffer))!=-1){
String str = new String(buffer,0,length);
System.out.println("从文件读取的数据为: "+str);
}
}
}
2.从指定路径下读取文件信息:(使用字符输入流)
package Chapter16;
import java.io.File;
import java.io.FileReader;
public class Demo2 {
//FileReader类
public static void main(String[] args) throws Exception{
File file = new File("C:\\Users\\lenovo\\Desktop\\wen.txt");
FileReader fr = new FileReader(file);
int length;
while((length=fr.read())!=-1){//循环读取指定文件的内容
System.out.print((char)length);
}
fr.close();
}
}
3.使用DataInputStream和DataOutputStream类输入输出:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class Demo3 {
//DataInputStream和DataOutputStream流
public static void main(String[] args) throws Exception{
File file = new File("C:\\Users\\lenovo\\Desktop\\wen.txt");
DataOutputStream dos = new DataOutputStream(fos);
//写入,乱码
dos.writeUTF("abc");
dos.writeChars("def");
dos.writeBytes("efg");
dos.close();
//读出
DataInputStream dis = new DataInputStream(fis);
String str = dis.readUTF();
System.out.println("从文件读出的字符串:"+str);
dis.close();
}
}
4.使用BufferedReader和PrintWriter类进行读入和输出
5.将数据输出到指定路径的文件中(字节流):
package Chapter16;
import java.io.File;
import java.io.FileOutputStream;
public class Demo5 {
//FileOutputStream流
public static void main(String[] args) throws Exception{
File file = new File("C:\\Users\\lenovo\\Desktop\\wen.txt");
//将数据写到指定文件
FileOutputStream fos = new FileOutputStream(file);
if(!file.exists()){
file.createNewFile();
}
byte[] buffer = "苹果好吃。".getBytes();
//将buffer中的数据写到指定的文件中了
fos.write(buffer);
}
}
6.将数据输出到指定路径的文件中(字符流):
package Chapter16;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
public class Demo6 {
//FileWriter类
public static void main(String[] args) throws Exception{
char[] chars = "登录密码是: mrsoft".toCharArray();
File file = new File("C:\\Users\\lenovo\\Desktop\\wen.txt");
for(int i=0;i<chars.length;i++){
chars[i] = (char) (chars[i]^'A');
}//加密
FileWriter fw = new FileWriter(file);
fw.write(chars);
fw.close();
int n,m = 0;
FileReader fr = new FileReader(file);
char[] tom = new char[1024];
while((n=fr.read(tom))!=-1){//将数据读入到了tom数组中了
String str = new String(tom,0,n);
m = n;
System.out.println("密文: "+str);
}
for(int i=0;i<m;i++){
tom[i] = (char) (tom[i]^'A');
}//解密
String ss = new String(tom,0,m);
System.out.println("明文: "+ss);
fr.close();
}
}