Java_IO——字节流

系列文章目录

Java_IO——概述
Java_IO——字节流
Java_IO——字符流
Java_IO——缓冲流
Java_IO——属性集与转换流
Java_IO——序列化与反序列化、打印流
Java_IO——IO异常的处理



前言

一切数据在计算机中的底层传输与存储方式都是二进制的数字,都是一个个字节,所以字节流可以传输任意文件数据


输出流

OutputStream类(字节输出流)

java.io.OutputStream是抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地
它定义了字节输出流的所有共性方法:

  • public void close()
    关闭此输出流并释放与此流相关联的所有系统资源
  • public void flush()
    刷新此输出流并强制任何缓冲的输出字节被写出
  • public void write(byte[] b)
    将b.length字节从指定的字节数组写入此输出流
  • public void write(byte[] b,int off,int len)
    从指定的字节数组写入len字节,从偏移量off开始输出到此输出流(字节数组的一部分)

    参数:
    int off:数组开始的索引
    int len:写多少

  • public abstract void write(int b)
    将指定的字节输出流

注意:这些方法会抛出IOException

FileOutputStream类(文件字节输出流,字节输出流(OutputStream)的子类)

  • 把内存中的数据写入到硬盘中的文件中
  • 构造方法:
    • FileOutputStream(Strng name)
      创建一个具有指定名称的文件,写入数据的输出流
      参数:String name:文件的路径
    • FileOutputStream(File file)
      创建一个向指定File对象表示的文件中写入数据的流
      参数:File file:文件
  • 运行方式:
    1. 创建一个对象(FileOutputStream)
    2. 会根据构造方法中传递的文件/文件路径,创建一个空的文件
    3. 会把FileOutputStream对象指向创建好的文件
      注意:此类中的构造方法抛出了FileOutputStream异常

使用

写出字节数据:
  1. 创建一个FileOutputStream对象,构造方法中传递写入数据的目的地
  2. 调用FileOutputStream对象中的方法write,把数据写入到文件中
  3. 释放资源(流会占用一定的内存,使用完毕要释放内存,提高程序效率)
package DemoOutputStream;

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

public class Demo01OutputStream {
    public static void main(String[] args) throws IOException {
        //创建输出流,并获取文件路径
        FileOutputStream fos = new FileOutputStream("D:\\***\\a.txt");
        //调用write方法
        fos.write(97);
        //关闭输出流
        fos.close();
    }
}

多字节输出:

  • 可以将字节数据输入到字节数组中,再使用write方法
  • 字符写入:
    • 可以将String类中的方法:byte[] getBytes()把字符串,转换为字节数组

Tips:

  1. 若写的第一个字节是正数(0~127),那么显示时会查询ASCII表
  2. 若写的第一个字节是负数,那么第一个字节与第二个字节会组成一个中文显示,会查询系统默认码表(GBK)
package DemoOutputStream;

import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;

public class Demo02OutputStream {
    public static void main(String[] args) throws IOException {
        //创建输出流,并获取文件路径
        FileOutputStream fos1 = new FileOutputStream("D:\\***\\b.txt");

        //将数据转换为数组
        byte[] bytes1 = {-65,66,-67,68,69};
        System.out.println(Arrays.toString(bytes1));
        //调用write方法
        fos1.write(bytes1);

        //关闭输出流
        fos1.close();
    }
}
数据的追加续写:

使用构造方法:

  • FileOutputStream(Strng name,boolean append)
    创建一个向现有的指定文件name中写入数据的输出文件流
  • FileOutputStream(File file,boolean append)
    创建一个向file对象指定的现有的文件中写入数据的输出文件流

参数:

  • Strng name,File file:写入数据的目的地
  • boolean append:
    • true:不覆盖源文件,继续在文件的末尾追加数据
    • false:创建一个新文件,覆盖源文件

数据换行:

  • 写换行符号
    • windows:\r\n
    • linux:\n
    • mac:\r

Tip:换行符也是字符串,需要先存到字符数组中再写入文件

package DemoOutputStream;

import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class Demo03OutputStream {
    public static void main(String[] args) throws IOException {
        //创建一个向file对象指定的现有的文件中写入数据的输出文件流
        FileOutputStream fos = new FileOutputStream("D:\\***\\a.txt",true);
        //循环调用
        for (int i = 0; i < 10; i++) {
            fos.write("你好".getBytes());
            //数据换行
            fos.write("\r\n".getBytes());
        }
        关闭输出流
        fos.close();
    }
}

原理

java程序→JVM(java虚拟机)→OS(操作系统)→OS调用写数据的方法→把数据写入到文件中

图解:
在这里插入图片描述

