1
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class BufferedInputOutputStreamExample
{
    public static void main(String[] args) {
        try{
        BufferedInputStreamExample bisx=new BufferedInputStreamExample();
        BufferedInputStream bis=bisx.inputMethod();

        BufferedOutputStreamExample bosx=new BufferedOutputStreamExample();
        bosx.outputMethod(bis);
        }
        catch(FileNotFoundException fnf)
        {
            System.out.println("Sorry--------File not exists");
        }
        catch(IOException io)
        {
            System.out.println("IOException   ---:"+io.getMessage());
        }


    }
}
class BufferedInputStreamExample
{
    BufferedInputStream bis=null;
    BufferedInputStream  inputMethod()throws FileNotFoundException,IOException
    {
            FileInputStream fin=new FileInputStream("C:/e-SDK-4.1-win32-x86_64 (1)/RahulExample/src/Test.java");
            bis=new BufferedInputStream(fin); 
            int c;
            while((c=bis.read())!=-1)
                System.out.print((char)c);
            System.out.println();

        return bis;
    }
}
class BufferedOutputStreamExample
{
    BufferedOutputStream bos=null;
    int outputMethod(BufferedInputStream bis)throws IOException,FileNotFoundException
    {
        bos=new BufferedOutputStream(new FileOutputStream("C:/varun.txt"));

        int c;

        while((c=bis.read())!=-1){
            bos.write(c);
        }
        bis.close();
        bos.close();
        System.out.println("File created.............");
        return 1;
    }
}

在这个程序中,我们使用 bufferedinputstream 从文件中读取内容,当我想使用 bufferedoutputstream 将 Test.java 文件的内容写入 varun.txt 文件时,它会创建文件但不在 varun.txt 中写入任何内容。如果我们将 Test.java 中的内容写入 varun.txt 而不读取它,创建文件并写入两者。为什么这样做。

4

1 回答 1

1

当您调用 时bisx.inputMethod(),您正在读取流以打印其内容。问题是,你现在还不想这样做。读取流会消耗它,因此您返回的流已经结束,没有什么可读取的了。

如果要打印出文件的所有内容,然后将其全部写入另一个文件,这是两个独立的操作。根据文件的大小,它需要读取文件两次——使用两个不同的输入流——或者将整个文件缓冲在内存中。

相反,如果您只想在复制文件时显示文件的内容(这看起来像这里的真正目标),那么您有几个有价值的选择......

  • 您可以outputMethod数据写入输出文件时打印数据。在短期内,这可能是最简单的解决方法。当然,您还需要删除inputMethod读取流的代码。

  • 您可以子类化FilterInputStreamFilterOutputStream定义一个流,每当它(分别)读取或写入数据时,它也会用它做其他事情。例如,它可以...

    • 将数据打印到System.out. 非常简单,但很僵硬。我越是考虑它......嗯。

    • 将数据复制到另一个任意输出流。 这将更加灵活;例如,您可以发送到日志文件或其他内容。而且它只需要很少的额外代码System.out.print,它通常会在物有所值的部门中获胜。

    • 触发其他对象可以订阅的事件。这可以为您提供几乎无限的灵活性(因为订阅者不再被迫关心流),但也可能更加复杂。(您基本上需要添加一个事件/订阅 API。)对于像这样的小型项目来说,这通常是矫枉过正的。

    请注意,如果您走这条路,您应该考虑重构事物,以便对象的构造函数采用流而不是创建流。这样,main可以决定输出是否发生以及输出到哪里,其他对象甚至不必关心。他们可以做他们的工作,将流视为常规的旧 InputStreams 和 OutputStreams,而您传入​​的流决定了还会发生什么。

(顺便说一句:为了专注于主要问题,我半忽略了您通过转换为“解码”的事实char。这可能无法忠实地再现文件的内容,除非您知道事实内容是ASCII字符。我假设输出是调试的东西,所以这不值得长篇大论......但知道在一般情况下,它可能会导致问题。)

于 2012-07-10T16:47:29.010 回答