Java中的IO流主要分为四类:字节流、字符流、字节缓冲流和字符缓冲流

输入和输出

字符流

字符流是专门为读取文本数据而生的

FileReader类

这是字符输入流,用来将文件中的字符数据读取到程序中来

创建字符输入流通道

FileReader(File file) 创建字符输入流管道与源文件接通
FileReader(String pathname) 创建字符输入流管道与源文件接通

FileReader读取文件的步骤如下:

//第一步:创建FileReader对象与要读取的源文件接通
//第二步:调用read()方法读取文件中的字符
//第三步:调用close()方法关闭流

read()

每次读取一个字符返回,没有发现没有数据可读会返回-1

read(char[] buffer)

每次会一个字符数组去读取数据,返回字符数读取了多少个字符,如果没有发现数据可读会返回-1

read()的应用

public class FileReaderTest1 {
    public static void main(String[] args)  {
        try (
                // 1、创建一个文件字符输入流管道与源文件接通
                Reader fr = new FileReader("text.txt");
         ){
                // 2、一个字符一个字符的读(性能较差)
        // 记住每次读取的字符编号。
               int c;
               while ((c = fr.read()) != -1){
                    System.out.print((char) c);
                }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

read(byte[] buffer)的应用

public class FileReaderTest1 {
    public static void main(String[] args)  {
        try (
              //创建一个文件字符输入流管道与源文件接通
              Reader fr = new FileReader("io-app2\\src\\itheima01.txt");
        ){
            //每次读取多个字符。(性能是比较不错的!)
            char[] buffer = new char[3];
            int len; // 记住每次读取了多少个字符。
            while ((len = fr.read(buffer)) != -1){
                // 读取多少倒出多少
                System.out.print(new String(buffer, 0, len));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

FileWriter类

它可以将程序中的字符数据写入文件

FileWriter往文件中写字符数据的步骤如下:

第一步:创建FileWirter对象与要读取的目标文件接通
第二步:调用write(字符数据/字符数组/字符串)方法读取文件中的字符
第三步:调用close()方法关闭流

创建字节输出流管道与源文件对象接通

//会覆盖原文件内容
FileWriter(File file) 创建字节输出流管道与源文件对象接通
FileWirter(String filePath) 创建字节输出流管道与源文件对象接通

//可以追加内容
FileWriter(File file,boolean append) 创建字节输出流管道与源文件对象接通 可以追加内容
FileWirter(String filePath,boolean append) 创建字节输出流管道与源文件对象接通 可以追加内容

write(int c)

写一个字符

write(String str)

写一个字符串

write(String str,int off,int len)

写一个字符串的一部分

wirte(char[] cbuf)

写入一个字符数组

wirte(char[] cbuf,int off,int len)

写入字符数组的一部分

前提

try (
// 0、创建一个文件字符输出流管道与目标文件接通。
// 覆盖管道
// Writer fw = new FileWriter("io-app2/src/itheima02out.txt");
 // 追加数据的管道
Writer fw = new FileWriter("io-app2/src/itheima02out.txt", true);
){
//下面内容
} catch (Exception e) {
   e.printStackTrace();
}

write(int c)的应用

// 1、public void write(int c):写一个字符出去
fw.write('a');
fw.write(97);
//fw.write('磊'); // 写一个字符出去
fw.write("\r\n"); // 换行

write(String str)的应用

// 2、public void write(String c)写一个字符串出去
fw.write("我爱你中国abc");
fw.write("\r\n");

write(String str,int off,int len)的应用

// 3、public void write(String c ,int pos ,int len):写字符串的一部分出去
fw.write("我爱你中国abc", 0, 5);
fw.write("\r\n");

wirte(char[] cbuf)的应用

// 4、public void write(char[] buffer):写一个字符数组出去
char[] buffer = {'黑', '马', 'a', 'b', 'c'};
fw.write(buffer);
fw.write("\r\n");

wirte(char[] cbuf,int off,int len)

// 5、public void write(char[] buffer ,int pos ,int len):写字符数组的一部分出去
fw.write(buffer, 0, 2);
fw.write("\r\n");

字节流

字节流就是以字节为单位操作数据的流。

FileOutputStream

创建字节流输出通道

FileOutputStream(File file) //基于一个File封装一个FileOutputStream对象
FileOutputStream(String pathName) //基于一个字符串格式的文件路径封装一个FileOutputStream对象

write(int b)

把指定的内容写入文件

write(byte[] b)

一次写一个字节数组数据到指定位置(文件)

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

一次写一个字节数组的部分到指定位置(文件)

前提

常见一个字节输出流
FileOutputStream fos = new FileOutputStream("a.txt",true);

write(int b)的应用

//写出数据,每次写一个字节
// void write(int b)  把指定的内容写入文件
fos.write(97);
fos.write(98);
fos.write(99);
fos.write(48);

write(byte[] b)的应用

//写出数据,每次写一个字节数组
// void write(byte[] b)                一次写一个字节数组数据到指定位置(文件)
fos.write(new byte[]{97,98,99});

write(byte[] b,int off,int len)的应用

一次写一个字节数组的部分到指定位置(文件)
// fos.write(new byte[]{-28, -72, -83, -27, -101, -67},0,3);
fos.write(new byte[]{-28, -72, -83, -27, -101, -67},3,3);

注意事项

  1. 创建字节输出流(FileOutputStream)对象,会去关联一个文件并进行一些基础的操作。

    • 如果文件不存在,就创建空白文件;
    • 如果文件存在且有内容,默认清空文件内容;

      • 如果不想文件内容被清空,就在创建对应输出流对象的时候,指定第二个参数为true,表示追加写入。
  2. 写数据

    • 写出的整数,实际写出的是整数作为编码值在码表上对应的字符;
    • 可以写入多个字节(一个字节数组或者一个字节数组的部分内容);
    • 如果需要换行就写入"\r\n".getBytes()
  3. 释放资源

    • Java程序操作文件时会独占关联的文件,每次使用完流必须要释放资源。否则其他程序将不能正确访问该文件;

FileInputStream

基于一个字符串格式的文件路径封装一个FileInputStream对象

read()

从文件中读取一个字节,值为字节的编码值

read(byte[] bytes)

从文件中读取一个字节数组的内容,并传入形参,返回读取到的字节数,否则为-1

readAllBytes()

读取文件中所有内容并转换为字节数组返回

前题

FileInputStream fis = new FileInputStream("a.txt");

read()的应用

int read()   从文件中读取一个字节,返回值为字节的码表值

read(byte[] bytes)的应用

byte[] bytes = new byte[1024];
int len = fis.read(bytes);
// 打印字节数组,看到大量的默认值0  bytes = [97, 98, 99, 100, 101, 102, 103, 0, 0, ...]
// System.out.println("bytes = " + Arrays.toString(bytes));

// 转换成字符串,会出现大量乱码  abcdefg后面有一大堆方块
// String str = new String(bytes);

// 不想出现乱码,就要控制转换的长度,只转换读取到的有效内容 str = abcdefg
String str = new String(bytes,0,len);
System.out.println("str = " + str);

readAllBytes()的应用

//  byte[] readAllBytes()   读取文件中所有内容并转换为字节数组返回
byte[] allBytes = fis.readAllBytes();

String str = new String(allBytes);

注意事项

  1. 创建字节输入流(FileInputStream)对象,会去关联一个文件并进行一些基础的操作。

    • 如果文件不存在,就报错;
  2. 读数据

    • read():读取的内容默认得到的是该数据的编码值,读取到文件末尾则返回-1
    • read(byte[] bytes):读取到多个字节并存入字节数组中,返回成功读取的字节个数;读取到文件末尾返回-1
      在使用返回的数组时,一定要注意使用读取到的有效字节个数,否则数据有误。
  3. 释放资源

    • Java程序操作文件时会独占关联的文件,每次使用完流必须要释放资源。否则其他程序将不能正确访问该文件。

字节缓冲流

字符缓冲流

序列化

反序列化

最后修改:2023 年 05 月 16 日
如果觉得我的文章对你有用,请随意赞赏