Java 使用面向字节的流(如FileInputStream/FileOutputStream)从文件读取/写入int值是否会访问缓冲区/磁盘4次?

Java 使用面向字节的流(如FileInputStream/FileOutputStream)从文件读取/写入int值是否会访问缓冲区/磁盘4次?,java,io,Java,Io,示例代码是:- import java.io.*; public class WriteInt{ public static void main(String [] args) { WriteInt obj = new WriteInt(); obj.write(); } public void write(){ File file = null; FileOutputStream out = null; int []

示例代码是:-

import java.io.*;

public class WriteInt{
    public static void main(String [] args)
    {
    WriteInt obj = new WriteInt();
    obj.write();
    }

    public void write(){
    File file = null;
    FileOutputStream out = null;
    int [] arr = {6};
    try{
    file= new File("CheckSize.txt");
    out = new FileOutputStream(file);
    for(int i =0; i<arr.length;i++)
    {
        System.out.println("Trying to write to file:-"+ file);
        out.write(arr[i]);
    }

    }
    catch(IOException ioex){
    ioex.printStackTrace();
    } 
    finally{
    if(out != null)
    {
        System.out.println("Closing the stream");
        try{
        out.close();
        }   
        catch(IOException ioex){
        ioex.printStackTrace();
        }
    }

    else{
        System.out.println("Stream not open");
        }   
    }
    }

    }
import java.io.*;
公共类写入{
公共静态void main(字符串[]args)
{
WriteInt obj=新的WriteInt();
obj.write();
}
公共空写(){
File=null;
FileOutputStream out=null;
int[]arr={6};
试一试{
file=新文件(“CheckSize.txt”);
out=新文件输出流(文件);
for(int i=0;iout.write(arr[i])将只写入int的最低字节。最好的解决方案是使用具有writeInt(int)方法的java.io.DataOutputStream

write(arr[i])将只写入int的最低字节。最好的解决方案是使用java.io.DataOutputStream,它具有writeInt(int)方法


在您的示例中,您使用的是OutputStream.write(int) 它只写入所提供数字的字节表示形式-只写入一个字节,请查看。因此,您的文件将只包含一个字节和6。如果您尝试写入的数字超过255,则可能会出现异常


基本上,OutputStream要求其子类只实现write(int)方法,因此其他OutputStream方法将其字节发送到write(int)。然而,FileOutputStream中的所有write方法都被覆盖,并使用缓冲本机调用,该调用可能会一次发送所有数据。

在您的示例中,您使用的是OutputStream.write(国际) 它只写入所提供数字的字节表示形式-只写入一个字节,请查看。因此,您的文件将只包含一个字节和6。如果您尝试写入的数字超过255,则可能会出现异常


基本上OutputStream要求它的子类只实现write(int)方法,所以其他OutputStream方法将它们的字节发送给write(int)。但是,FileOutputStream中的所有写入方法都会被覆盖,并使用缓冲的本机调用,该调用可能会尝试一次发送所有数据。

您可以在中阅读相关信息,或者您可以通过尝试自己检查?如何检查?向文件中写入一个int,就像您正在执行的操作一样,然后查看该文件(可能使用十六进制编辑器)你根本没有在写int。你在写一个字节。这只需要一次写入。你可以在中阅读关于它的信息,也许你可以通过尝试自己检查一下?如何检查?像你正在做的那样在文件中写入一个int,然后查看文件(可能使用十六进制编辑器)你根本没有在写int。你在写一个字节。这只需要一次写操作。会丢失精度;那么,是否可以假设int首先转换为字节而不是写入文件?请参阅OutputStream.write(int b)API,它说:“将指定的字节写入此输出流。
write
的一般约定是将一个字节写入输出流。要写入的字节是参数
b
的八个低位。忽略
b
的24个高位。”。“Int确实会转换为byte,但在您的情况下,需要写入的值在byte的范围内,因此即使发生截断,也不会丢失精度。但即使值127(大于byte的最大值)不会有精度损失。检查此链接:会有精度损失;那么是否可以假设int首先转换为字节而不是写入文件?请参阅OutputStream.write(int b)API,它显示:“将指定的字节写入此输出流。
write
的一般约定是将一个字节写入输出流。要写入的字节是参数
b
的八个低位。忽略
b
的24个高位。”。“Int确实会转换为byte,但在您的情况下,需要写入的值在byte的范围内,因此即使发生截断,也不会丢失精度。但即使值127(大于byte的最大值)不会丢失精度。请检查此链接:我期待出现异常,但出乎意料的是,数字257被视为1。我已检查了FileOutputStream源代码。它只是利用本机库的缓冲调用(此处检查writeBytes方法:)。因此,所有写入方法都通过此方法发送数据。我本以为会出现异常,但出乎意料的是,数字257被视为1。我已检查了FileOutputStream源代码。它只是利用本机库的缓冲调用(此处为check writeBytes method:)。因此,所有写入方法都通过此方法发送数据。
    DataOutputStream out = new DataOutputStream(new FileOutputStream("file"));
    out.writeInt(arr[i]);