• JAVA中如何使用FileInputStream 读取文件内容?
  • 发布于 2个月前
  • 429 热度
    0 评论
  • 望北海
  • 0 粉丝 28 篇博客
  •   

前言:

InputStream是一个抽象类,它是所有字节输入流实现类的基类。它的主要作用是抽象地表示从不同数据源产生输入的类,例如FileInputStream、FilterInputStream等。InputStream提供了一些常用的方法,如read()、read(byte[] b)等,用于从数据源中读取字节数据。它还提供了一些其他方法,如available()、skip()等,用于控制读取的数据量和处理跳过部分数据等操作。InputStream通常与OutputStream类配合使用,实现数据的读取和写入。今天我们就详解一下InputStream的几个实现类的使用方式。

一、FileInputStream的代码示例
下面是使用 FileInputStream 读取文件内容的示例代码:
import java.io.*;

public class FileInputStreamExample {
    public static void main(String[] args) {
        // 堆代码 duidaima.com
        // 要读取的文件路径和名称
        String filePath = "C:/example/file.txt";
        // 创建输入流对象
        FileInputStream fis = null;

        try {
            fis = new FileInputStream(filePath);
            byte[] buffer = new byte[1024];
            int len;
            // 使用 while 循环读取文件,每次最多读取 1024 个字节
            while ((len = fis.read(buffer)) != -1) {
                // 将读取的字节转换为字符串,并输出到控制台
                String content = new String(buffer, 0, len, "UTF-8");
                System.out.println(content);
            }
        } catch (FileNotFoundException e) {
            System.out.println("File not found: " + filePath);
        } catch (IOException e) {
            System.out.println("Error reading file: " + e.getMessage());
        } finally {
            // 关闭输入流
            try {
                if (fis != null) {
                    fis.close();
                }
            } catch (IOException e) {
                System.out.println("Error closing file: " + e.getMessage());
            }
        }
    }
}
示例代码说明:
在示例中,我们首先指定要读取的文件路径和名称。在实际使用中,您应该将其替换为实际的文件路径和名称。
然后,我们使用文件路径创建一个FileInputStream对象。注意,在创建FileInputStream对象时,我们必须提供要读取的文件的路径和名称。
接着,我们使用while循环从FileInputStream对象中读取数据。每次循环中,我们使用read()方法读取最多1024字节,并将读取的字节存储在一个缓冲区中。然后,我们将读取的字节转换为字符串,并在控制台上输出。在while循环结束后,我们关闭FileInputStream对象。

注意:在使用FileInputStream类时,我们需要确保文件存在,并且我们有读取文件的权限。此外,在实际应用中,可能需要根据需要使用更高效的方法读取大型文件,以避免IO开销的问题。


二、ByteArrayInputStream的代码示例
下面是使用 ByteArrayInputStream 读取字节数组内容的示例代码:
import java.io.*;

public class ByteArrayInputStreamExample {

    public static void main(String[] args) {
        byte[] bytes = { 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33 };
        // 创建字节输入流对象
        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);

        try {
            byte[] buffer = new byte[1024];
            int len;
            // 使用 while 循环读取字节数组中的内容,每次最多读取 1024 个字节
            while ((len = bais.read(buffer)) != -1) {
                // 将读取的字节转换为字符串,并输出到控制台
                String content = new String(buffer, 0, len, "UTF-8");
                System.out.println(content);
            }
        } catch (IOException e) {
            System.out.println("Error reading byte array: " + e.getMessage());
        } finally {
            // 关闭输入流
            try {
                if (bais != null) {
                    bais.close();
                }
            } catch (IOException e) {
                System.out.println("Error closing byte array input stream: " + e.getMessage());
            }
        }
    }
}
示例代码说明:
在示例中,我们首先创建了一个字节数组,其中包含ASCII码为72, 101, 108, 108, 111, 32, 87, 111,
114, 108, 100, 33的字符序列"Hello World!"。
然后,我们使用字节数组创建了一个ByteArrayInputStream对象。注意,在创建ByteArrayInputStream对象时,我们必须提供要从中读取的字节数组。
接着,我们使用while循环从ByteArrayInputStream对象中读取数据。每次循环中,我们使用read()方法读取最多1024字节,并将读取的字节存储在一个缓冲区中。然后,我们将读取的字节转换为字符串,并在控制台上输出。在while循环结束后,我们关闭ByteArrayInputStream对象。
注意:在使用ByteArrayInputStream类时,字节数组是一次性全部加载到内存中的,如果字节数组较大,可能会导致内存不足的问题。此外,在实际应用中,可能需要使用更高效的数据源(如文件或网络流)来存储数据,以避免内存限制的问题。

三、PipedInputStream的代码示例
PipedInputStream:管道输入流,用于线程之间的通信。
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;

public class PipedInputStreamExample {

    public static void main(String[] args) throws Exception {
        
        // 创建一对PipedInputStream和PipedOutputStream
        PipedInputStream input = new PipedInputStream();
        PipedOutputStream output = new PipedOutputStream(input);

        // 创建一个写线程
        Thread writerThread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    // 写入一些数据到PipedOutputStream
                    output.write("Hello, World!".getBytes());
                    output.close(); // 关闭PipedOutputStream
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

        // 创建一个读线程
        Thread readerThread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    // 读取PipedInputStream中的数据
                    int data;
                    while ((data = input.read()) != -1) {
                        System.out.print((char) data); // 将数据打印到控制台
                    }
                    input.close(); // 关闭PipedInputStream
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

        // 启动写线程和读线程
        writerThread.start();
        readerThread.start();

        // 等待写线程和读线程完成
        writerThread.join();
        readerThread.join();
    }
}
代码说明
PipedInputStream和PipedOutputStream是Java IO库提供的一对管道流,可以用于数据的发送和接收。在示例中,我们首先创建了一个PipedInputStream和一个PipedOutputStream。它们被连接在一起,使得我们可以像使用一个普通的输入流- 和输出流一样进行读写操作。
接着,我们创建一个写线程来向管道中写入数据。在这个例子中,我们写入了字符串"Hello, World!"。
然后,我们创建一个读线程来从管道中读取数据。我们使用了一个while循环来读取数据,直到遇到了流的末尾。
最后,我们启动写线程和读线程,等待它们完成,然后关闭流。
注意:如果读线程在数据被写入管道之前就开始读取流,它将会阻塞(即等待数据被写入)。
另外,还要注意线程之间的同步问题。在这个例子中,我们使用了一个简单的join()方法来等待写线程和读线程完成。在实际使用中,您可能需要使用更高级的同步机制来确保线程之间的正确协作。

用户评论