你真的以为了解java.io吗 呕心沥血 绝对干货 别把我移出首页了

文章结构

1 flush的使用场景

2 一个java字节流,inputstream 和 outputstream的简单例子

3 分别测试了可能抛出java.io.FileNotFoundException,java.io.FileNotFoundException: test (拒绝访问。),java.io.FileNotFoundException: test.txt (系统找不到指定的文件。)的所有场景,你再也不怕java.io异常了

4 测试了flush的使用场景

5 给出了flush的源码

6 提出了自己的两个小疑问

1 flush的有效使用场景

outputstream中有flush()方法, 而inputstream没有用到缓冲区,对于字节流来说,缓冲区就是一个byte数组,而OutputStream类的flush()却什么也没做,其实flush()是Flushable接口的方法,官方文档的对该方法的注释是“Flushes this output stream and forces any buffered output bytes to be written out.”。OutputStream方法实现了Flushable接口,而又什么也没做,真是让人一头雾水,那么什么时候flush()才有效呢?当OutputStream是BufferedOutputStream时。当写文件需要flush()的效果时,需要需要将FileOutputStream作为BufferedOutputStream构造函数的参数传入,然后对BufferedOutputStream进行写入操作,才能利用缓冲及flush()。查看BufferedOutputStream的源代码,发现所谓的buffer其实就是一个byte[]。BufferedOutputStream的每一次write其实是将内容写入byte[],当buffer容量到达上限时,会触发真正的磁盘写入。而另一种触发磁盘写入的办法就是调用flush()了。

2一个java字节流,inputstream 和 outputstream的简单例子

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class OutputStreamDemo {
    public static void main(String[] args) {
          try {

             // create a new output stream
             OutputStream os = new FileOutputStream("test.txt");

             // craete a new input stream
             InputStream is = new FileInputStream("test.txt");
             // write something
             os.write(‘A‘);

             // flush the stream but it does nothing
             os.flush();

             // write something else
             os.write(‘B‘);

             // read what we wrote
             System.out.println("" + is.available());

          } catch (Exception ex) {
             ex.printStackTrace();
          }

       }

}

说明我们的os.flush()什么也没有做

其中  OutputStream os = new FileOutputStream("test.txt");将在我们项目下的根文件下建立一个TXT文件,FileOutputStream创建一个向具有指定名称的文件中写入数据的输出文件流。创建一个新 FileDescriptor 对象来表示此文件连接。如果有安全管理器,则用 name 作为参数调用 checkWrite 方法。 如果该文件存在,但它是一个目录,而不是一个常规文件;或者该文件不存在,但无法创建它;抑或因为其他某些原因而无法打开它,则抛出 FileNotFoundException,

3 测试java.io异常

当我们的String name定义为一个空字符串的时候 抛出如下异常

java.io.FileNotFoundException:

at java.io.FileOutputStream.open0(Native Method)

at java.io.FileOutputStream.open(Unknown Source)

at java.io.FileOutputStream.<init>(Unknown Source)

at java.io.FileOutputStream.<init>(Unknown Source)

at OutputStreamDemo.OutputStreamDemo.main(OutputStreamDemo.java:14)

当我们在根目录下定义一个文件夹也名为test的文件夹时,会抛出如下异常

java.io.FileNotFoundException: test (拒绝访问。)

at java.io.FileOutputStream.open0(Native Method)

at java.io.FileOutputStream.open(Unknown Source)

at java.io.FileOutputStream.<init>(Unknown Source)

at java.io.FileOutputStream.<init>(Unknown Source)

at OutputStreamDemo.OutputStreamDemo.main(OutputStreamDemo.java:14)

当我们的FileOutputStream("test.txt");和FileInputStream("test.txt");中的字符串不一致时会出现异常

java.io.FileNotFoundException: test.txt (系统找不到指定的文件。)

at java.io.FileInputStream.open0(Native Method)

at java.io.FileInputStream.open(Unknown Source)

at java.io.FileInputStream.<init>(Unknown Source)

at java.io.FileInputStream.<init>(Unknown Source)

at OutputStreamDemo.OutputStreamDemo.main(OutputStreamDemo.java:17)

我们这里用了 os.write(‘A‘);这里的‘A‘是int类型的

4 测试了flush的使用场景

OutputStream os = new FileOutputStream("test.txt");

             // craete a new input stream
             InputStream is = new FileInputStream("test.txt");
             // write something
             BufferedOutputStream bos = new BufferedOutputStream(os);
             bos.write(‘C‘);

             // flush the stream but it does nothing
             bos.flush();

             // write something else
             bos.write(‘B‘);
             bos.close();

如果我们不使用flush,也不使用close的话,则输出结果为0
5 给出了flush的源码

通过查看源码,可以看到 BufferedOutputStream中的flush实现如下 BufferedOutputStream是同步的

public synchronized void flush() throws IOException {
        flushBuffer();
    out.flush();
    }