输入流

InputStream类(字节输入流)

java.io.InputStream抽象类是表示字节输入流所有类的超类,可以读取字节信息到内存中

它定义了字节输入流的所有共性方法:

  • public void close()
    关闭此输出流并释放与此流相关联的所有系统资源
  • public abstract int read()
    从输入流读取数据的下一字节,读取后指针向下移一位,读到末尾返回-1
  • public int read(byte[] b)
    从输入流读取数据,并将它们存储到字节数组b中

FileInputStream类(文件字节输入流,字节输入流(InputStream))

从文件中读取字节

  • 构造方法:
    • FileInputStream(File file)
      参数:File file:文件
    • FileInputStream(String name)
      参数:String name:文件的路径

注意:这些方法会抛出IOException

  • 运行方式:
    1. 创建一个FileInputStream对象
    2. 把FileInputStream对象指定构造方法中要读取的文件

使用

输入字节数据:

  1. 创建FileInputStream对象,构造方法中绑定要读取的数据源
  2. 调用FileInputStream对象中的方法read,读取文件
  3. 释放资源

Tip:代码优化时,不知道有多少字节时,用while循环

package DemoInputStream;

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

public class Demo01InputStream {
    public static void main(String[] args) throws IOException {
        //创建FileInputStream对象,并绑定要读取的数据源
        FileInputStream fis = new FileInputStream("D:\\***\\c.txt");
        //初始化表识
        int len = 0;
        //while循环调用read方法
        while ((len = fis.read()) != -1) {
                System.out.print((char) len);
        }
        //关闭输入流
        fis.close();
    }
}

一次读取多个字节:

  1. 创建FileInputStream对象,构造方法中绑定要读取的数据源
  2. 调用FileInputStream对象中的方法read,读取文件
  3. 从输入流读取一定数量的字节,并将其储存在缓存数组b中
  4. 释放资源

Tip:
此方法可用于读取中文,输出时,可以新建字符串,使用String类中的构造方法,将byte数组转为字符串

数组转字符串方法(String类构造方法):

  • String(byte[] bytes)
  • String(byte[] bytes,int offset,int length)
    • 参数:
      • byte[] bytes:目标数组
      • int offset:起始索引
      • int length:转换个数
package DemoInputStream;

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

public class Demo02InputStream {
    public static void main(String[] args) throws IOException {
        //创建FileInputStream对象,并绑定要读取的数据源
        FileInputStream fis = new FileInputStream("D:\\***\\a.txt");
        //新建字节数组
        byte[] bytes = new byte[2];
        //调用read方法,并将读取到的字节存入数组
        int len = fis.read(bytes);
        System.out.println(len);
        System.out.println(Arrays.toString(bytes));
        System.out.println(new String(bytes));
        //关闭输入流
        fis.close();
    }
}

原理

Java程序→JVM→OS→OS调用读取数据的方法→读取文件

图解:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为你介绍一下如何使用 Java 编写程序实现文件拷贝。 Java 提供了非常方便的 I/O 类来处理文件读写操作。文件拷贝的基本思路是读取源文件中的数据,然后将数据写入到目标文件中。下面是一个简单的文件拷贝程序示例: ```java import java.io.*; public class FileCopy { public static void main(String[] args) throws IOException { // 源文件路径 String srcFilePath = "C:/temp/source.txt"; // 目标文件路径 String destFilePath = "C:/temp/dest.txt"; // 创建输入流和输出流 FileInputStream fis = new FileInputStream(srcFilePath); FileOutputStream fos = new FileOutputStream(destFilePath); // 定义缓冲区,每次读取 1024 个字节 byte[] buffer = new byte[1024]; int len; // 循环读取源文件中的数据,并将数据写入到目标文件中 while ((len = fis.read(buffer)) != -1) { fos.write(buffer, 0, len); } // 关闭输入流和输出流 fis.close(); fos.close(); System.out.println("文件拷贝完成!"); } } ``` 在上面的示例中,我们首先定义了源文件路径和目标文件路径。然后创建了输入流和输出流,用于读取源文件和向目标文件写入数据。我们定义了一个缓冲区,每次从输入流中读取 1024 个字节,并将这些字节写入到输出流中。最后,我们关闭输入流和输出流,并输出一条完成信息。 需要注意的是,上面的代码中使用了 try-catch 语句来捕获可能出现的 IOException 异常。这是因为在文件读写过程中可能会出现异常,比如文件不存在、文件无法读取等等。为了保证程序的健壮性,我们需要使用 try-catch 语句来处理这些异常。 希望这个简单的示例可以帮助你了解如何使用 Java 编写文件拷贝程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值