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