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

       跟随博主脚步,从这里开始→博主主页

  • 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信
    您的点赞、关注、收藏⭐️、评论、私信是我最大的支持与鼓舞!!!

在这里插入图片描述

主要内容

1️⃣二进制I/O流
2️⃣ 文本I/O流
3️⃣ 对象序列化:对象I/O流
4️⃣ NIO 和NIO.2:new I/O
5️⃣Files类操作:读写和操作目录和文件。

Java I/O概述

  • 目前Java支持文件I/O和流式I/O。流式I/O分为输入流和输出流。
    在这里插入图片描述

  • 按照处理数据的类型分,数据流又可分为:
    二进制流,也称为字节流。 单位:字节
    文本流,也称为字符流。 单位:字符

二进制I/O流

主要内容

①java.io.File类应用
②二进制I/O与文本I/O
③InputStream类和OutputStream类
④常用二进制I/O流
⑤标准输入/输出流

1️⃣java.io.File类
  • java.io.File类用来表示物理磁盘上的实际文件或目录,但它不表示文件中数据。
  • 绝对文件名是由驱动器字母、完整的路径以及文件名组成,如D:\study\Hello.txt是Windows系统下的一个绝对文件名。
  • 相对文件名是相对于当前工作目录的。例如,Hello.txt是一个相对文件名。如果当前工作目录是D:\study,绝对文件名是D:\study\Hello.txt。
File类常用方法
  public boolean exists()
  public long length()
  public boolean createNewFile()
  public boolean renameTo(File newName)
  public boolean delete()
  public long lastModified()
2️⃣二进制I/O与文本I/O
  • 文件通常可以分为文本文件二进制文件。
  • 使用文本I/O将字符串“123”写入文件,那么每个字符的二进制编码都会写入到文件。
    在这里插入图片描述
    使用二进制I/O向文件写入一个数据,就是将内存中的值复制到文件中。例如,一个byte类型的数值123在内存中表示为0111 1011,将它写入文件也是0111 1011。
    在这里插入图片描述
3️⃣InputStream类和OutputStream类
  • InputStream类是二进制输入流的根类,它有多个子类。
    在这里插入图片描述
public int read()
public int read(byte[] b)
public void close()
  • OutputStream类是二进制输出流的根类,它有多个子类。
    在这里插入图片描述
  public void write(int b)
  public void write(byte[] b)
  public void close()
4️⃣常用二进制I/O流
  • FileInputStream类和FileOutputStream类用来实现文件的输入输出处理。
  • FileInputStream类和FileOutputStream类都实现了java.lang.AutoClosable接口,因此可以在try-with-resources语句中使用,当流使用完自动将它们关闭。
文件字节流的应用

问题描述:
编写程序,用FileOutputStream对象向output.dat文件中写入10个10到99的随机整数。
编写另一个程序,然后使用FileInputStream对象从output.dat文件中读出这10个数并输出。
第一个程序:写入文件

import java.io.FileOutputStream;  
import java.io.IOException;  
import java.util.Random;  
  
public class WriteRandomNumbers {  
    public static void main(String[] args) {  
        Random random = new Random();  
        FileOutputStream fos = null;  
  
        try {  
            fos = new FileOutputStream("output.dat");  
            for (int i = 0; i < 10; i++) {  
                int number = random.nextInt(90) + 10; // 生成10到99之间的随机数  
                fos.write(number); // 直接写入int类型会有问题,因为write方法接收byte类型  
                // 使用DataOutputStream可以更方便地写入int等类型  
                // 但为了简单演示,这里仅写入低字节(不推荐)  
                // 更好的做法是使用DataOutputStream  
                fos.write('\n'); // 写入换行符,仅作分隔使用,实际文件不会以文本形式展示换行  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        } finally {  
            if (fos != null) {  
                try {  
                    fos.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
    }  
}  
  
// 注意:上述代码中的fos.write(number);部分直接将整数的低字节写入文件,这会导致数据丢失。  
// 正确的做法是使用DataOutputStream来写入int等复杂类型。

第二个程序:读取文件

import java.io.FileInputStream;  
import java.io.IOException;  
  
public class ReadRandomNumbers {  
    public static void main(String[] args) {  
        FileInputStream fis = null;  
  
        try {  
            fis = new FileInputStream("output.dat");  
            int ch;  
  
            while ((ch = fis.read()) != -1) {  
                // 由于只写入了低字节,这里打印的将是乱码,或者是不完整的整数  
                System.out.print(ch + " ");  
            }  
  
            // 注意:这里的输出并不是原始的整数,因为写入的方式不正确  
        } catch (IOException e) {  
            e.printStackTrace();  
        } finally {  
            if (fis != null) {  
                try {  
                    fis.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
    }  
}  
  
// 注意:上面的代码不能正确还原出写入的整数,因为它只读取了低字节。  
// 如果要正确读取,需要使用DataInputStream,并且写入时也应该使用DataOutputStream。
  • BufferedInputStream为缓冲输入流,BufferedOutputStream为缓冲输出流,这两个类用来对流实现缓冲功能。
  • 使用缓冲流可以减少读写数据的次数,加快输入输出的速度。
数据I/O流

DataInputStreamDataOutputStream类分别是数据输入流和数据输出流。使用这两个类可以实现基本数据类型的输入输出。

  byte readByte
  int readInt()
  char readChar()
  boolean readBoolean()
  double readDouble()
  String readLine()String readUTF()
   void writeByte(int v)
   void writeInt(int v)
   void writeChar(int v)
   void writeBoolean(boolean v)
   void writeDouble(double v)
   void writeUTF(String s)
  • 下面语句为文件input.dat创建了缓冲输入流,然后将其包装成数据输入流。
 DataInputStream inFile = new DataInputStream(
         new BufferedInputStream(
            new FileInputStream("input.dat")));
  • 下面语句为文件input.dat创建了缓冲输出流,然后将其包装成数据输出流。
 DataOutputStream outFile = new DataOutputStream(
        new BufferedOutputStream(
          new FileOutputStream("output.dat")));
PrintStream类
  • PrintStream类为打印各种类型的数据提供了方便。该类定义了多个print()和println ()方法,可以打印输出各种类型的数据,这些方法都是把数据转换成字符串,然后输出。如果输出到文件中则可以用记事本浏览。
  • System.out对象就是PrintStream类的一个实例,用于向控制台输出数据。
标准I/O流
  • Java系统事先定义了两个对象System.in和System.out,分别与系统的标准输入和标准输出相联系,另外还定义了标准错误输出流System.err。

System.in 是InputStream类的实例
System.out 是PrintStream类的实例
System.err 是PrintStream类的实例

综合实例

问题描述
尝试用PrintStream类的对象,将打印到控制台的话打印到一个文件中

1 File file = new File("F:\\a.txt"); 
2 PrintStream printStream = new PrintStream(file); 
5 printStream.println("hello world");

1 File file = new File("F:\\a.txt"); 
2 PrintStream printStream = new PrintStream(file); 
3 System.setOut(printStream); 
4 System.out.println("打印到F:\\a.txt中");

博主用心写,读者点关注,互动传真情,知识不迷路。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部