黑马程序员技术交流社区

标题: 拒绝复制,手打精品,go [打印本页]

作者: wjiuchaol1    时间: 2015-12-15 22:37
标题: 拒绝复制,手打精品,go
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();
        }
       

}
________________________________________________________________________________________________________________________







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2