字节流
一、IO流的操作步骤
操作大致流程
- 1、使用File类打开一个文件
- 2、通过字节流或者是字符流的子类,指定输出的位置
- 3、进行读写操作
- 4、关闭输入/输出流
注意:io操作属于自愿操作,一定要关闭
二、字节输出流:OutputStream
OutputStream的io包中字节输出流的最大父类
自定如下:
public abstract class OutputStream implements Closeable, Flushable
此类是一个抽象类,想要使用此类,则必须通过子例实例化对象,来操作此类操作本地文件
OutputStream方法的使用
&通过子类指定输出位置
&进行写操作有三种构造方式
&注意写入和追加的区别
&注意文件过大时写入的方法
public static void outputStreamDemo(String path){
File file =new File(path );//使用File类打开一个文件
try {
//通过字节流或者是字符流的子类,指定输出的位置
FileOutputStream fileOutputStream = new FileOutputStream(file,true );
//进行写操作
/**
* void write(int b)
* 将制定的字节写入输入流
* 参数int b,只使用了b的低八位,b的高24位被忽略
* 可能抛出IOIOException异常
*
*/
fileOutputStream .write(97);
fileOutputStream .write('c');
/**
* void write(byte b[])
* 将b.length个字节从制定byte数组写入到输入流
* 读取中文
*/
byte [] bytes= {'d','f','g'};
fileOutputStream .write(bytes );
/**
* void write(byte b[],int off,int len);
* 将指定byte数组中从偏移量off 开始的len个字节写入此输出流
* 参数:
* b-数据
* off-数据中的初始偏移量
* len-数据的个数
* 如果b为null,则抛出NullPointerException
* 如果off为负,或len为负,或者off+len大于数组b的长度,则抛出Index越界异常
*/
fileOutputStream.write(bytes ,2,1);
/**
* void flush()
* 刷新此输出流并强制写出所有缓冲的输出字节
* OutputStream 的 flush方法不执行任何操作
* 用户空间——内核Buffer——磁盘(从内核空间实时刷新到磁盘中)
*/
fileOutputStream .flush() ;
/**
* 一个流实例反复的进行写操作,数据会追加在目标文件内容的后面
* 如果对一个存在内容的文件写操作,会将原内容进行覆盖
* 要实现内容的追加,通过构造函数FileOutputStream(File file,boolean append)
* append为true表示数据是追加的
*/
//关闭资源
fileOutputStream .close() ;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
三、字节输入流(InputStream)
进行读文件
如果读取的是中文,只能用和数组有关的构造方法,因为一个汉字是两个字节
&通过子类指定输出位置
&进行写操作有三种构造方式
&注意文件过大时读取的方法
public static void inputStreamDemo(String path)
{
// File file =new File(path );
//创建FileInputStream实例
try {
FileInputStream fileInputStream = new FileInputStream(path );
//进行读操作
/**
* int read()
* 从输入流中读取一个字节
* 返回的是一个数据字节,如果读取到结尾处,返回-1
* 可能抛出IOException
*/
int read=fileInputStream .read() ;
System.out.println(read);
/**
* int read(byte b[])
* 从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中
* 参数:b - 存储读入数据的缓冲区
* 返回:读入缓冲区的总字节数;如果到达流末尾,则返回-1
* 抛出:IOException - 如果流位于文件末尾而无法读前面的字节;如果流已关闭,
* NullPointerException 如果b为null
* duquzhognwen
*/
byte []bytes =new byte[100];
//int read1=fileInputStream .read(bytes );
//System.out.println(new String(bytes ,0,read1 ));
/**
* int read(byte b[] ,int off,int len)
* 将输入流的数据写到数组b中,off指定写入b的起始位置,len表示可写入的长度
* 返回值,表示时间读取数据的长,读取结束返回-1
*/
int read1 = fileInputStream.read(bytes, 1, 23);
System.out.println(new String(bytes ,0 ,read1 ) );
/**
* 大文件读取
* 循环读取数据
*/
int num=0;
while ((num =fileInputStream .read(bytes ))!=-1 ){
System.out.println(new String(bytes ,0,num));//防止后面的数据存在问题
}
// * 默认不支持
// /**
// * long skip(long n)
// * 跳过和丢弃此输入流中数据的n个字节
// */
// fileInputStream .skip(5);
// /**
// * 读取实际的文件内容的长度
// */
// fileInputStream .available() ;
// /**
// * 判断是否支持mark和support方法
//
// * mark操作,输入流中标记当前位置
// */
// fileInputStream .markSupported() ;
// fileInputStream .mark(2) ;
// fileInputStream .reset() ;
//关闭资源
fileInputStream .close() ;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e){
e.printStackTrace() ;
}
}