首页 > 代码库 > java IO字节流

java IO字节流

字节流适合处理二进制 图片 音乐等数据  因为是一个字节一个字节处理的  而文档 txt等等适合用字符流来处理  
任何文件都可以用字节流来处理 但是 文本文件最好用字符流来处理

IO流 输入输出流

流是一组有顺序的  有起点和终点的字节集合 是对数据传输的总称或者抽象 即数据在两设备之间的传输称为流 流的本质是传输 根据数据的传输特性将抽象为各种类  方便直观的进行操作 

IO流的分类

根据处理数据的不同分为 字符流和字节流
根据数据流向不同分为 输入流和输出流


OutputStream  字节输出流 

public abstract class OutputStream extends Object implements Closeable,Flushable
此抽象类是表示输出字节流的所有类的超类,输出流接受输出字节并将这些字节发送到某个接收器

close()
    关闭此输出流并释放与此流有关的所有系统资源

flush()  缓冲流才用
    刷新此输出流并强制写出所有缓冲的输出字节

write(byte[] b)
    将b.lengt 个字节从指定的byte输出写入此输出流

write(byte[] b,int off,int len)  常用
    将指定byte数组总从偏移量off开始的len个字节写入此输出流

write(int b)
    将指定的字节写入此输出流


OutputStream类只是一个抽象类 抽象类必须通过子类完成 现在要向文件中输出 使用FileOutputStream类

FileOutputStream(File file)
    创建一个像指定file对象表示的文件中写入数据的文件输出流  覆盖

FileOutputStream(File file,boolean append)
    创建一个像指定file对象表示的文件中写入数据的文件输出流  append表示追加 默认覆盖

FileOutputStream(String name)
    创建一个向具有指定名称的文件中写入数据的输出文件流  覆盖 内部帮你new file

FileOutputStream(String name.boolean append)
    创建一个向具有指定名称的文件中写入数据的输出文件流   append表示追加 默认覆盖

info
可以一次全部输入完 大文件会卡 也可以一个一个输入 太慢  所以我们都是自定义输入大小  这样最好


FileInputStream 从文件系统的某个文件中获得输入字节  那些文件可用取决于主机环境 FileStream用于读取诸如图像数据之类的原始字节流 要读取字符流 请考虑 FileRead

FileInputStream(File file)
    通过打开一个到实际文件的链接来创建一个FileInputStream  该文件通过文件系统中的File对象 file指定

FileInputStream(FileDescriptor fobj)
    通过一个文件描述符fdobj创建一个FileInputStream类 该文件描述符表示到文件系统中某个实际文件现有链接

FileInputStream(String name)
    通过打开一个到实际文件的链接来创建一个FileInputStream 该文件通过文件系统中路径名name来指定


read()
    从输入流中读取下一个字节 如果没有数据可用 此方法将阻塞  返回-1表示读完了

read(byte[] b)
    从输入流中读取一定数量的字节并将字节缓存在b中

read(byte[] b,int off,int len)
    从输入流中读取指定开始位置的 len长度个字节 缓存在b中










【输出流  CODE】

 //字节输出流
 public static void write1() {
  //输出 就是程序把东西 输出到文件里面
  //输入 就是文件把东西输入到程序里面
  //创建一个文件字节输出流
  try {
  //第二个参数 追加
  OutputStream out = new FileOutputStream("d:\\1.txt",true);
  //只能输出字节
  String info = "hello, world!";
  byte[] bytes = info.getBytes();
  //一个字节一个字节的输出
  /*
  for(int i= 0;i<bytes.length;i++) {
   out.write(bytes[i]);
  }*/
  //全部输出
  //out.write(bytes);
  //分段输出
  out.write(bytes,0,5);
  //最后记得关闭
  out.close();
  }catch(FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

[输入流 code]
try {
   //先获取文件长度
   File f = new File("d:\\1.txt");
   InputStream in = new FileInputStream(f);
   //* 第三种 指定每次读取的字节数组
   byte[] bytes = new byte[10];
   int len = -1;
   StringBuilder sb = new StringBuilder();
   while((len = in.read(bytes)) != -1) {
    sb.append(new String(bytes,0,len));
   }
   in.close();
   System.out.print(sb);
   
   
   /*
    * 一个一个读 太慢
   int b = -1; //-1表示没有数据\
   while((b = f1.read()) != -1) {
    System.out.print((char)b);
   }*/
   
   //返回 long类型 字节数组是int类型 要强制转换下
   //根据文件的大小构造字节数组
   //适合文件比较小的
   /*
   byte[] b = new byte[(int)f.length()];
   int len = f1.read(b);
   System.out.println(new String(b));
   System.out.print("长度是:"+len);
   */
  }catch(FileNotFoundException e) {
    e.printStackTrace();
  }catch(IOException e) {
   e.printStackTrace();
  }


一个字节一个字节的读


一次性全读取完


读取指定大小字节




java IO字节流