字节流与字符流
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();
}
}
这种转换意义不大,一般只有方便处理中文时才发生转换。(一般也不怎么用)