当前位置: 首页 > 面试题库 >

为什么在调用write()方法时缓冲的编写器没有立即写

柴阳云
2023-03-14
问题内容
package javaapplication11;

import java.util.Scanner;
import java.io.*;


/**
 *
 * @author jenison-3631
 */
public class JavaApplication11 {

    /**
     * @param args the command line arguments
     * @throws java.io.IOException
     */

    public static void main(String[] args) throws IOException
    {

       // TODO code application logic here
       // File file = new File("/Users/jenison-3631/Desktop/csvv.txt");
        int n,z=1;
        FileWriter writr = new FileWriter("/Users/jenison-3631/Desktop/csvv.txt");
        FileReader fr= new FileReader("/Users/jenison-3631/Desktop/csvv.txt");
        BufferedReader br=new BufferedReader(fr);
        BufferedWriter bw= new BufferedWriter(writr);
        try{
        while(z==1)
        {
            System.out.println("please enter your choice\n1.Add number\n2.Delete number\n3.List all\n4.Search number");
            Scanner s= new Scanner(System.in);
            n= s.nextInt();
            switch(n)
            {
                case 1:

                String str;
                String number;
                System.out.println("Enter the name");
                s.nextLine();                       
                str= s.nextLine();
                System.out.println("Enter the number");
                number=s.nextLine();   
                System.out.println(str+" "+number);

               /* writer.append(str);
                writer.append(',');
                writer.append(number);
                writer.append('\n');*/
                String actual=str+","+number+"\n";
                bw.write(actual,0,actual.length());
                break;

                case 2:
                String del=null;
                String line=null;
                String spl=",";
                System.out.println("Enter the name whose phone number should be deleted");
                s.nextLine();
                del=s.nextLine();

                while((line=br.readLine())!=null)
                {
                    String[] country = line.split(spl);
                    System.out.println("hai"+country[0]);
                }


                System.out.println(del);
                break;


            }
            System.out.println("Do u wish to continue....if yes press 1 else press 2");

            z= s.nextInt();
        }
    }
    finally{
    bw.close();
    br.close();
    }
}
}

在我的情况2中,当我尝试从文件csvv.txt中取回名称时,该文件不起作用,因为该文件实际上没有数据。但是当我单独运行案例1时,数据在文件中写入


问题答案:

BufferedWriter不会立即写入,因为它会 缓冲 给定的数据。

假设您在公司的邮件室工作。有人走进来并寄给客户。您需要10分钟才能到街上的邮局邮寄。您会立即接受这封信,还是会等着看是否有人会先给您带来一封信?

这是缓冲:您不必等待立即进行繁琐的操作(走在街上),而是可以等待并立即收集很多事情要做-
如果您要寄100封信,走下来仍然只需要10分钟即使在街道上将它们塞进邮箱的时间稍长一些,也是如此。

计算机上的IO也是这样:它很昂贵。写入磁盘,发送到网络等速度很慢,因此您不必重复执行这些操作。

但是您是否应该关心缓冲的发生?在很大程度上,没有。在邮件室的示例中,人们只想放下信件,并知道将来会在某个时候寄出。一旦他们把它放下,对他们来说,现在走在街上还是先等待100个字母都无关紧要。

在代码中,您通常不关心何时写入数据。它只是在某个时间点被写入,例如,在关闭文件编写器时,或者在您要求将一定数量的数据写入文件时。

如果您担心在其中一种情况发生之前就已写入数据,则可以致电bw.flush()强制其立即发生。

您可以在Oracle的Essential
Java教程中阅读有关IO和缓冲的更多信息。您可以从这里开始,但是有关缓冲的内容在这里



 类似资料:
  • 问题内容: 还是? 我有一个来自的线程对象: 其中pObject是实现Runnable接口的类的对象,然后在线程对象上调用start方法,如下所示: 现在,我的理解是,当调用start()时,JVM隐式(立即)调用了run()方法,该方法可能会被覆盖(就我而言) 但是,在我的情况下,似乎没有立即(根据需要)调用start()方法,而是直到从调用块完成其他语句/方法为止,即,如果在start()调用

  • 问题内容: 我正在尝试使用编写一个简单的代码,但是只是不愿等待它假定的时间而代码立即执行。我究竟做错了什么? 问题答案: 您正在立即调用该函数并计划其返回值。 使用: 注意:没有原谅。

  • 在上面的代码中,我得到的输出是: 在我做 d1.name 之后=“亚瑟” 我期望输出是

  • 问题内容: 好的,我会尽快解决这个问题,因为它应该很容易解决… 我读过很多类似的问题,答案似乎非常明显。首先,我不需要查找任何内容!但是…我有一个错误,我无法理解如何修复或为什么会发生。 如下: 与此相关的代码更多,但这就是我的问题所在。应该工作吧? 我也尝试过这个: 所以我有这两个,两者应该相同。我实际上是将状态设置为与其上方的行相同! 但是它总是返回与应有的相反的结果。 我用的时候也一样; 如

  • 好吧,我会尽快解决的,因为这应该是一个很容易的解决办法... 我读过一堆类似的问题,答案似乎相当明显。从一开始我就不用抬头看了!但是...我有一个错误,我无法理解如何修复或为什么它会发生。 具体如下:

  • 关于IO,我有两个问题。 A.在一个教程和一些StackOverflow答案中,他们声称没有被修复。是真的吗? 以下代码使用将数据读入字节数组(1024字节) 从API,有一行: 公共整数读取(字节b[])引发IOException @参数b:将数据读入的缓冲区 B.如果它们都是缓冲的,它们都将数据放入缓冲区,并从缓冲区中获取数据,那么使BufferedInputStream比FileInputS