对java(ASCll)文件编码中“0”和结束标志的研究

我们都知道,字符都有它对应的编码,例如,在ASCll码中,“A”对应的ASCll

值是65,“B”对应66,它们在编码中都有明确的对应关系。

其中,“0”是个特殊的值,ASCII值为0的字符是空字符(null character),也称为NUL字符。它在字符串中通常用作字符串的结束标志

那我们不妨假设,要是文件中的一个字符在编码或者解码中出现了错误的“0”,它是会报错,还是直接结束编译呢

我们不妨简单做个实验

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class CreateTxtFile {
    public static void main(String[] args) {
        // 获取桌面路径
        String desktopPath = System.getProperty("user.home") + File.separator + "Desktop";
        System.out.println(desktopPath);
        // 创建文件对象
        File file = new File(desktopPath, "output.txt");

        // 使用try-with-resources语句自动关闭资源
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
            // 写入ASCII码对应的字符
            writer.write((char) 65); // 'A'
            writer.write((char) 66); // 'B'
            writer.write((char) 67); // 'C'
            System.out.println("文件已成功创建并写入内容!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这是用java写的一个简单的输入语句,我们新建了一个文本文档在桌面,写入了ASCll值为65,66,67的字符,也就是输入了A,B,C。

我们能看到

字符被正常的输出了

那么,我们再将B的那一部分变成“0”

 写入依然正常进行

而在文件中,并不是直接从B的位置直接结束编译或者引发错误,而是在原来B的位置上出现了一个空字符。

我接着查询了资料:在Java中,字符串是以字符数组的形式存储的,每个字符都有一个明确的长度,因此字符串不会以空字符作为结束标志。

在java中,如果编码不是以0做末尾的判断,那是怎样的呢

在Java中,文件的结尾通常不是通过某个特定的字符来判断的,而是通过文件流(例如FileReaderBufferedReader等)的状态来判断。当你尝试从文件中读取数据时,如果到达文件的末尾,读取操作会返回一个特定的值来表示文件已经结束

我们以BufferedReader为例

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ReadFileExample {
    public static void main(String[] args) {
        String filePath = "path/to/your/file.txt";

        try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = reader.readLine()) != null) {
                // 处理读取到的每一行
                System.out.println(line);
            }
            // 当readLine()返回null时,表示文件已经读取完毕
            System.out.println("文件读取完毕。");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

文件不是以一个编码作为结尾,而是以一行是否有返回值作为末尾的判断标准。当这一行没有任何返回值时,则判断

readLine()返回null

 有人又要说了,那我空一行再写第二段,为什么没有只编码一段的呢

这里有个小知识点,我们的ascll码中,包含了回车的编码。即使在显示屏上显示这一行没有任何字符,在计算机里面存放的是对换行的一系列编码:一个空行由一个CR字符(ASCII码13)和一个LF字符(ASCII码10)组成,即CRLF。

当你读取到空行时,readLine()方法会返回一个空字符串

回车在读取时也是有返回值的,只有真正没有后文时,才返回为null,即编码结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值