InputStream是表示字节输入流的所有类的超类
Reader是用于读取字符流的抽象类
InputStream提供的是字节流的读取,而非文本读取,这是和Reader类的根本区别。
即用Reader读取出来的是char数组或者String ,使用InputStream读取出来的是byte数组。
字节流用于操作文件数据,网络传输等场景,而字符流适用于与字符串,中文有关的内容处理,因为Writer/Reader两个抽象类对字符的支持比较好。
除了这些,字符输出流写数据时是先将数据写入缓冲区,待字符输出流关闭后再写入到文件中,而字节输出流是直接写入到文件中
public class ByteStream {
public static void main(String[] args) throws Exception {
BufferedReader1();
}
read()功能:读取单个字符的个数,如果已经读完的话会返回-1 (其范围从 0 到 65535 )
readLine() 功能:读取一个文本行。
InputStream:是表示输入字节流所有类的超类,一般我们使用它的子类,如FileInputStream等
FileInputStream文件字节输入流 以字节形式输出文件内容
public static void FileInputStream1() throws IOException {
FileInputStream fi=new FileInputStream("E://file.txt");
int i;
//此处的FileInputStream调用的read 每次仅读取一个字节
while((i=fi.read())!=-1)
{
System.out.println(i);
}
}
OutputStream:表示输出字输出节流所有类的超类。输出流接受输出字节并将它们发送到某个接收器。
一般我们使用它的子类,如FileOutputStream等.FileOutStream文件字节输出流 字符转换成字节保存至指定文件
public static void FileOutStream1() throws IOException {
// File f=new File("E://file.txt");
OutputStream out=null;
//也可以out=new FileOutputStream(f);
out=new FileOutputStream("E://file.txt");
String str="hello my sorld1";
// 只能输出byte数组,所以将字符串变为byte数组
byte b[]=str.getBytes();
out.write(b);
//文件不存在会自动创建
out.close();
}
InputStreamReader是从字节流到字符流的桥接器:它读取字节并使用指定的字符将它们解码为字符charset。
它使用的字符集可以通过名称指定,也可以明确指定,或者可以接受平台的默认字符集
InputStreamReader 字符输入流 封裝了InputStream在里头,它以较高级的方式,一次读取一个一个字符
public static void InputStreamReader1() throws IOException {
FileInputStream fi=new FileInputStream("E://file.txt");
//指定编码集对字节进行转换,在通过char进行字符转换
InputStreamReader isr=new InputStreamReader(fi,"utf-8");
int i;
while((i=isr.read()) != -1){
System.out.println((char)i);
}
}
OutputStreamWriter是从字符流到字节流的桥接:写入它的字符使用指定的字节编码为字节charset。它使用的字符集可以通过名称指定,也可以明确指定,或者可以接受平台的默认字符集。
OutputStreamWriter是字符流到字节流的桥接 所以无需讲字符串或者字符转换成字节 自身提供转换
public static void OutputStreamWriter1() throws IOException {
File file=new File("E://file.txt");
FileOutputStream out=new FileOutputStream(file);
OutputStreamWriter osr=new OutputStreamWriter(out);
String str="htoodada";
osr.write(str);
// osr.flush();//如果用于网络传输,记得强制刷新缓冲区,否则输出的数据只停留在缓冲区中,而无法进行网络传输
osr.close();
}
为了实现字节到字符的有效转换,可以从基础流中提取比满足当前读取操作所需的更多字节。为了获得最高效率 可以使用字符流
BufferedReader 字符输入流: 从字符输入流中读取文本,缓冲字符,以便有效地读取字符,数组和行。
public static void BufferedReader1() throws IOException {
//方案一 FileReader底层是FileInputStream,通过解码器完成字节类转换为字符流
//FileReader等同于InputStreamReader(FileInputStream)
// FileReader reader = new FileReader("E://file.txt");
FileInputStream fi=new FileInputStream("E://file.txt");
try {
//指定编码集对字节进行转换,在通过char进行字符转换
InputStreamReader isr=new InputStreamReader(fi,"utf-8");
//方案一
// BufferedReader br=new BufferedReader(reader);
BufferedReader br=new BufferedReader(isr);
String str;
while((str=br.readLine()) != null){
System.out.println(str);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
BufferedWriter 将文本写入字符输出流,缓冲字符,以便地写入单个字符,数字和字符串
public static void BufferedWriter1() throws Exception {
//方案一
// FileOutputStream fi=null;
// OutputStreamWriter ow=null;
// BufferedWriter writer = null;
//方案二 FileWriter底层还是FileOutputStream,通过解码器完成字节类转换为字符流
//即 FileWriter 等同于 OutputStreamWriter(FileOutputStream)
FileWriter output = null;
BufferedWriter writer = null;
try{
//方案一 BufferedWriter字符输出缓冲流 封装 字符输出流
// fi=new FileOutputStream("E://file.txt");
// ow=new OutputStreamWriter(fi);
// writer = new BufferedWriter(ow);
//方案二 BufferedWriter字符输出缓冲流 封装 FileWriter
output = new FileWriter("E://file.txt");
writer = new BufferedWriter(output);
writer.write("dasdasdfgsgsgsfasdf \n asdfsfds \n fdsfdsf");
}finally{
if(null != writer){
writer.close();
}
if(null != output){
output.close();
}
}
}
}
//* PW支持两个直接对文件写操作的构造方法:
// * PrintWriter(File f)传文件名
//* PrintWriter(String s)传路径
//* PrintWriter给人一种可以直接对文件进行操作的假象
//* PW是一个高级流
//* 实际上PW包装了字节流、字符流和字符缓冲流。
// * PW负责自动行刷新
//* bw负责提高效率
//* osw负责读字符
//* fos负责写字节
//* 最后PW能够按行很快地把一个字符串变成字节写在文件中
//*/
public static void PrintWriter1()
{
FileOutputStream os=null;
PrintWriter pw=null;
try {
os =new FileOutputStream("E://file.txt");
pw = new PrintWriter(os);
pw.write("服务器欢迎你1");
pw.flush();
} catch (Exception e) {
// TODO: handle exception
} finally{
//关闭资源
try {
if(pw!=null)
pw.close();
if(os!=null)
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}