IO:输入输出
流:是一种抽象概念,是对数据传输的总称,也就是说数据在设备间的传输成为流,流的本质是数据传输。
IO流就是用来处理设备间数据传输问题的
常见的应用:文件复制,文件上传,文件下载
IO流分类:
按数据的流向:输入流(读数据)、输出流(写数据)
按数据类型:字节流、字符流(一般来说,我们说IO流的分类是按照数据类型来分的。)
那么这两种流都在什么情况下使用呢?
如果数据通过Windows子代的记事本软件打开,我们还可以读懂里面的内容,就是用字符流,
否则使用字节流。如果你不知道该使用哪种类型的流,就是用字节流,因为字节流是万能的流。
如下图所示,我们通过记事本软件打开后,完全看不懂里面的内容是啥,这就是字节流。
字节流内容
//创建字节流输出对象(参数就是我们要写入数据的文件)
FileOutputStream fos = new FileOutputStream(name:"myByteStream\\fos.txt")
//释放资源(每次我们使用完流之后都要进行资源的释放)
fos.close();
//一次写一个字节数据void write(int b )(该方法是向文件中写入数据)
fos.write(99);
fos.write(98);
fos.write(97);
//我们在文件中得到的结果为cba
// 一次写一个字节数组数据void write(byte[] b)
Byte [] bys ={97,98,99};
fos.write(bys);
Byte[] bys="abc".getBytes(); //返回字符串对应的字节数组
void write(byte [] b , int off , int len)一次写一个字节数组的部分数据
例:fos.write(bys,1,2)//从第二个字节开始读取两个长度的数据
字节流写数据的两个小问题:
1:字节流写数据如何实现换行呢?(下面是不同的操作系统的不同操作)
window:\r\n
linux:\n
mac:\r
2:字节流写数据如何实现追加写入呢?(如果第二个参数为true,则字节将写入文件的末尾而不是开头,从而实现追加写入)
public FileOutputStream(Stringname,booleanappend)
第一个参数为写入文件的名称
//写数据
for(inti=0;i<10;i++){
fos.write("hello".getBytes());
fos.write("\r\n".getBytes());
}
异常处理
//加入finally来实现释放资源
FileOutputStream fos=null;
try{
fos = new FileOutputStream("idea_test\\fos.txt");
fos.write("hello".getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally {
if (fos!=null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
字节流读取数据
//一次读一个字符数据
int ch;
while ((ch=isr.read())!=-1){
System.out.print((char)ch);
}
//一次读一个字符数组数据
char [] chs = new char[1024];
int len;
while ((len=isr.read(chs))!=-1){
System.out.println(new String(chs,0,len));
}
复制文件
//根据数据源创建字节输入流对象
FileInputStream fis = new FileInputStream("某个文件夹");
//根据数据源创建字节输出流对象
FileOutputStream fos = new FileOutputStream("某个文件夹");
//读写数据,复制文本文件(一次读取一个字节,一次写入一个字节)
int by;
while ((by=fis.read())!=-1){
fos.write(by);
}
/* //一次读取一个字节数组,一次写入一个字节数组
byte[] bys = new byte[1024];
int len ;
while ((len=fis.read(bys))!=-1){
fos.write(bys,0,len);
}*/
//释放资源
fis.close();
fos.close();
字节缓冲流
BufferOutputStream:该类实现缓冲输出流。通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用(也就是说我们可以一部分一部分的写进去)
BufferedInputStream:创建BufferedInputStream将创建一个内部缓冲区数组。当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节。
构造方法:
字节缓冲输出流:BufferOutputStream(OutputStream out)
字节缓冲输入流:BufferedInputStream(InputStream in)
从上我们可以看到,构造方法需要的是字节流,而不是具体的文件或者路径。这是因为字节缓冲流仅仅提供缓冲区,而真正的读写数据还得依靠基本的字节流对象进行操作。