private void flushBuffer() throws IOException {
        if (count > 0) {
        out.write(buf, 0, count);
        count = 0;
        }
    }
    public void write(byte b[], int off, int len) throws IOException {
    if (b == null) {
        throw new NullPointerException();
    } else if ((off < 0) || (off > b.length) || (len < 0) ||
           ((off + len) > b.length) || ((off + len) < 0)) {
        throw new IndexOutOfBoundsException();
    } else if (len == 0) {
        return;
    }
    for (int i = 0 ; i < len ; i++) {
        write(b[off + i]);
    }
    }

6 提出了自己的两个小疑问

我的小疑问:

1 小疑问 另外,在我使用editplus打开该文件的时候,我任然可以执行java命令重新对该文件进行写入,这让我想到了java的多线程的锁及数据库的锁

也对,在我用editplus打开该文件的时候仅仅是执行读取得权限,而其他应用程序是可以进行更改的

2 当我使用java程序更改该文件的时候,我在打开editplus窗口的时候,提示我the file has been modified by another programmer ,do you want to reload it.这说明editplus有一个监视器随时在监视该文件的状态

时间: 2024-11-05 15:56:25

你真的以为了解java.io吗 呕心沥血 绝对干货 别把我移出首页了的相关文章

java IO 四(转换流的使用)

扯点别的: 随着年龄的慢慢增长,有些道理才明白,有些爱才感慨.家人或许希望你能立足大城市,开创一番事业.但是在内心里家人永远希望你多花点时间陪陪他们,一起吃吃饭,说说话,只要你平平安安,生活快乐,家人就感到幸福.所以多花点时间陪陪父母.陪陪爱人.陪陪孩子. 又搁置了不短的时间,继续写java io的知识,现在感觉自己的记忆力真的不行了,总是记不住东西,哎,关键还是理解不够深入,靠死记硬背是不行的看样.开搞.参考自毕向东老师的视频 第一: InputStreamReader 看看JDK里面的解释,

Java IO 序列化 transient关键字

Java IO 序列化 transient关键字 @author 敏敏Alexia 转自:http://www.cnblogs.com/lanxuezaipiao/p/3369962.html 1. transient的作用及使用方法 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化. 然而在实际开发过程

利用Java IO复制多级文件夹

package package1; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class Copy {         private static File newDest = null;         private static FileInputStream fis = null;    

[Java] Java IO Files

Files 使用 FileInputStream 或 FileReader 可以用于读入文件,前者基于二进制,后者基于文本.使用它们不需要读取整个文件,但是只能按照它们存储的顺序,依次读取字节,或字符. 使用 FileOutputStream 或 FileWriter 可以把数据写出到文件,按照数据被写入的顺序,依次存储数据. RandomAccessFile 可以在文件中跳转,读入数据,或者写出数据到文件.Random Access 并不意味着你真的从随意的位置读入数据,或者把数据写入到随意位

java io流之int数组数据的插入与取出

java io流大家都很熟悉吧,有时候如果用的不熟,对于数据的处理真的很头疼,下面是对与int数组的处理. 下面是代码: public class Stream { private int a[]; private BufferedWriter bufferedWriter; private BufferedReader bufferedReader; private String pathName="e:\\stream.txt"; private void random(){ Ra

Java IO——堵塞式

目录     1.  File类   2.  InputStream和OutputStream   3.  Reader和Writer   4.  RandomAccessFile   5.  对象序列化   6.  标准I/O   7.  进程控制   内容     1.  File类   File类给人的感觉就是文件类,其实对其恰当的诠释却是Filepath(文件路径),java.io.File类不仅可以代表一个特定的文件,还可以代表一个目录下面的一组文件名称.当File指向一个文件集时,就

J2SE知识点归纳笔记(七)---Java IO Part 1:File类与RandomAccessFile类

J2SE知识点归纳笔记(七)---Java IO Part 1:File类与RandomAccessFile类                                                                 --转载请注明出处:coder-pig 本节引言: 兜兜转转,又回来写Java了,上一篇J2SE知识点归纳笔记(六)---Java常用类是上2014.4.14写的,时隔一年 又来重拾之前还没写完的系列了,前些天群里一个妹子反映她Java基础薄弱,然后抱怨在cs

Java IO流(第二讲):File类

File是基于磁盘操作的I/O,Java多数IO都是实行流式操作,但是File不是,它不会读取文件信息或者向文件存储,它是直接处理文件的,它不会读取文件信息或者向文件存储,File对象可以用来获取或处理与磁盘文件相关的信息,例如权限,时间,日期和目录路径.File类的名字比较欺骗性,它其实并不仅仅代表一个特定文件名字,也可以代表文件目录下一系列文件名,用File存储数据存在很大的安全性,但是文件仍是我们存储数据以及共享数据的主要工具. 下面我们来解读File类在Java中的运用方式. 首先,我们

import java.io.*;出错问题

今天用servelet技术编程,在学校机房成功了!可是为什么在自己的电脑却显示 import java.io.*; 错误?用的是同一个版本的myeclipse.Tomcat用的都是myeclipse Tomcat.jdk版本用了不同,机房用的是1.6的,电脑用的是1.8. 原来真的是jdk版本兼容问题,1.8版本的jdk太高了. 我修改了:window->preference->Java->Installed JREs->选择低版本的JDK->ok