Java语言程序设计——篇十三(1)


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

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

输入输出

主要内容

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类常用方法
java 复制代码
  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 类是二进制输入流的根类,它有多个子类。
java 复制代码
public int read()
public int read(byte[] b)
public void close()
  • OutputStream 类是二进制输出流的根类,它有多个子类。
java 复制代码
  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个数并输出。
第一个程序:写入文件

java 复制代码
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等复杂类型。

第二个程序:读取文件

java 复制代码
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类分别是数据输入流和数据输出流。使用这两个类可以实现基本数据类型的输入输出。

java 复制代码
  byte readByte
  int readInt()
  char readChar()
  boolean readBoolean()
  double readDouble()
  String readLine() 。
  String readUTF()
java 复制代码
   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创建了缓冲输入流,然后将其包装成数据输入流。
java 复制代码
 DataInputStream inFile = new DataInputStream(
         new BufferedInputStream(
            new FileInputStream("input.dat")));
  • 下面语句为文件input.dat创建了缓冲输出流,然后将其包装成数据输出流。
java 复制代码
 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类的对象,将打印到控制台的话打印到一个文件中

java 复制代码
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中");

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

相关推荐
澈2078 小时前
C++并查集:高效解决连通性问题
java·c++·算法
郝学胜-神的一滴10 小时前
Qt 入门 01-01:从零基础到商业级客户端实战
开发语言·c++·qt·程序人生·软件构建
测试员周周10 小时前
【Appium 系列】第06节-页面对象实现 — LoginPage 实战
开发语言·前端·人工智能·python·功能测试·appium·测试用例
2401_8734794010 小时前
运营活动被薅羊毛怎么防?用IP查询+设备指纹联动封堵漏洞
java·网络·tcp/ip·github
ShiJiuD66688899910 小时前
大事件板块一
java
摇滚侠10 小时前
@Autowired 和 @Resource 的区别
java·开发语言
Wy_编程10 小时前
go语言中的结构体
开发语言·后端·golang
SeaTunnel10 小时前
(八)收官篇 | 数据平台最后一公里:数据集成开发设计与上线治理实战
java·大数据·开发语言·白鲸开源
大卡片11 小时前
C++的基础知识点
开发语言·c++
吴声子夜歌11 小时前
Java——线程的基本协作机制
java·线程协作