Io 在BufferedInputStream和BufferedOutputStream类中,为什么写之前读不好。。。。。。。?

Io 在BufferedInputStream和BufferedOutputStream类中,为什么写之前读不好。。。。。。。?,io,Io,在这个程序中,我们使用bufferedinputstream从文件中读取内容,当我想使用bufferedoutputstream将Test.java文件的内容写入varun.txt文件时,创建文件,但不在varun.txt中写入任何内容。如果我们将Test.java中的内容写入varun.txt,而不读取它,则创建文件并同时写入。为什么这样做。当调用bisx.inputMethod()时,您正在读取流以打印其内容。问题是,你现在还不想这么做。读取流会消耗它,因此您返回的流已经结束,没有任何内容可

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

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

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

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

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

  • 您可以子类
    FilterInputStream
    FilterOutputStream
    来定义一个流,该流在读取或写入数据时(分别)也会执行其他操作。例如,它可以

    • 将数据打印到
      系统。输出
      非常简单,但非常严格。我认为越多越好…

    • 将数据复制到另一个任意输出流。这将更加灵活;例如,您可以发送到日志文件或其他文件。而且它比
      System.out.print
      只需要很少的额外代码,因此它通常会为您的业务部门赢得巨大的成功

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

    注意,如果你走这条路线,你应该考虑重构事物,以便对象的构造函数取一个流而不是创建一个流。这样,

    main
    就可以决定输出是否发生以及输出到哪里,而其他对象甚至不必关心。他们可以做他们的工作,将流视为常规的旧输入流和输出流,而您传入的流决定了还会发生什么


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

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

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

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

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

  • 您可以子类
    FilterInputStream
    FilterOutputStream
    来定义一个流,该流在读取或写入数据时(分别)也会执行其他操作。例如,它可以

    • 将数据打印到
      系统。输出
      非常简单,但非常严格。我认为越多越好…

    • 将数据复制到另一个任意输出流。这将更加灵活;例如,您可以发送到日志文件或其他文件。而且它比
      System.out.print
      只需要很少的额外代码,因此它通常会为您的业务部门赢得巨大的成功

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

    注意,如果你走这条路线,你应该考虑重构事物,以便对象的构造函数取一个流而不是创建一个流。这样,

    main
    就可以决定输出是否发生以及输出到哪里,而其他对象甚至不必关心。他们可以做他们的工作,将流视为常规的旧输入流和输出流,而您传入的流决定了还会发生什么

(顺便说一句:为了集中精力讨论主要问题,我已经-
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;
    }
}