Java之IO流--字节流

1.1 什么是IO
生活中,你肯定经历过这样的场景。当你编辑一个文本文件,忘记了保存,可能文件就白白编辑了。当你电脑上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢?键盘、内存、硬盘、外界设备等等。

我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为输入和输出,即流向内存是输入流,流出内存的输出流。

Java中I0流操作主要指的是使用java.io包下的内容,进行输入,输出操作。输入也叫做读取数据,输出也叫做写出数据。

1.1 IO的分类
根据数据的流向分为:输入流和输出流

输入流:把数据从其他设备上读取到内存中的流。
输出流:把数据从内存中写到其他设备上的流。
格局数据的类型分类为:字节流和字符流
在这里插入图片描述
1.3字节流

1.3.1一切皆为字节
一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都是一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。

1.3.2字节输出流(OutputStream)
OutputStream是一个抽象类,是字节输出流所有的超类。它可以将指定的字节信息写出到文件中。它有一些共性的方法。

public abstract void write(int b) throws IOException:将指定的字节写入此输出流。 write的一般合同是将一个字节写入输出流。 要写入的字节是参数b的八个低位。 b的24个高位被忽略。

public void write(byte[] b) throws IOException:将b.length字节从指定的字节数组写入此输出流。

public void write(byte[] b, int off, int len) throws IOException:从指定的字节数组写入len字节,从偏移off开始输出到此输出流。

public void flush() throws IOException:刷新此输出流并强制任何缓冲的输出字节被写出。

public void close() throws IOException:关闭此输出流并释放与此流相关联的任何系统资源。

1.3.3文件字节输出流(FileOutputStream)

FileOutputStream把内存中的数据写入到硬盘的文件中。

构造方法:
FileOutputStream(String name):创建一个指定名称的文件写入到硬盘的文件中。
FileOutputStream(File file):创建一个指定File对象表示的文件中写入到硬盘的文件中。
参数:
String name:文件的路径(一般指的是绝对路径)
File file:一个文件
作用:
1创建一个FileOutputStream对象。
2会根据构造方法中传递的文件/文件路径,创建一个空的文件。
3会把FileOutputStream对象指向创建好的文件。
写入数据的原理
Java程序–>JVM–>OS(操作系统)–>OS调用写数据的方法–>把数据写入到文件中

我们可以看下面一段代码看看FileOutputSream的使用

package io;



import java.io.FileOutputStream;
import java.io.IOException;


