JavaIO流输入输出流-字节流

IO流分为输入流、输出流

输入输出流 又分为字节流、字符流

字节流

  1. InputStream:抽象了应用程序读取数据的方式
  2. OutputStream:抽象了应用程序写 出数据的方式
  3. EOF = End 读到-1就读到结尾

输入流基本方法

int b = in.read();读取一个字节无符号填充到int低八位.-1是EOF in.read(byte[] buf) 读取数据填充到字节数组buf in.read(byte[] buf,int start, int size)读取数据到字节数组buf从buf的start位置开始存放size长度分数据

输出流的基本方法

out.write(int b) //写出一个byte到流,b的低8位

out.write(byte[] buf) //将buf字节数组都写到流

out.write(byte[] buf, int start,int size) //字节数组buf从start位置开始写size长度的字节到流

FileInputStream

具体实现了在文件上读取数据

FileInputStream

实现了向文件写出byte数据方法

public static void printHex(String fileName) throws IOException {
    //把文件转化为字节流十六进制进行读操作
    FileInputStream fis = new FileInputStream(fileName);
    int b;
    int i = 1;

    while ((b=fis.read()) != -1){
        if(b <= 0xf ){
            System.out.print("0");
        }             
    System.out.print(Integer.toHexString(b)+" ");
    
    if (i%10==0){
        System.out.println();
         }
     i++;
      }
 fis.close();
  } 使用字节数组读取文件

//不确定文件大小(推荐)

FileInputStream fis = new FileInputStream(fileName);

byte[] bytes = new byte[1024];$       
int num;
while ((num=fis.read(bytes,0,bytes.length))!=-1){
for (int i = 0; i < num ; i++) {                
    //& 0xff byte为8位,int为32位为避免数据转换出错将高24位去除
System.out.print(Integer.toHexString(bytes[i] & 0xff)+" ");
            }

}

FileInputStream fis = new FileInputStream(fileName);

byte[] bytes = new byte1024;

int b;

int i=1;

if ((b=fis.read(bytes,0,bytes.length))!=-1){

  for (int j = 0; j < b; j++) {
      System.out.print(Integer.toHexString(bytes[i] & 0xff)+ " ");
      if (i%10==0)
      System.out.println();
       i++;
}

}fis.close();

## FileOutPutStream

FileOutputStream fos = new FileOutputStream(fileName);

fos.write('A');

fos.write('B');$

int a =10;

fos.write(a>>>24);

fos.write(a>>>16);

fos.write(a>>>8);

fos.write(a);

byte[] utf8 = "中国".getBytes("utf-8");

fos.write(utf8);

fos.close();

文件复制操作

public static void copyFile(File srcFile,File destFile)throws IOException{
    if(!srcFile.exists()){
        new IllegalArgumentException("文件/文件夹不存在");
    }
    if (srcFile.isFile()){
        new IllegalArgumentException("目标不是一个文件");
        }
        FileInputStream fis = new FileInputStream(srcFile);
         FileOutputStream fos = new FileOutputStream(destFile);
         byte[] bytes = new byte[1024];
         int num ;
         while ((num=fis.read(bytes,0,bytes.length)) != -1){
             fos.write(bytes,0,num);
             fos.flush();
             }
        fis.close()
        fos.close();
    }

DataInputStream/DataOutPutStream

是对“流”的扩展,可以更加方便读取int,long,String等类型数据

DataInputStream

writeInt()/writeDouble()/writeUTF()

BufferedInputStream/BufferedOutputStream

这两个流类位IO提供了带缓冲区的操作,一般打开文件进行写入或读取是,都会加上缓冲,这种流模式提高了IO的性能从应用程序中把输入放入文件,相当于将一缸水倒入另一缸水

FileOutputStream、DataoutputStream与BufferedOutputStream:

  1. FileOutputStream—>write()方法相当于一滴一滴地把水“转移”过去
  2. DataOutputStream–>writeXxx()方法会方便一些,相当于一瓢一瓢(比如int 4滴4滴转移)把水“转移”过去
  3. BufferedOutputStream—>write方法更方便,相当于一飘一瓢先放入桶中(缓冲区),再从桶中倒入到另一个缸中
  4. 读写效率对比:使用字节数组作为缓冲的流 > 使用原生缓冲的流 > 不使用缓冲的流1 2 3 4//计算时延 long start=System.currentTimeMillis(); long end=System.currentTimeMillis(); System.out.println(end-start);

后记

使用缓冲字节流复制确实是最快的方式,但对于小文件10M以下的文件体现不出优势,对于百兆文件正确使用,时间可以控制到50ms内复制文件最快的做法是将批量读取到的字节数组使用缓冲写入到文件,在机器性能范围内字节数组越大越快。在循环写入的过程中不需要使用flush,缓冲输入流在关闭的时候会将所有缓冲区的数据全部写入文件,使用flush刷新缓冲就失去了缓冲的意义。最后关闭IO流和文件流应该在finally中关闭,否则IO异常时执行不到close语句,IO流仍然没有关闭。

|:----|:----|

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏蜉蝣禅修之道

java解析xml技术(二)

13820
来自专栏Hongten

java开发_模仿百度文库_SWFTools_源码下载

在之前有做了一篇文章:java开发_模仿百度文库_OpenOffice2PDF_源码下载

11120
来自专栏闻道于事

JavaWeb(二)jsp运行原理,九大内置对象

JSP运行原理: 每个JSP页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理。JSP引擎先将JSP翻译成一个_jspServ...

42760
来自专栏10km的专栏

java:学习commons-configuration2读取配置文件xml,properties

commons-configuration是apache为java应用程序提供的一个通用的配置文件管理接口,可以支持多种配置文件格式: Properties ...

46350
来自专栏Danny的专栏

【SpringDataJPA】——SpringDataJPA入门实例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

14920
来自专栏Java架构沉思录

优雅实现延时任务之zookeeper篇

在《优雅实现延时任务之Redis篇》一文中提到,实现延时任务的关键点,是要存储任务的描述和任务的执行时间,还要能根据任务执行时间进行排序,那么我们可不可以使用z...

40130
来自专栏noteless

[四] JavaIO之类层次体系结构横向比对

比如ByteArrayInputStream和ByteArrayOutputStream  接下来我们还会详细的介绍到

15830
来自专栏noteless

[二十一]JavaIO之BufferedReader 与 BufferedWriter

BufferedReader  从字符输入流中读取文本,内部缓冲各个字符,从而实现字符、数组和行的高效读取

18010
来自专栏转载gongluck的CSDN博客

UNPv13:#第3章#套接字编程简介

IPv4套接字地址结构 POSIX规范只要求3个字段:sin_family、sin_addr和sin_port。 #include <netinet/in.h>...

34750
来自专栏吴柯的运维笔记

48个Shell脚本小技巧(二)

23. 产生一个随机数 代码如下: echo $RANDOM 24. 按照模式split 文件 代码如下: csplit server.log ...

34970

扫码关注云+社区

领取腾讯云代金券