io流. 概述极其分类.:
io用来处理设备之间数据传输
java对数据操作是通过流的方式
java是用于操作流的类. 都在io包中
流按流象分为两种, 输入 输出流
流按操作类型为两种
字节流: 字节流可以操作任何数据, 因为在计算机中任何数据都是以字节的形式存储
字符流 字符流 智能操作纯字符数据 比较方便
io常用父类
字节流的:
inputStream outputstream
字符流的抽象父类
reader
writer
io程序书写
使用前 导入io包中的类
使用时 .进行io异常处理
使用后 释放资源
按照刘翔分: 操作的是内存和因公安之间的数据 把你自己当做内存
输入:读取文件.
输出流:写文件.
按照操作分:
字节流. 可以操作任何类型的数据,
inputstream:字节输入流
outputstream字节输出流
字符流. 值能操作纯中文的数据
reader
writer
字节流. 可以操作任何类型的数据,
inputstream:字节输入流
子类: fileInputStrea
public int read();// 从数据原中读取数据 一次读一个字节
为什么方法的返回值是int 类型? 而不是byte
计算机底层存储数据都是以 数据的二进制补码形式来存的
当read方法一次读一个字节 有可能读到
11111111 这样的字节
刚好是-1的补码 这个时候后边的数据就不读了 所以我们在读数据的时候, 给每个字节
前边加上三个字节来读 写的时候在把前边加的3个字节 给去掉就可以
简单既: 防止读到中间的11111111这样的数据 后边内容就读取不了了
outputstream字节输出流
特别重要的六行代码:
fileinputstream fis = new finleinputstream("xxx.txt")
int x = fis.read();
system.out.println(x)
int y = fis.read()
system.out.println(y)
int z = fis.read();
system.out.println(z);
int a = fils.read();
system.out.println(b);
fis.close();
_____________________________________________
fileinputstream fis = new finleinputstream("xxx.txt")
int b ;
while(b = fis.read() !=-1)
system.out.println(b)
fis.close();
_____________________________________________
outputstream
public void write (int b)
fileoutputstream fos = new fileoutputstream("yyy.txt")
for.write(97) //虽然写出的是一个int数 但是到文件上的是一个字节 自动去除前三个八位
for.write(98)
for.write(99)
for.close();
_______________________________________________
fileoutstream 在创建对象的时候没有这个文件会帮助我们创建出来
如果有这个文件就会先将文件清空.
fileoutstream fos = new fileoutputstream("a.txt",true)
fos.write(97);
fos.write(98);
fos.write(99);
fos.close()
fileoutstream fos = new fileoutputstream("a.txt")
fos.write(65);
fos.write(66);
fos.write(67);
fos.write(68);
fos.close();
够脏方法:
fileoutputstream(string name) 往指定文件中写内容, 覆盖
fileoutputstream (string name , boolean append ) 往 指定文件中写内容 后续在写加true
public void write (int b) 网目的地文件中写内容
__________________________________________________________________
第一种方式 一次读一个字节.拷贝图片, 六行代码教你做人:
思路:封装数据源
封装目的地
定义变量, 接受读到的字节
通过循环不断的读数据, 只要返回值不是-1 就一直读
将读到的 内容 写入到目的地文件中
施放资源
弊端:效率底
fileinputstream fis = new fileinputstream("双招传送重生.jpg")
fileoutputstream fos = new fileoutputstream("copy.jpg")
int b;
while((b=fis.read)! = -1) // 不断的读取每一个字节
fos.write(b); // 将每一个字节写出
fis.colse();
fos.colse(); // 施放
________________________________________________________________________
mp3
fileinputstream fis = new fileinputstream("双招传送重生.jpg")
fileoutputstream fos = new fileoutputstream("copy.mp3")
int b ;
while((不= fis.read()) ! = -1)
fos.write(b);
fis.close()
fos.close()
_________________________________________________
第二种方式
不推荐这种方式.boomshit.
因为.有可能会导致内存溢出.
public int read(byte[] bys); //一次读一个数组
available(); // 获取要读的文件的所有字节数
fileinputstream fis = new fileinputstream("双招传送重生.jpg")
fileoutputstream fos = new fileoutputstream("copy.mp3")
//int len = fis.available();
//system.out.println(len)
bute[] arr = new byte[fis.available()] // 创建和文件一样大小的字节数组
fis.read(arr);
fos.write(arr); // 将文件上的字节读取到内存中.
fis.colse()
fos.close()
_______________________________________________________________________
第三种方式: 定义小数组
最牛逼的方式教你做人,
public void write (byte[] bys , int index , int length);
一次读一个指定长度的字节数组
fileinputstream fis = new fileinputstream("xxx.txt")
byte[] arr = new byte[2];
int a = fis.read(arr); // 将文件上的字节读到字节数组中
System.out.println(a);
for(byte b = arr)
system.out.println(b)
int c = fis.read(arr)
system.out.println(c)
for(byte b = arr)
System.out.println(b)
fis.close();
fileinputstream fis = new fileinputstream("xxx.txt")
fileoutputstream fos = new fileoutputstream("yyy.txt")
byte[] arr = new byte[2]
int len;
while((len = fis.read(arr))!= -1)
fos.write(arr,0,len);
fis.close();
fos.close();
___________________________________________________________________________
第三种方式: 标准格式.
封装数据源
封装目的地
定义字节数组表示一次要读多少
定义变量 接受读到的字节
通过循环 不断的来读数据, 只要返回值不是-1 就一直读
将读到的内入写入到目的地文件中
施放资源
fileinputstream fis = new fileinputstream("mp3")
fileoutputstream fos = new fileoutputstream("copy.ma3")
byte[] arr = new byte[1024 * 8] ;
int len;
while((len = fis.read(arr))!= -1)
fos.write(arr,0,len);
fis.close();
fos.close();
____________________________________________________________________
把桌面的音频拷贝到项目下
fileinputstream fis = new fileinputstream("路径")
fileoutputstream fos = new fileoutputstream("目的地")
byte[] arr = new byte[1024*8]
int len;
while((len = fis.read(arr))!= -1)
fos.write(arr,0,len);
fis.close();
fos.close();
__________________________________________________________________
缓冲区的拷贝
fileinputstream fis = new fileinputstream("路径")
fileoutputstream fos = new fileoutputstream("copy.MP3")
bufferedinputstream bis = new bufferedinputstream(fis) //缓冲区对输入进行包装 让他变的更加粗壮
bufferedoutputstream bos = new bufferedouputstream(fos)
byte[] arr = new byte[1024*8]
int b;
while((b = bis.read())!= -1)
bos.write(b);
bis.close();
bos.close();
_____________________________________________________________
bufferedinputstream
其实是fileterinputstream的子类 对他进行了包装. 自带缓冲区.不用我们每次都去创建小数组了.
bufferedoutputstrream 其实是fileterinputstream的子类.对fileoutputstream进行了包装, 自带缓冲区
bufferedoutputstream bos = new bufferedoutputstream(new fileoutputstream)
加强版
public class Demoshittoo {
public static void main(String[] args) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\迅雷下载\\[刀剑神域.第二季].[DMG][Sword.Art.Online.II][07][720P][GB](ED2000.COM).mp4"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.mp4"));
int b;
while((b = bis.read()) != -1) {
bos.write(b);
}
bis.close();
bos.close();
}
}
________________________________________________________________________________________________________________________
|