美文网首页
Java 基础 41 IO(字节流)

Java 基础 41 IO(字节流)

作者: 小熊先生很不开心 | 来源:发表于2018-02-03 11:56 被阅读8次

1.1 IO流的概述和分类

1.1.1 IO流

  IO可以拆开来理解

  • I ---- Input -> 输入 -> 读取
  • O ---- Output -> 输出 -> 写出

  读取和写出都是针对数据而言的, 所以, IO流就是用来处理设备之间的数据传输。

常见应用

  • 文件复制
  • 文件上传
  • 文件下载

1.1.2 IO流的分类

  • 按照类型分:
    • 字节流
    • 字符流(字符流数据通过Windows自带的记事本软件打开是可以读懂里面内容的)
  • 按照流向分:
    • 输入流: 用来读取数据的:
    • 输出流 : 用来写出数据的

1.2 FileOutputStream写数据

1.2.1 字节流&字符流的抽象父类

字节流:
InputStream 字节输入流
OutputStream 字节输出流
字符流:
Reader 字符输入流
Writer 字符输出流

1.2.2 字节流写出数据

  • 字节流写数据

    • OutputStream:此抽象类是表示输出字节流的所有类的超类
    • FileOutputStream:文件输出流是用于将数据写入 File
  • 构造方法:

    • FileOutputStream(String name):
      • 创建一个向具有指定名称的文件中写入数据的输出文件流。
  • 字节流写数据的步骤:

    • 创建字节输出流对象
    • 调用写数据的方法
    • 释放资源

1.2.3 案例代码

public class FileOutputStreamDemo {
    public static void main(String[] args) throws IOException {
        //创建字节输出流对象
        FileOutputStream fos = new FileOutputStream("a.txt");
        /*
         * 创建字节输出流对象做了这样的三件事情:
         * A:调用系统功能创建了文件
         * B:创建字节输出流对象
         * C:让fos这个对象指向a.txt这个文件
         */
        
        //write(int b) 
        fos.write(65);
        fos.write(66);
        
        //最后我们还要做一个事情
        //close() 关闭此文件输出流并释放与此流有关的所有系统资源。
        fos.close();
    }
}

1.3 FileOutputStream写数据的三种方式.

1.3.1 方法摘要

写出数据的三个方法:

* public void write(int b):一次写一个字节
  * public void write(byte[] b):一次写一个字节数组
  * public void write(byte[] b,int off,int len):一次写一个字节数组的一部分

String类中的方法

* byte[] getBytes()  将字符串转换为字节数组

1.3.2 案例代码

public class FileOutputStreamDemo2 {
    public static void main(String[] args) throws IOException {
        //创建字节输出流对象
        //FileOutputStream(String name) 
        FileOutputStream fos = new FileOutputStream("b.txt");
        //new File(name)
//      FileOutputStream fos = new FileOutputStream(new File("b.txt"));
        
        //FileOutputStream(File file) 
//      File file = new File("b.txt");
//      FileOutputStream fos = new FileOutputStream(file);
//      FileOutputStream fos = new FileOutputStream(new File("b.txt"));
        
        //public void write(int b):一次写一个字节
//      fos.write(65);
        
        //public void write(byte[] b):一次写一个字节数组
//      byte[] bys = {65,66,67,68,69};
//      fos.write(bys);
        //需求:我如果是一个字符串的数据,能写吗?
        //String -- byte[]
        //String类中有一个方法:public byte[] getBytes()
//      byte[] bys = "ABCDE".getBytes();
//      fos.write(bys);
//      fos.write("ABCDE".getBytes());
        
        //public void write(byte[] b,int off,int len):一次写一个字节数组的一部分
        fos.write("ABCDE".getBytes(),0,3);
        
        //释放资源
        fos.close();
    }
}

1.4 FileOutputStream如何实现换行和追加写数据

1.4.1 如何实现数据的换行

  不同的操作系统,针对换行的符号识别是不一样的。

  • windows:\r\n
  • linux:\n
  • mac:\r

1.4.2 如何实现数据的追加写入?

用构造方法带第二个参数是true的情况即可

1.4.3 案例代码

public class FileOutputStreamDemo3 {
    public static void main(String[] args) throws IOException {
        //创建字节输出流对象
        //FileOutputStream fos = new FileOutputStream("c.txt");
        //FileOutputStream(String name, boolean append) 
        //如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处
        FileOutputStream fos = new FileOutputStream("c.txt",true);
        
        //调用写数据的方法
        for(int x=0; x<10; x++) {
            fos.write("hello".getBytes());
            //加入换行符号
            fos.write("\r\n".getBytes());
        }
        
        //释放资源
        fos.close();
    }
}

1.5 FileOutputStream写数据加入异常处理

1.5.1 try..catch.finally

格式:

try{
    可能发生问题的代码
}catch(){
    处理异常代码
}finally{
    一定会被执行的代码.   // 通常用于释放资源, 做善后的动作
}

1.5.2 案例代码


