【java基础】IO流(一):字节流的FileOutputStream(文件字节输出流)和 Filelnputstream(文件字节输入流)

目录

1、IO流概述及其体系

1.1、 IO流的分类

1.2、IO流体系

2、字节流

2.1、FileOutputStream(文件字节输出流)

2.2、Filelnputstream(文件字节输入流) 

 3、FileOutputStream 和 Filelnputstream 的综合示例

3.1、文件拷贝:把aaa.txt里的内容拷贝到bbb.txt中

3.2、文件拷贝plus:把aaa.txt里的内容拷贝到bbb.txt中,并且实现捕获异常,含自动关闭通道的书写方法

 3.2.1、用finally代码块确保一定关闭通道的方法示例:

 3.2.2、自动关闭通道的书写方法

1、IO流概述及其体系

一个程序总是离不开数据的输入(Input)输出(IO),而Java IO流就是用于程序从外部读取数据,以及向外部写出数据的java处理包。以流的方式进行输入输出的操作就是IO(Input Output)流。流是一个抽象的概念,它是一串连续动态的数据集合,可以将流理解为水管,而数据就是水,水通过水管从一端流到另一端。

1.1、 IO流的分类

1.安流的方向分类可以分为输入流和输出流

        输入流:侧重于读,数据从数据源读入程序。
        输出流:侧重于写,数据从程序写出到目的地。

2. 按处理的数据单元分类可以分为字节流和字符流

        字节流:以 字节(1Byte=8bit) 为单位进行读取或者写出数据。

        字符流:以 字符为单位进行读取或者写出数据。

字节流能操作所有类型的文件,而字符流只能操作纯文本文件

纯文本文件:Windows自带的记事本打开能读懂的就是纯文本文件,比如:txt文件,md文件,xml文件,lrc文件等

1.2、IO流体系

2、字节流

因为 InputStream 类和 OutputStream 类都是抽象类,不能直接创建它们的对象,得看它们的子类:FileOutputStream(文件字节输出流)和 Filelnputstream(文件字节输入流)

2.1、FileOutputStream(文件字节输出流)

FileOutputStream是操作本地文件的字节输出流,可以把程序中的数据写到本地文件中。

字节输出流的注意点:

1、创建字节输出流对象

        注意点1:参数是字符串表示的路径或者是File对象都是可以的

        注意点2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的

        注意点3:如果文件已经存在,则文件里原有的内容会被本次要写入的内容覆盖

2、写数据

        注意点:write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符

3、释放资源

        每次使用完流之后都要释放资源,否则java会一直占用着这个资源

FileOutputStream的三种输出方式

void write(int b)

一次写一个字节数据

void write(byte[ ] b)

一次写一个字节数组数据

void write(byte[ ] b, int off, int len)

一次写一个字节数组的部分数据

 (byte[ ] b, int off, int len) 参数一:保存要被写入数据的数组;参数二:起始索引;参数三:个数

IO流-FileOutputStream-换行和续写

换行写:再次写出一个换行符就可以了,windows系统里 \r\n是完整的换行, \r 是回车,\n 是换行;Linux系统里 \n 是换行;Mac:系统里 \r 是换行

细节:在windows操作系统当中,java对回车换行进行了优化。虽然完整的是\r\n,但是我们写其中一个\r或者\n,java也可以实现换行,因为java在底层会补全。

建议:不要省略,还是写全了

续写:如果想要续写,打开续写开关即可,开关位置在创建对象的第二个参数,默认false表示关闭续写,此时创建对象会清空文件,手动传递true表示打开续写,此时创建对象不会清空文件

FileOutputStream示例代码: 

