io流读取文件时,末尾为什么不是–1

JavaIO流中,io流读取文件时,末尾为什么不是–1 而是13那么在读取文件时while循环中条件怎么写

因为13对应的ASCII码表示回车符
使用InputStream读取文件时,read()方法会返回读取的字节数据,如果已经到达文件末尾,返回-1。但是,在文本文件中,每一行末尾通常都有一个回车符(\r)和一个换行符(\n)。而在Windows系统中,回车符和换行符一起表示换行,其ASCII码分别是13和10。所以在读取文件时,如果遇到回车符,read()方法会返回13,而不是-1。
如有帮助给个采纳点赞加关注. 下个问题上高速谢谢

该回答引用chatgpt:
在Java中,IO流读取文件时,末尾通常不是-1,而是一个特殊的值,代表换行符(newline)的ASCII码。在Windows系统中,换行符由回车符(carriage return)和换行符(line feed)组成,对应的ASCII码分别是13和10。

当使用InputStream或Reader读取文件时,每次读取一个字节或一个字符,到达文件末尾时,会返回-1。但是,如果文件末尾是换行符,那么会返回换行符的ASCII码,即13。

因此,在读取文件时,你可以通过检查返回的值是否等于13来判断是否到达文件末尾(换行符)。如果返回值是-1,则表示已经读取完整个文件。

以下是一个示例,展示了在读取文件时如何使用循环条件

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

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

        try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
            int data;
            while ((data = reader.read()) != -1) {
                // 处理每个字节或字符
                if (data == 13) {
                    // 到达文件末尾(换行符)
                    break;
                }
                System.out.print((char) data); // 打印每个字节或字符
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


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

public class FileReadingExample {
    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);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/274988
  • 这篇博客你也可以参考下:【Java基础知识】IO流--字节流读写数据以及复制文件的几种方式
  • 除此之外, 这篇博客: JAVAIO流讲解(创建,读取,写入)中的 所有io流方法中都需要写入相应的文件操作路径,且所有io流的方法都有一个共同的父类接口(Exception),所以我们在使用时都需要链接相对应的接口如: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    public static void main(String[] args) throws Exception
  • 以下回答来自chatgpt:

    问题分析: Java的IO流中,读取文件末尾的值是通过将每个字节的值读入一个整数类型变量中,并判断该整数的值是否等于-1来确定是否已到达文件末尾。细心的观察者可能会发现,当读取到文件末尾时,值不是-1,而是13。这是因为Java中的读操作是按字符读取的,而13是回车符的ASCII码值。因此,当读取到文件末尾时,会读取到回车符,而不是-1。为了正确地判断是否已到达文件末尾,需要将该整数的值与回车符的ASCII码值进行比较。

    解决方案: 正确设置while循环条件来读取文件,可以将读取到的字符值与回车符的ASCII码值进行比较。只有当读取到的字符值不等于回车符的ASCII码值时,才继续执行循环。代码示例如下:

    try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
        String line;
        while ((line = reader.readLine()) != null) {
            int intValue = Integer.parseInt(line);
            if (intValue != 13) {
                // 在这里处理读取到的值
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    

    上述代码使用了Java的try-with-resources语法,确保在读取完文件后正确关闭资源。在while循环中,每次读取一行内容,并将其转换为整数类型。然后,比较该整数值是否等于回车符的ASCII码值13,如果不等于13则继续执行循环体内的代码来处理读取到的值。

    需要注意的是,上述代码中的filePath需要替换为实际的文件路径。此外,根据实际需求,还需要在循环体内部添加相应的逻辑来处理读取到的值。

    如果以上解决方案无法满足要求,请提供更多细节或特定要求,以便能够给出更准确的解决方案。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^