public class FileOutputStreamDemo {
    public static void main(String[] args){

        try{
            //1创建FileOutputStream对象
            FileOutputStream  fileOutputStream=new FileOutputStream("D:\\java\\untitled1\\a.txt");
            //2调用FileOutputStream中write方法,写入数据
            fileOutputStream.write(97);
            //3释放资源
            fileOutputStream.close();
        }catch(IOException e){
            e.toString();
        }
        stream();
    }
    public static void stream(){
        try{
            //1创建FileOutputStream对象
            FileOutputStream  fileOutputStream=new FileOutputStream("D:\\java\\untitled1\\b.txt",false);
            //2调用FileOutputStream中write方法,写入数据
            for (int i=0;i<10;i++){
                fileOutputStream.write("你好".getBytes());
                fileOutputStream.write("\r\n".getBytes());
            }
            //3释放资源
            fileOutputStream.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

使用步骤:
1创建一个FileOutputStream对象,构造方法中传递写入到数据的目的。
2调用FileOutputStream对象中的方法write(),把数据写入到文件中。
3释放资源(流使用会占用一定的内存,使用完毕把内存清空,提高程序的效率)。

上面的方法只能写入一个数据,那如果写多个数据,有什么方法呢?我们可以使用字节数组byte[] b。
OutputStream中的方法write(byte[] b),就可以写入多个数据。我们看看下面一段代码示例:

package io;

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamDemo1 {
    public static void main(String[] args) {
        try{
            //1创建一个FileOutputStream对象
            FileOutputStream fileOutputStream=new FileOutputStream("D:\\java\\untitled1\\c.txt");
            //2写入数据
            byte[] bytes={65,66,67,68,69};
            fileOutputStream.write(bytes);
            //3释放资源
            fileOutputStream.close();
        }catch(IOException e){
            e.printStackTrace();
        }

    }
}

若想写入几个数据,就可以使用void write(byte[] b,int off,int len)。其中off表示数组的索引号,len表示数据的个数。代码如下:

package io;

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamDemo1 {
    public static void main(String[] args) {
        try{
            //1创建一个FileOutputStream对象
            FileOutputStream fileOutputStream=new FileOutputStream("D:\\java\\untitled1\\c.txt");
            //2写入数据
            byte[] bytes={65,66,67,68,69};
            fileOutputStream.write(bytes,0,3);
            //3释放资源
            fileOutputStream.close();
        }catch(IOException e){
            e.printStackTrace();
        }

    }
}

注意:
1如果写的第一个字节是正数(0-127),那么显示的时候查询ASCII表。
2如果写的第一个字节是负数,那么第一个字节会和第二个字节组成一个中文显示,查询系统封默认码表。

数据的追加写/续写:
1FileOutputStream(String name,boolean append)
2FileOutputStream(File file,boolean append)
参数:
boolean append
true: 创建对象不会覆盖源文件,继续在文件的末尾追加写数据。
false:创建一个新的文件,覆盖源文件。

package io;

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamDemo1 {
    public static void main(String[] args) {
        try{
            //1创建一个FileOutputStream对象
            FileOutputStream fileOutputStream=new FileOutputStream("D:\\java\\untitled1\\c.txt",true);
            //2写入数据
            byte[] bytes={65,66,67,68,69};
            fileOutputStream.write(bytes,0,3);
            //3释放资源
            fileOutputStream.close();
        }catch(IOException e){
            e.printStackTrace();
        }

    }
}

1.3.2字节输入流(InputStream)

InputStream是所有字节输入流的超类,它定义了一些共用的方法。
public abstract int read() throws IOException:从输入流读取数据的下一个字节。 值字节被返回作为int范围0至255 。

public int read(byte[] b) throws IOException:从输入流读取一些字节数,并将它们存储到缓冲区b 。

public int read(byte[] b,int off,int len) throws IOException从输入流读取len字节的数据到一个字节数组。
public void close() throws IOException关闭此输入流并释放与流相关联的任何系统资源。

FileInputStream(文件字节输入流)
作用:把硬盘文件中的数据读取到内存中使用。

构造方法:FileInputStream(String name),FileInputStream(File file).

参数:String name:文件路径,File file:源文件

构造方法的作用:
1创建一个FileInputStream对象
2会把FileInputStream对象指定构造方法中读取。

原理:Java程序–>JVM–>OS(操作系统)–>OS读取数据的方法–>读取文件

我们用一段代码解释上面的话语:

package io;

import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamDemo {
    public static void main(String[] args) {
        try{
            //1创建FileInputStream对象
            FileInputStream fileInputStream=new FileInputStream("D:\\java\\untitled1\\b.txt");
            //2调用read方法
            int len=0;
            while((len=fileInputStream.read())!=-1){
                System.out.println((char)len);
            }
            fileInputStream.close();
        }catch (IOException e){
            e.printStackTrace();
        }

    }
}

思路:
1创建一个FileInputStream对象,构造方法中绑定要读取的源文件
2使用read()方法,读取文件。
3释放资源

对于上面代码中(len=fileInputStream.read())!=-1,可以拆分为
1 fileInputStream.read() 读取一个字节
2 len=fileInputStream.read() 把读取到的字节赋值给变量len
3 (len=fileInputStream.read())!=-1:判断变量len是否不等于-1。

如果读取多个数据呢,可以用read(byte[] b)方法读取多个字节,用代码说明最清楚不过

package io;

import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamDemo1 {
    public static void main(String[] args) {
        try{
            //1创建FileInputStream对象
            FileInputStream fileInputStream=new FileInputStream("D:\\java\\untitled1\\b.txt");
            //2读取数据
            int length=0;
            byte[] bytes=new byte[1024];
            while ((length=fileInputStream.read(bytes))!=-1){
                System.out.println(new String(bytes,0,length));
            }
            fileInputStream.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

这里的用String方法是读取数据时会把数据转换为数字,也就是ASCII表中的数值,所以用String构造方法转换为源数据。

String构造方法:
1 String(byte[] b):把字节数组转换为字符串。
2 String(byte[] b,int offset,int length):把字节数组的一部分转换为字符串,offset:数组的索引号,length:转换字节的个数。

以上就是我写的文件输入/输出流的用法,下面我用一个综合案例来对这两个类使用说明,文件的复制。

文件复制

思路:
1 创建FileInputStream对象,构造方法中绑定要读取的文件
2 创建FileOutputStream对象,构造方法中绑定要写入的文件
3 使用read方法读取文件
4 使用write方法,把读取到的字节写入文件中
5 释放资源(先关FileInputStream,后关FileOutputStream)

代码如下:

package io;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopyDemo {
    public static void main(String[] args) {
        try{
            //1创建FileInputStream
            FileInputStream fileInputStream=new FileInputStream("D:\\java\\untitled1\\b.txt");
            //2创建FileOutputStream
            FileOutputStream fileOutputStream=new FileOutputStream("D:\\C语言\\a.txt");
            //3读取数据
            int length=0;
            byte[] bytes=new byte[1024];
            while((length=fileInputStream.read(bytes))!=-1){
                //4写入文件中
                fileOutputStream.write(bytes,0,length);
            }
            //释放资源
            fileInputStream.close();
            fileOutputStream.close();
        }catch (IOException e){
            e.printStackTrace();
        }

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值