java的inputstream类中read(byte[] b) 方法是否使用了缓存?如果使用了缓存,那它和bufferedinputstream类中的read(byte[] b)方法有什么区别,好像两个类在read时都使用了缓存
时间: 2024-04-06 09:28:28 浏览: 46
是的,Java的InputStream类中的read(byte[] b)方法使用了缓存。当调用read(byte[] b)方法时,它会尽可能地填充传入的字节数组b,但不保证一次调用能够读取到b的全部内容,可能只读取部分或者一个字节。InputStream类的read(byte[] b)方法是比较底层的方法,它会直接读取底层数据源(如文件或网络)的内容。
与之相对,BufferedInputStream类中的read(byte[] b)方法也使用了缓存,但它在读取数据时会先检查缓存中是否有足够的数据可供读取,如果有,则直接从缓存中读取;如果没有,则会从底层数据源中读取一定的数据并填充到缓存中,然后再从缓存中读取。BufferedInputStream类的read(byte[] b)方法是对底层IO流的包装,它提供了缓存机制以提高读取效率。
所以,InputStream类的read(byte[] b)方法和BufferedInputStream类的read(byte[] b)方法都使用了缓存,但BufferedInputStream类更适合用于读取大块数据时,可以减少对底层数据源的频繁读取操作,提高读取效率。
相关问题
把d:\\bbb.mp4复制到当前项目目录下的copy.mp4中 分别用FileInputStream和BufferedInputStream类中的两种read()方法,共四种方式复制并比较效率。
好的,我来一步步回答你的问题。
首先,我们需要明确几个概念:
1. FileInputStream:从文件系统中的文件获取输入字节。
2. BufferedInputStream:从 InputStream 中装饰一个缓冲区来实现输入流的缓存。
3. read():从输入流中读取一个字节的数据。
4. read(byte[] b):从输入流中读取一定量的字节,并将其存储在缓冲区数组 b 中。
接下来,我们可以按照你的要求,分别用 FileInputStream 和 BufferedInputStream 类中的两种 read() 方法,共四种方式完成复制。
其中,FileInputStream 的两种读取方式如下:
方式一:
```java
public void copyFile1(String sourcePath, String destPath) throws IOException {
FileInputStream fis = new FileInputStream(sourcePath);
FileOutputStream fos = new FileOutputStream(destPath);
int len;
while ((len = fis.read()) != -1) {
fos.write(len);
}
fis.close();
fos.close();
}
```
方式二:
```java
public void copyFile2(String sourcePath, String destPath) throws IOException {
FileInputStream fis = new FileInputStream(sourcePath);
FileOutputStream fos = new FileOutputStream(destPath);
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
fis.close();
fos.close();
}
```
而 BufferedInputStream 的两种读取方式如下:
方式三:
```java
public void copyFile3(String sourcePath, String destPath) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sourcePath));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destPath));
int len;
while ((len = bis.read()) != -1) {
bos.write(len);
}
bis.close();
bos.close();
}
```
方式四:
```java
public void copyFile4(String sourcePath, String destPath) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sourcePath));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destPath));
byte[] buffer = new byte[1024];
int len;
while ((len = bis.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bis.close();
bos.close();
}
```
最后,为了比较这四种方式的效率,我们可以使用 System.currentTimeMillis() 方法来计算程序的执行时间,并输出到控制台上,如下所示:
```java
public static void main(String[] args) throws IOException {
long start = System.currentTimeMillis();
copyFile1("d:\\bbb.mp4", "copy1.mp4");
long end = System.currentTimeMillis();
System.out.println("copyFile1:" + (end - start) + "ms");
start = System.currentTimeMillis();
copyFile2("d:\\bbb.mp4", "copy2.mp4");
end = System.currentTimeMillis();
System.out.println("copyFile2:" + (end - start) + "ms");
start = System.currentTimeMillis();
copyFile3("d:\\bbb.mp4", "copy3.mp4");
end = System.currentTimeMillis();
System.out.println("copyFile3:" + (end - start) + "ms");
start = System.currentTimeMillis();
copyFile4("d:\\bbb.mp4", "copy4.mp4");
end = System.currentTimeMillis();
System.out.println("copyFile4:" + (end - start) + "ms");
}
```
这样,我们就可以得到每种方式的执行时间,并进行比较了。
bufferedinputstream的方法
BufferedInputStream是Java中的一个类,它是对InputStream进行缓存处理的一种流,可以提高读取数据的效率。BufferedInputStream类中常用的方法包括:
1. read():从输入流中读取下一个字节的数据。
2. read(byte[] b, int off, int len):从输入流中读取最多len个字节的数据,并将其存储在缓冲区数组b中,返回实际读取的字节数。
3. skip(long n):从输入流中跳过n个字节的数据。
4. available():返回输入流中还可以读取的字节数。
5. close():关闭输入流。
6. mark(int readlimit):在当前位置做一个标记,最多可以缓存readlimit个字节数据。
7. reset():将输入流的位置重置为最近的mark标记位置。
8. markSupported():判断输入流是否支持mark和reset方法。
阅读全文