Java字节流
字节流:InputStream、OutputStream
·字符流:Reader、Writer
不管使用何种流,基本的操作流程是一样的,以文件操作为例:
·确定操作文件的路径
·通过字节流或字符流的子类为字节流和字符流对象实例化
·进行输入、输出操作
·关闭流
2.1字节输出流:OutputStream
Java.io.OutputStream是可以进行字节数据(byte)的输出,这个类的定义结构如下:
public abstract class OutputStream
extends Object
implements Closeable, Flushable
三个输出的write()方法:
·输出单个字节:public abstract void write(int b) throwsIOException
·输出全部字节:public void write(byte[] b) throws IOException
·输出部分字节:public void write(byte[] b,int off,int len)throwsIOException
OutputStream是个抽象类,需要使用子类进行实例化(ByteArrayOutputStream,FileOutputStream, FilterOutputStream,ObjectOutputStream, OutputStream, PipedOutputStream),本次对文件操作,使用FileOutputStream子类。
构造方法:public FileOutputStream(File file) throwsFileNotFoundException,覆盖
构造方法:publicFileOutputStream(File file,boolean append) throws FileNotFoundException,追加
范例:文件的输出
public class OS_FileOut_test {
public static void main(String[] args) throws Exception {
File file = new File("D:" + File.separator + "test" + File.separator
+ "test.txt");
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream fos = new FileOutputStream(file, true);//文件末尾追加
//FileOutputStream fos = new FileOutputStream(file);//写入覆盖
fos.write("hello world".getBytes());
//fos.write("hello world".getBytes(),0,5);//将字节数组范围输出
fos.close();
}
}
使用单个输出:
String msg="Hello World!";
for (int i = 0; i < msg.length(); i++) {
fos.write(msg.charAt(i));
}
在整个OutputStream中最重要的是输出方法:输出部分字节数据
2.2字节输入流:InputStream
使用OutputStream可以完成程序想文件的输出,读取内容使用InputStream。
定义如下:
public abstract class InputStream
extends Object
implements Closeable
InputStream类依然是Closeable借口的子类,但是InputStream类本身一直存在close()方法,因此可以忽略掉Closeable。在InputStream类之中定义三个read()方法:
·读取单个字节:public abstract int read()throws IOException
|-每次读取一个字节数据,此时返回的数据,如果数据已经读完,则返回-1
·读取所有字节到字节数组:public int read(byte[]b) throws IOException
|-将内容读取到字节数组中,返回的是个数,如果读取完毕返回-1
·读取内容到部分字节数组:public int read(byte[]b,int off,int len)throws IOException
|-将指定长度的内容读取到字节数组之中,返回读取的个数,如果读取完毕返回-1
同样的抽象类,实例化使用子类(AudioInputStream, ByteArrayInputStream, FileInputStream,FilterInputStream, InputStream, ObjectInputStream,PipedInputStream,SequenceInputStream, StringBufferInputStream),此处使用FileInputStream读取文件:
实例:整个文件读入到字符数组
File file = new File("D:" + File.separator + "test" + File.separator
+ "test.txt");
if (file.exists()) {
InputStream is=new FileInputStream(file);
byte data[]=new byte[1024];
is.read(data);
System.out.println("【"+new String(data)+"】");
is.close();
}
读取部分数据,读取完毕将不再读取
is.read(data,0,20);
而在整个InputStream类中单个字节读取操作:
File file = new File("D:" + File.separator + "test" + File.separator
+ "test.txt");
if (file.exists()) {
InputStream is=new FileInputStream(file);
byte data[]=new byte[1024];
int temp=0;
int foot=0;//数组的角标
while((temp=is.read())!=-1){
data[foot++]=(byte) temp;
}
System.out.println("【"+new String(data,0,foot)+"】");
is.close();
}