字节流与字符流

时间:2021-01-23 21:01:36

                                                          字节流与字符流

1) 字节流:InputStream,OutStream

2) 字符流:Reader、Writer

 

 

1、 字节输出流:OutputStream

定义:

        public abstract class OutputStream extends Object implements Closeable Flushable;

 

OutputStream实现了两个接口:Closeable、Flushable,两接口定义如下:

Closeabl :

public interface Closeable extends AutoCloseable{

               public void close() throws IOException;

}

Flushable e:

        public interface Flushable{

               public void flush() throws IOException;

}

 

在OutputStream里面提供了三个输出方法:

1) 输出单个字节:public abstract void write(int b) throws IOException;

2) 输出全部字节数组:public void write(byte[] b)throws IOException;

3) 输出部分字节数组:public void write(byte[] b,int off,len)throws IOException;

Len:输出字节长度,注意一个汉字是两个字节

 

OutputStream是抽象类,所以要进行实例化操作,就要使用它的子类。所以可以用FileOutputStream子类对文件操作进行操作。在这个子类中有如下方法:

1) 创建或覆盖已有文件:public FileOutputStream(File file)throws FileNotFoundException

2) 文件内容追加:public FileOutputStream(File file,boolean append)

throws FileNotFoundException

 

范例:文件内容输出——输出全部字节

import java.io.File;

import java.io.FileOutputStream;

import java.io.OutputStream;

public class TestDemo{

       public static void main(String[] args)throws Exception{

//定义文件路径

Filefile=newFile("e:"+File.separator+"Demo"+File.separator+"nihao"

+File.separator+"tet.txt");

              //如果文件目录不存在,创建文件目录

              if(!file.getParentFile().exists()){

                     file.getParentFile().mkdirs();

              }

              //使用OutputStream及其子类实例化对象

              OutputStream output=new FileOutputStream(file)//覆盖输入

;// OutputStream output=new FileOutputStream(file,true);追加输入

              //文件内容输出

              String str="好好学习,天天向上\r\n\*(换行)*\";

              byte[] data=str.getBytes();//将字符串变为字节数组

              output.write(data);//输出内容

              output.close();//g

       }

}

 

 

2、 字节输入流

定义:

public abstract class InputStream extends Object implementsCloseable

方法:

1) 读取单个字节:pu blic abstract int read()throws IOException;

返回值:返回读取内容,如果没有内容,返回-1

2) 将读取的数据保存在字节数组里;public int read(byte[] b)throws IOExcption;

返回值:返回读取数据长度,直到结尾,返回-1

3) 将读取的数据保存在部分字节数组里:public int read(byte[]b,int off,int len)

throws IOException

返回值:读取的部分数据长度,直到结尾,返回-1

 

范例:

import java.io.File;

import java.io.FileInputStream;

import java.io.InputStream;

public class TestDemo{

       public static void main(String[] args)throws Exception{

              File file=newFile("e:"+File.separator+"Demo"+File.separator+"nihao"+

File.separator+"test.txt");//定义文件路径

              if(file.exists()){//判断文件是否存在

                     InputStream input=new FileInputStream(file);

                     //进行数据读取

                     byte[] data=new byte[1024];

                     int len=input.read(data);

                     //关闭输入流

                     input.close();

                     System.out.println("["+new String(data,0,len)+"]");

              }

       }

}

  

3、 字符输出流:Writer

定义:public abstract class Writer

          extends Object

          implements Applendable,Closeable,Flushable

Writer类除了实现Closeable与Flushable接口外,还实现了一个Appendable接口

 

Appendable定义:

public interface Appendable{

public Appendable append(char c) throws IOException;

public Appendable append(CharSequence csq)throws IOException;

public Appendable Appendable append(CharSequence csq,int start,int end)throws IOException;

}

在Appendable接口里面定义了追加的操作,而且追加的数据都是字符或者是字符串

 

在Writer里面定义有以下部分方法:

1) 输出全部字符数组:public void writer(char[] cbuf)throws IOException

2) 输出字符串:public void writer(String str)throws IOException

Writer是一个抽象方法,所以也要用它的子类FileWriter实例化对象

范例:

import java.io.File;

import java.io.FileWriter;

import java.io.Writer;

public class TestDemo{

       public static void main(String[] args)throws Exception{

              //定义文件路径

              File file=new File("e:"+File.separator+"Demo"+File.separator+"test.txt");

              //判断文件目录是否存在

              if(!file.getParentFile().exists())

                     file.getParentFile().mkdirs();

              //实例化writer对象

              Writer out=new FileWriter(file);

              //进行内容输出

              String str="慕易安";

              out.write(str);

              //关闭输出流!!!!!!!

              out.close();

       }

}

 

4、 字符输入流:Reader

在Reader类里面提供了一系列的read()方法;

1)     读取内容到字符数组:public int read(char[] chuf)throws IOException

返回值:表示读取的数据长度,如果已经读到结尾了返回-1

 

范例:使用Reader读取数据

import java.io.File;

import java.io.FileReader;

import java.io.Reader;

public class TestDemo{

       public static void main(String[] args)throws Exception{

              //定义文件路径

              File file=new File("e:"+File.separator+"Demo"+File.separator+"test.txt");

              //判断文件是否存在

              if(file.exists()){

              //实例化Readrr对象

              Reader in=new FileReader(file);

              //进行数据读取

              char[] data=new char[1024];

              int len=in.read(data);

              in.close();

              System.out.println(new String(data,0,len));

              }

       }

}

  

字节流直接与终端进行交互,而字符流需要将数据经过缓冲区处理后才可以输出。

开发之中对于字节流使用较多,例如对:图片,音乐,电影,文字,对于字符流最大的好处是进行中文的有效处理,所以开发之中优先考虑字符流处理中文。

 

5、转换流

名称

InputStreamReader

OutputStreamWriter

定义结构

public class InputStreamReader extends Reader

public class OutputStreamWriter extends Writer

构造方法

Public InputStreamReader(InputStream in)

Public OutputStreamWriter(OutputStream out)

范例:

import java.io.File;

import java.io.FileOutputStream;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.io.Writer;

public class TestDemo{

public static void main(String[] args)throws Exception{

        //定义文件路径

        File file=new File("e:"+File.separator+"Demo"+File.separator+"test.txt");

        //判断文件是否存在

        if(file.getParentFile().exists())

               file.getParentFile().mkdirs();

        OutputStream output=new FileOutputStream(file);

        Writer out=new OutputStreamWriter(output);

        out.write("muyian");

        out.close();

}

}

 

这种转换意义不大,一般只有方便处理中文时才发生转换。(一般也不怎么用)