java如何在内部将任何类型的文件(图像、pdf等)转换为bytearray?

java如何在内部将任何类型的文件(图像、pdf等)转换为bytearray?,java,arrays,stream,java-io,Java,Arrays,Stream,Java Io,我目前正在研究Java I/O,但它很容易处理字节流和字符流。我只是想知道,Java是如何将任何类型的文件(图像、pdf等)转换为字节数组表示的。对于计算机来说,文件只不过是字节的集合(以及一些元数据,如名称、路径、数据……)在磁盘上。实际上没有所谓的“类型”文件 但是一个pdf文件比什么都重要呢?这是一个惯例,我们说一个pdf文件的名称以“.pdf”(也称为扩展名)结尾,这个文件中存储的第一个字节是25504446(神奇的数字) 更直接地回答您的问题:操作系统负责从磁盘读取文件。Java只使用

我目前正在研究Java I/O,但它很容易处理字节流和字符流。我只是想知道,Java是如何将任何类型的文件(图像、pdf等)转换为字节数组表示的。

对于计算机来说,文件只不过是字节的集合(以及一些元数据,如名称、路径、数据……)在磁盘上。实际上没有所谓的“类型”文件

但是一个pdf文件比什么都重要呢?这是一个惯例,我们说一个pdf文件的名称以“.pdf”(也称为扩展名)结尾,这个文件中存储的第一个字节是25504446(神奇的数字)

更直接地回答您的问题:操作系统负责从磁盘读取文件。Java只使用正确的系统调用。这个调用是在特定的JVM中实现的


PS:如果你想自己调查这个问题,你可以使用十六进制编辑器来查看每个文件的字节。(选择您最喜欢的:)在编辑器中,您将看到文件实际上只不过是字节。

Java本身不会将文件转换为字节数组。作为@Toonijn,程序(Java或其他语言)进行系统调用,从磁盘、url、内存或其他源获取字节。这都是关于如何看待字节的问题;无论是一个映像、多个映像、一些自定义文件、线程转储还是其他任何内容

此外,Java中也有对象,对象可以是任何内容的表示:字符序列、流、字节数组、临时缓冲区、远程文件等无论什么例如,您知道某个文件是一个图像,所以您可以简单地将这些字节视为图像

或者您知道,some
some.data
文件是一个具有自定义扩展名的文本文件。同样,当您知道文件内容是什么时,您可以

同样的事情。您所需要的只是添加库(它们可以用Java或其他语言编写;后者将重新引发一些攻击:,)

另一个例子是文件


请注意,如果您试图从文件中读取字节,并且假设它是一种类型(例如,和图像),但您将其作为另一种类型(例如excel)进行处理,那么您将错误地读取数据,甚至会出错。

操作系统从磁盘读取字节并将字节块加载到内存中,因此Java本身不需要做太多工作。我认为,通过搜索引擎,你会找到比回答堆栈溢出问题更好的解释。文件只是字节,操作系统提供了一个文件系统,可以按字节或按字节块读取这些字节。FileInputStream就是这样做的。(使用本机调用)如果这些字节表示文本,InputStreamReader可以在给定这些字节的字符集/编码的情况下将其读取为字符/字符串。同样,ImageIO将读取图像。没有转换。文件已由字节组成。虽然是基本的,但这是一个有效的问题,不应关闭。
import java.awt.Image;
import java.io.File;
import java.io.IOException;

File image2 = new File("bishnu.jpg");
Image image = ImageIO.read(image2);
String content = new String(Files.readAllBytes(Paths.get("some.data")));
Workbook workbook = WorkbookFactory.create(new File("yourfile.xlsx"));