字节流和字符流
我们知道,在java.io包里面的File类是唯一一个与文件操作相关的程序处理类,但是呢,FIle类只能对文件本身进行操作,但是不能操作文件的内容;
对于我们服务器和显示器而言,实质上传递的就是一种数据流,就是比特数据。也就是字节数据。而这些字节数据,在我们java.io包里面提供了两大类的支持:
一、字节处理流:OutputStream(输出字节流)、InputStream(输入字节流);
二、字符处理流:Writer(输出字符流)、Reader(输入字符流);
那么:所有的流操作都应该采用如下统一步骤进行,下面以文件处理的流程为例:
- 如果现在要进行的是文件的读写操作,则一定要通过File类找到这个文件的路径;
- 通过字节流或者字符流的子类,对父类对象进行实例化;
- 利用字节流或者字符流中的方法实现数据的输入和输出操作;
- 流的操作属于资源操作,而资源操作必须进行关闭处理;
OutputStream字节输出流
- 字节的数据咦byte类型为主进行操作;
- OutputStream是一个公共的输出操作标准,这个标准呢,一共有三个输出方法;
- 分别是:
- public abstract void write(int b) throws IOException;(输出单个字节数据)
- public void write(byte [] b) throws IOException; (输出一组字节数据)
- public void write(byte [] b ,int off , int len) throws IOException; (输出部分字节数据)
- 但是OutputStream类是一个抽象类,我们应该通过他的子类实例的向上转型完成,所以我们可以使用FileOutputStream这个子类进行实例化;
- 然后我们来使用OutputStream类实现内容的输出:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class OutputStream练习 {
public static void main(String[] args) throws IOException {
//1.第一步找到文件指定位置
File file = new File("D:" + File.separator + "文件操作专用" + File.separator + "a.txt");
if(!file.getParentFile().exists()){ //判断文件的父路径是否存在,不存在就新建立
file.getParentFile().mkdirs();
}
if(!file.exists()){ //判断文件是否存在
file.createNewFile();
}
//2.第二步进行子类实例化
OutputStream output = new FileOutputStream(file);
String s = "阿鸡是个大傻逼!!";
//3.第三步将字符串变成字节数组并且输出
output.write(s.getBytes());
//4.第四步进行资源的关闭
output.close();
}
}
- 这样,我们就可以将内容输出到指定的文件里面的了 ,当我们打开那个a.txt的时候,里面的内容就会变成 阿鸡是个大傻逼!! ;
InputStream字节输入流
- 这个和上面那个差不多,也是一个标准,这个标准也有三个方法,和上面那个也是一样的,但是方面名称是 read ;
- 他也是一个抽象类的方法啊,所以我们也只能使用他的子类实例化,然后向上转型,实现父类对象的实例化了。
- 然后我们来看看实战;
package 阿里云大学java.java高级学习;
import java.io.*;
public class InputStream练习 {
public static void main(String[] args) throws IOException {
//1.第一步找到文件指定位置
File file = new File("D:" + File.separator + "文件操作专用" + File.separator + "a.txt");
InputStream input = new FileInputStream(file);
byte [] ans = new byte[1024];
input.read(ans);
System.out.println(new String(ans));
input.close();
}
}
- 嗯嗯,就是这样,我们继续!!!
Writer字符输出流
- 在JDK1.1后推出来的东西,emmm
- 然后再writer类里面呢,有很多的方法,但是我们只要知道其中的两个方法即可!
- 输出字符数组:public void write(char [] cbuf)throws IOException;
- 输出字符串 : public void write(String str)throws IOException;
- 然后我们来看看实战情况;
package 阿里云大学java.java高级学习;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class Write字符输出流练习 {
public static void main(String[] args) throws IOException {
File file = new File("D:" + File.separator + "文件操作专用" + File.separator + "a.txt");
//加了true以后,表示追加数据,没有这个参数就表示是覆盖
Writer out = new FileWriter(file,true);
String str = "阿鸡是个超级大傻逼" ;
out.write(str);
out.close();
}
}
- 嗯嗯,还是很好用的。
- Writer类的最大优势就在于,她可以直接利用字符串进行数据的输出完成!!
Reader字符输入流
- 这个跟上面那个差不多,但是还是有差别的,那就是,上面那个可以直接进行字符串处理,但是我们这个Reader类不可以直接进行字符串处理,
- 他需要用字节数组,进行处理;
- 输出字符数组:public void read(char [] cbuf)throws IOException;
- 嗯嗯,就是这个样子,只有这一个方法哦。我们来看看实战吧!!
package 阿里云大学java.java高级学习;
import java.io.*;
public class Reader字符输入流练习 {
public static void main(String[] args) throws IOException {
File file = new File("D:" + File.separator + "文件操作专用" + File.separator + "a.txt");
Reader in = new FileReader(file);
char [] ans = new char[1024];
int len = in.read(ans);
System.out.println(new String(ans,0,len));
//要记得资源关闭呀,怎么老是忘记关闭呢!!!
in.close();
}
}
- 这玩意还是很有脾气的,他只能够按照字符数组来进行数据处理;
字节流和字符流的区别
- 我们在使用OutputStream类进行数据处理的时候,没有进行关闭数据流,但是数据依然可以正常进行输出;
- 但是我们在使用Writer类进行数据处理的时候,如果我们没有进行数据的关闭,数据便不会进行输出处理;
- 那为什么会这样呢,实际上呀,我们在使用close()方法的时候会出现强制刷新缓存区的情况所以这个时候我们将内容进行输出,如果我们没有关闭数据,那么我们就得不到数据的输出操作;
- 那么呢:
- 字节流在数据处理的时候并不会使用到缓冲区,但是字符流会使用到缓冲区;另外呢,使用缓冲区的字符流更加适合我们的中文数据的处理;
- 所以在以后我们遇到有中文信息的输出的时候呢,我们就要优先使用字符流的缓冲区来进行数据处理;
- 字节流和字符流的基本处理形式基本上相同;