欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

IO流--字节流

程序员文章站 2024-03-04 15:36:41
...

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

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

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

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

输入流:把数据从其他设备上读取到内存中的流。
输出流:把数据从内存中写到其他设备上的流。
格局数据的类型分类为:字节流和字符流
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();
        }

    }
}

相关标签: Java常用类