public static void main(String[] args) throws IOException {
    /*
    换行写:
        再次写出一个换行符就可以了
        windows: \r\n  \r是回车,\n是换行
        Linux: \n
        Mac: \r
        提示:在windows操作系统当中,java对回车换行进行了优化。
            虽然完整的是\r\n,但是我们写其中一个\r或者\n,java也可以实现换行,
            因为java在底层会补全。
        建议:不要省略,还是写全了,
    续写:
            如果想要续写,打开续写开关即可
            开关位置:创建对象的第二个参数
            默认false:表示关闭续写,此时创建对象会清空文件
            手动传递true:表示打开续写,此时创建对象不会清空文件
     */
    //1.创建对象,并且开启续写
    FileOutputStream fos = new FileOutputStream("..\\javaEEStudy\\aaa.txt",true);
    //2.写出数据
    String str = "liaotaodashuaige";
    byte[] bytes1 = str.getBytes();//把字符串str转换成字节数组bytes1
    fos.write(bytes1);//一次写一个字节数组数据,数组为bytes1

    String wrap = "\r\n";//要换行就写出一个换行符就可以了
    byte[] bytes2 = wrap.getBytes();
    fos.write(bytes2);

    String str2 = "666";
    byte[] bytes3 = str2.getBytes();
    fos.write(bytes3);

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

 运行两次代码后的结果:这时发现第一次写入的内容没有被覆盖

 

FileOutputStream总结:

1、FileOutputStream的作用就是可以把程序中的数据写到本地文件上,是字节流的基本流

2、书写步骤:创建对象,写出数据,释放资源

3、三步操作的注意点

        创建对象:文件存在、文件不存在、追加写入

        写出数据:写出整数、写出字节数组、换行写

        释放资源:要关闭通道

2.2、Filelnputstream(文件字节输入流) 

Filelnputstream读取字节的方法 

public int read()

一次读一个字节数据

public int read(bytel buffer)

一次读一个字节数组数据

注意:

        1、一次读一个字节数组的数据,每次读取会尽可能把数组装满,所以一般会创建长度为1024整数倍大小的字节数组

        2、FileInputStream的read( )方法一次读写一个字节,速度慢

Filelnputstream书写步骤:

        1、创建字节输入流对象:如果文件不存在,就直接报错

        2、读取数据:一次读一个字节,读出来的是数据在ASCII上对应的数字;读到文件末尾了,read方法返回-1

        3、释放资源:每次使用完流必须要释放资源

 Filelnputstream一次读多个字节的方法示例:

//创建对象
FileInputStream fis = new FileInputStream("..\\javaEEStudy\\aaa.txt");//文件中的内容为:abcde
//读取数据
byte[] bytes = new byte[3];
//一次读取多个字节数据,具体读多少,跟数组的长度有关
//返回值:本次读取到了多少个字节数据
int len1 = fis.read(bytes);
String s1 = new String(bytes);//把字节数组转换成字符串
System.out.println("第一次读取到"+ len1 +"个数据,为:"+ s1);//第一次读取到3个数据,为:abc

int len2 = fis.read(bytes);
String s2 = new String(bytes);//把字节数组转换成字符串
System.out.println("第二次读取到"+ len2 +"个数据,为:"+ s2);//第二次读取到2个数据,为:dec

 运行结果

因为 fis 在第二次读取内容时,只能从aaa.txt中读取出 d e 这两个数据,所以就把 d e 这两个数据读取出来,并分别放到字节数组 bytes 数组中的 0 和 1 索引处,而 2 索引处还是原来第一次读取数据时所放入的 c ,所以第二次的输出结果为 dec 

改进后的代码和结果:

String s1 = new String(bytes); 改成 String s1 = new String(bytes, 0, len1);

String s2 = new String(bytes); 改成 String s2 = new String(bytes, 0, len2);

 

 3、FileOutputStream 和 Filelnputstream 的综合示例

3.1、文件拷贝:把aaa.txt里的内容拷贝到bbb.txt中

一个字节一个字节拷贝的方法示例: 

//1.创建对象
FileInputStream fis = new FileInputStream("..\\javaEEStudy\\aaa.txt");
FileOutputStream fos = new FileOutputStream("..\\javaEEStudy\\bbb.txt");
//2.拷贝
//核心思想:边读边写
int b;
while ((b = fis.read()) != -1) {
    fos.write(b);
}
//3.释放资源
//规则:先开的最后关闭
fos.close();
fis.close();

3.2、文件拷贝plus:把aaa.txt里的内容拷贝到bbb.txt中,并且实现捕获异常,含自动关闭通道的书写方法

在捕获异常时,不管前面的try有没有捕获到异常,被finally控制的语句一定会执行,除非IVM退出,所以要把资源释放的代码写在finally控制的语句中,确保资源一定会被释放 

 3.2.1、用finally代码块确保一定关闭通道的方法示例:

public static void main(String[] args) throws IOException {
    //1.创建对象
    FileInputStream fis = null;
     fos = null;
    try {
        fis = new FileInputStream("..\\javaEEStudy\\aaa.txt");
        fos = new FileOutputStream("..\\javaEEStudy\\bbb.txt");
        //2.拷贝
        int len;
        byte[] bytes = new byte[3];
        while ((len = fis.read(bytes)) != -1) {
            fos.write(bytes,0,len);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        //3.释放资源
        if (fos != null) {
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (fis != null) {
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 3.2.2、自动关闭通道的书写方法

JDK7:IO流中捕获异常的写法

try后面的小括号中写创建对象的代码,

注意:只有实现了Autocloseable接口的类,才能在小括号中创建对象。

写法:

try(创建流对象1;创建流对象2){

        可能出现异常的代码;

} catch(异常类名 变量名){

        异常的处理代码;

} 资源用完最终自动释放

 自动关闭通道的方法示例:

public static void main(String[] args) throws IOException {
    
    try (FileInputStream fis = new FileInputStream("..\\javaEEStudy\\aaa.txt");
         FileOutputStream fos = new FileOutputStream("..\\javaEEStudy\\bbb.txt")) {
        //拷贝
        int len;
        byte[] bytes = new byte[3];
        while ((len = fis.read(bytes)) != -1) {
            fos.write(bytes,0,len);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

 

JDK9:IO流中捕获异常的写法

try后面的小括号中写创建对象的代码,

注意:只有实现了Autocloseable接口的类,才能在小括号中创建对象。

写法:

创建流对象1;

创建流对象2;

try(流1;流2){

        可能出现异常的代码;

} catch(异常类名 变量名){

        异常的处理代码;

} 资源用完最终自动释放

 示例代码:

public static void main(String[] args) throws IOException {

    FileInputStream fis = new FileInputStream("..\\javaEEStudy\\aaa.txt");
    FileOutputStream fos = new FileOutputStream("..\\javaEEStudy\\bbb.txt");
    try (fis; fos) {
        //拷贝
        int len;
        byte[] bytes = new byte[3];
        while ((len = fis.read(bytes)) != -1) {
            fos.write(bytes,0,len);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

关于字符流内容会写在下一章 !!!

 

 推荐:

【java基础】异常处理机制-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/136581375?spm=1001.2014.3001.5501【计算机网络】DHCP原理与配置-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/136230649?spm=1001.2014.3001.5501【数据结构】二叉查找树和平衡二叉树,以及二者的区别_二叉查找树和其他二叉树的区别-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/136137098?spm=1001.2014.3001.5501

  • 17
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: 文件字节IO流Java中用于读写文件的一种方式,可以通过字节流来读取和写入文件。合并文件是将多个文件合并成一个文件的过程,可以使用文件字节IO流来实现。 具体实现步骤如下: 1. 创建一个输出,用于将多个文件合并成一个文件。 2. 创建多个输入,用于读取多个文件的内容。 3. 从每个输入中读取数据,并将数据写入输出中。 4. 关闭输入输出。 示例代码如下: ```java import java.io.*; public class MergeFiles { public static void main(String[] args) { try { // 创建输出 FileOutputStream fos = new FileOutputStream("merged.txt"); // 创建输入 FileInputStream fis1 = new FileInputStream("file1.txt"); FileInputStream fis2 = new FileInputStream("file2.txt"); // 合并文件 byte[] buffer = new byte[1024]; int len; while ((len = fis1.read(buffer)) != -1) { fos.write(buffer, , len); } while ((len = fis2.read(buffer)) != -1) { fos.write(buffer, , len); } // 关闭 fis1.close(); fis2.close(); fos.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 以上代码将文件file1.txt和file2.txt合并成一个文件merged.txt。在实际应用中,可以根据需要合并多个文件。 ### 回答2: 文件合并是指将多个文件的内容合并到一个文件中,常用于将多个小文件合并成一个大文件或将分割的大文件恢复成原始文件。在Java中,可以使用文件字节IO流实现文件的读写和合并。 文件字节IO流Java中最基本的IO流,它通过字节来读写文件,常用的类有FileInputStreamFileOutputStream、RandomAccessFile等。需要注意的是,文件合并必须确保合并后的文件占用空间足够存储源文件的内容,否则会导致数据丢失。 实现文件合并的步骤如下: 1. 创建一个输出,作为合并后文件输出。 2. 创建一个字节数组,用于存储源文件读取的数据。 3. 循环读取每个源文件,将读取的数据保存到字节数组中。 4. 每读取完一个源文件,就将字节数组中的数据写入输出中。 5. 重复步骤3和步骤4,直到所有源文件的内容都被读取且写入到输出中。 6. 关闭所有的输入输出,完成文件合并。 下面是一个文件合并的示例代码: ``` public class FileMerge { public static void merge(String[] files, String target) { try { OutputStream outputStream = new FileOutputStream(target); byte[] buffer = new byte[1024]; int length; for (String file : files) { InputStream inputStream = new FileInputStream(file); while ((length = inputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, length); } inputStream.close(); } outputStream.close(); } catch (IOException e) { System.out.println("文件合并出错:" + e.getMessage()); } } } ``` 以上代码中,merge方法接收一个字符串数组files和一个目标文件名target,files为需要合并的多个文件文件名数组,target为合并后的目标文件名。 在方法中,首先创建一个输出outputStream,用于写入目标文件的内容。然后创建一个字节数组buffer,用于存储源文件读取的数据。接下来使用for循环遍历所有的源文件,读取每个源文件的内容并保存到字节数组buffer中,然后使用输出outputStream将buffer中的数据写入到目标文件中,重复读取并写入操作,直到所有源文件的内容都被合并到目标文件中。最后关闭所有的输入输出。 总之,文件合并是Java中常用的操作之一,使用文件字节IO流可以快速实现。同时需要注意文件大小和空间,确保合并后的文件可以存储所有源文件的内容,避免数据丢失。 ### 回答3: Java提供了许多操作文件的类和方法,其中文件字节IO流允许我们按字节读写文件内容。在文件处理过程中,合并多个文件成为一个文件的操作是非常常见的。本文将介绍如何使用Java文件字节IO流来合并文件。 首先,我们需要打开需要合并的文件并创建一个输出文件。代码如下: ``` FileInputStream fis1 = new FileInputStream("file1.txt"); FileInputStream fis2 = new FileInputStream("file2.txt"); OutputStream os = new FileOutputStream("output.txt"); ``` 接着,我们需要定义一个缓存区,该缓存区将逐个字节地从输入文件中读取内容并将其写入输出文件。代码如下: ``` byte[] buffer = new byte[1024]; int length; while ((length = fis1.read(buffer)) > 0) { os.write(buffer, 0, length); } while ((length = fis2.read(buffer)) > 0) { os.write(buffer, 0, length); } ``` 上述代码将file1.txt和file2.txt中的内容逐个字节地读取到缓存区中,并写入到输出文件output.txt中。这个过程将会把所有需要合并的文件全部合并到output.txt文件当中。 最后,我们需要关闭所有的对象,释放系统资源。代码如下: ``` fis1.close(); fis2.close(); os.close(); ``` 总体而言,将这些文件合并起来并不难,只需要按照上述步骤打开输入文件、创建输出文件、定义一个缓存区、逐个字节地读取内容并将其输出输出文件中即可。 在实际编程中,我们可以编写一个方法来自动合并文件。该方法将输入一个文件列表和输出文件路径,并将所有文件的内容合并到该输出路径中。这些代码可以用于处理非常大的文件,因为可以处理多个文件,并且只需要一次性读取和写入缓存区。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值