【问题标题】:How to write in file by BufferedOutputStream?如何通过 BufferedOutputStream 写入文件?
【发布时间】:2014-10-05 20:58:49
【问题描述】:

我想将数据从demo1.txt 复制到demo2.txt,虽然我可以通过BufferedReader 完成,但我想通过BufferedInputStream / BufferedOutputStream 进行复制。请告诉我如何做到这一点。

import java.io.*;
class stream4
{
    public static void main(String arr[])
    {
        BufferedInputStream bfis=new BufferedInputStream(new FileInputStream("demo1.txt"));
        BufferedOutputSteam bfos=new BufferedOutputStream(new FileOutputStream("demo2.txt"));
        byte b[]=(bfis.read());
        bfos.write(b);
        bfis.close();
        bfos.close();
    }
}

【问题讨论】:

  • read() 仅返回“数据的下一个字节,如果到达流的末尾则返回 -1”。您需要一个循环读取一个字节,然后写入一个字节,直到从输入中读取所有字节。
  • 您不能只编写代码。 read() 方法不返回字节数组。查一下。

标签: java bufferedinputstream bufferedoutputstream


【解决方案1】:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Main
{
    public static void main(String[] args) throws Exception
    {
       String fromFileName = "demo1.txt";
       String toFileName = "demo2.txt";
       BufferedInputStream in = new BufferedInputStream(new FileInputStream(fromFileName));
       BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(toFileName));
       byte[] buff = new byte[32 * 1024]; 
       int len = 0;
       while ((len = in.read(buff)) > 0) //If necessary readLine()
         out.write(buff, 0, len);
       in.close();
       out.close();
     }
}

这将完成工作:)。只需指定您正在查看的字节大小,然后使用循环继续读取文件。

【讨论】:

  • 字节数组大小无关紧要,只要大于零即可。此代码适用于 1,而 8192 足以满足大多数用途。
  • 不,这就是为什么会有一个循环。看看代码是如何工作的。它只是不断地读入缓冲区并从中写入那么多字节。它不关心缓冲区有多大。尝试使用新字节 [1]。在这种情况下,由于输入和输出都有缓冲流,它甚至不会很慢。
【解决方案2】:

改变

byte b[]=(bfis.read());

    byte[] b = new byte[1024];
    try {
        for (int readNum; (readNum = bfis.read(b)) != -1;) {
            bfos.write(b, 0, readNum);
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    finally {
        bfis.close();
        bfos.close();
    }

作为bfis.read() 下一个数据字节,如果到达流的末尾,则为-1。

【讨论】:

  • 这是对 available() 的误用,在 Javadoc 中有特别警告。
【解决方案3】:

正如其他人正确建议的那样,您实际上需要自己的缓冲区来按部分读取和写入,这表示为指定大小的字节数组。因此,现在用 BufferedInputStream 和 BufferedOutputStream 包装 FileInputStream 和 FileOutputStream 没有任何意义 - 如果您从流输入并按较小部分输出,它们很有用。我建议只是让你的缓冲区比建议的大(比如 16384 或 32768),并在这种情况下删除不必要的 BufferedInputStream 和 BufferedOutputStream。

【讨论】:

    猜你喜欢
    • 2014-12-02
    • 2012-03-14
    • 2012-05-27
    • 2015-03-22
    • 1970-01-01
    • 2011-02-07
    • 2021-05-07
    • 2013-12-11
    • 2011-09-21
    相关资源
    最近更新 更多