I/O复习

Posted 贰零一八

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了I/O复习相关的知识,希望对你有一定的参考价值。

I/O流之字符流

问题:字节流和字符流区别?

java1.0只提供了字节流,分为输出流(Inputstream)和输入流(Outputstream),

以字节为单位来读取或写入数据,以二进制来处理数据(8位),但无法处理Unicode字符。

java1.1版本增加了字符流Reader(输入流)和Writer(输出流),可以解决16位的

Unicode字符。

所以最好用字符流

(Unicode字符:可以在二进制和字符间相互转换的一种编码机制或准则)

//读取文件并复制文件
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileWriteTest{

    public static void main(String[] args) {

        try{
            FileReader finput=new FileReader("桌面\\递归");//产生输入流
            FileWriter Foutput=new FileWriter("桌面\\递归副本");//产生输出流

            int i=0;
            while((i=finput.read())!=-1){
                System.out.print((char)i);
                Foutput.write(i);
            }
            finput.close();

            Foutput.flush();
             //**注意,Foutput,调用flush()方法来强制写出所有缓冲区的数据,清空缓冲区
            Foutput.close();

        }catch(FileNotFoundException e){
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}
/*运行结果:无法找到文件,为什么?
java.io.FileNotFoundException: 桌面\递归 (No such file or directory)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(FileInputStream.java:195)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at java.io.FileInputStream.<init>(FileInputStream.java:93)
    at java.io.FileReader.<init>(FileReader.java:58)
    at FileWriteTest.main(FileWriteTest.java:11)
*/

说明:如果要输出流写数据,需要在写入操作完成后,调用flush()方法来强制写出所有缓冲区的数据

 

I/O原理

数据源———输入流——>java程序读取数据

 

java程序写入数据———输出流——>数据源(存储媒介)

 

说明:

数据源:比如文件、内存、网络连接

 

流的分类:

数据流:输入流和输出流(读取和输出)

数据传输单位:字节流 (InputStream和OutputSteam)和字符流(Writer和Reader)

按功能分:过滤流(直接操作数据源的流)和节点流(对已存在的流进行读写和封装,为通过更强大的读写功能)

 

 

缓冲流和对象流

缓冲流的应用场景?

当文件大的时候,肯定用字符流读会很不便捷,则需要用过滤流,也叫处理流,即对一个已存在的流进行连接和封装,

并为了扩展其读写功能。而缓冲流就是其中一种。

 

缓冲流:直接操作一个数据源的节点流的一个包装。

 

例如把

FileReader finput=new FileReader("桌面\\递归");//产生输入流

改为

BufferReader finput=new BufferReader("桌面\\递归");

此时读取的效率会更高

 

对象流的应用场景?

对象流也是过滤流的一种,主要有ObjectOutputStream类和ObjectInputStream类,用于存和读基本类型数据或对象的

过滤流,特点是把java中的对象写到数据源中(序列化),也能把对象从数据源中还原出来(反序列化)。

 

说明:

1.对象流不能序列化static或transit修饰的成员变量。

2.序列化的对象所对应的类那必须实现Java.io.Serializable接口。

 

比如:

import Java.io.Serializable;

public class Student implements Serializable{

……

}

 

问题:

什么是不可序列化的对象呢?是不是这个对象本身就已经被写出来了呢?

 

随机存储存取文件流和File类

 

1.随机存储存取文件流

RandomAccessFile是一种特殊的流类,它可以在文件任何地方读取或写入数据。

RandomAccessFile能在文件里随意地前后移动,它是一个直接继承于Object的类。

简单概括:文件内容可跳读、可间断下载(不连续)、储存。

 

一般RandomAccessFile的工作方式是吧DataInputStream和DataOutputStream

结合起来,再加上一些自己的方法。

常用方法:

long getFilePointer();   //用于得到当前文件指针

void seek(long pos);    //用于移动文件指针到指定的位置

int   skipBytes(int n);   //使文件指针向前移动指定的n个字节,即跳过的字节数。

 

2.File类

应用场景是什么?

操作某个文件夹或设置某个文件夹的属性或代表文件的概念,以及存储一些对于文件

的基本操作。

说明:其定义了一系列与操作系统平台无关的方法来操作文件和目录。

(查看API文档关于java.File类)

File文件或目录的生成

File类的对象可代表一个文件路径

File f1=new File(“d:\\test\\1.txt”);

 

以上是关于I/O复习的主要内容,如果未能解决你的问题,请参考以下文章

I/O复习

二次元码农的成长之路I/O复习1

Java复习——I/O与序列化

Node复习

I/O系统

I/O系统