public class FileOutputStreamDemo4 {
    public static void main(String[] args) {
        FileOutputStream fos = null;
        try{
            //FileOutputStream fos = new FileOutputStream("d.txt");
//          fos = new FileOutputStream("z:\\d.txt");
            fos = new FileOutputStream("d.txt");
            fos.write("hello".getBytes());
        }catch(IOException e) {
            e.printStackTrace();
        }finally {
            if(fos!=null) {
                //释放资源
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

1.6 FileInputStream读数据方式1一次读取一个字节

1.6.1 字节流读取数据的三个步骤

  • 字节流读数据的步骤:
    • 创建字节输入流对象
    • 调用读数据的方法
    • 释放资源

1.6.2 案例代码

public class FileInputStreamDemo {
    public static void main(String[] args) throws IOException {
        //创建字节输入流对象
        FileInputStream fis = new FileInputStream("a.txt");
        int by;
        // 用by不断的记录读取到的每一个数据
        while((by=fis.read())!=-1) {
            System.out.print((char)by);
        }
        //释放资源
        fis.close();
    }
}

1.7 FileInputStream读数据方式2一次读取一个字节数组

1.7.1 方法摘要

public int read(byte[] b):

  • 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中
  • 返回值是读入缓冲区的字节总数,也就是实际的读取个数
  • 如果因为已经到达文件末尾而没有更多的数据,则返回 -1。

1.7.2 案例代码

public class FileInputStreamDemo2 {
    public static void main(String[] args) throws IOException {
        //创建字节输入流对象
        FileInputStream fis = new FileInputStream("b.txt");
        byte[] bys = new byte[1024]; //1024或者1024的整数倍
        int len;
        //将数据读取到数组中, 并用len记录读取到的有效字节个数
        while((len=fis.read(bys))!=-1) {
            System.out.print(new String(bys,0,len));
        }
        //释放资源
        fis.close();
    }
}

1.8 字节流练习之复制文本文件

  • 需求: 拷贝文本文件
  • 分析:
    • 创建输入输出流对象关联数据源和数据目的
    • 定义字节数组,为了提高效率
    • 将数据通过while循环不断读取到字节数组中
    • 将数据从字节数组中取出并写出
    • 释放资源

1.8.1 案例代码

public class CopyTxtTest {
    public static void main(String[] args) throws IOException {
        //封装数据源
        FileInputStream fis = new FileInputStream("d:\\窗里窗外.txt");
        //封装目的地
        FileOutputStream fos = new FileOutputStream("林青霞.txt");
        
        //读写数据
        //方式1:一次读取一个字节
//      int by;
//      while((by=fis.read())!=-1) {
//          fos.write(by);
//      }
        
        //方式2:一次读取一个字节数组
        byte[] bys = new byte[1024];
        int len;
        while((len=fis.read(bys))!=-1) {
            fos.write(bys, 0, len);
        }
        
        //释放资源
        fos.close();
        fis.close();
    }
}

1.9 字节流练习之复制图片


public class CopyJpgTest {
    public static void main(String[] args) throws IOException {
        // 封装数据源
        FileInputStream fis = new FileInputStream("d:\\mn.jpg");
        // 封装目的地
        FileOutputStream fos = new FileOutputStream("mn.jpg");

        // 读写数据
        // 方式1:一次读取一个字节,一次写一个字节(自己练习)
        // 方式2:一次读取一个字节数组,一次写一个字节数组的一部分
        byte[] bys = new byte[1024];
        int len;
        while ((len = fis.read(bys)) != -1) {
            fos.write(bys, 0, len);
        }

        // 释放资源
        fos.close();
        fis.close();
    }
}

相关文章

  • Java 基础 41 IO(字节流)

    1.1 IO流的概述和分类 1.1.1 IO流   IO可以拆开来理解 I ---- Input -...

  • Java基础之IO流

    ##Java基础之IO流IO流常用几个类的关系如下: 字节流 字节输入流FileInputStream 读取文件用...

  • Java基础之IO流

    Java基础之IO流 简单介绍Java中有两种IO流,第一种是以Steam结尾的字节流,第二种是以Writer或者...

  • Socket文件传输

    服务器端(字节流): import java.io.BufferedReader;import java.io.B...

  • Java NIO:Buffer

    Java NIO(New IO)是一个可以替代标准Java IO API的IO API,标准IO基于字节流河字符流...

  • 字节流与缓冲流

    java零基础入门-高级特性篇(十二) IO 流 2 本章先来看两大“流”派中的字节流。字节流相对字符流总体结构简...

  • java 复制图片

    在学习了java IO 的基本理论之后做如下总结:1、java的IO操作分为字节流和字符流两种方式。字节流可以传输...

  • java io 流

    java io 流 io 流总览 io 流主要提供四个接口 InputStream: 输入字节流 OutputSt...

  • 从0开始复习java(9)--IO

    Java的io通过java.io包下的类和接口支持。主要有输入、输出流,又分为字节流和字符流。Java的io流使用...

  • Java IO流的使用

    下面部分内容是参考Oubo的博客——Java IO流学习总结 Java流操作有关的类或者接口: 字符流和字节流 字...

网友评论

      本文标题:Java 基础 41 IO(字节流)

      本文链接:https://www.haomeiwen.com/subject/hyhuzxtx.html