博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
I/O复习
阅读量:5366 次
发布时间:2019-06-15

本文共 3060 字,大约阅读时间需要 10 分钟。

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.
(FileInputStream.java:138) at java.io.FileInputStream.
(FileInputStream.java:93) at java.io.FileReader.
(FileReader.java:58) at FileWriteTest.main(FileWriteTest.java:11)*/

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

 

I/O原理

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

 

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

 

说明:

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

 

流的分类:

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

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

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

 

 

缓冲流和对象流

缓冲流的应用场景?(读大文件时,可以增加读写效率,用BufferReader来读)

当文件大的时候,肯定用字符流读会很不便捷,则需要用过滤流,也叫处理流,即对一个已存在的流进行连接和封装,并为了扩展其读写功能。而缓冲流就是其中一种。

 

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

 

例如把

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{

……

}

 

问题:

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

 static是修饰静态变量时,只要类加载即可,不需要读到数据源(文件、内存、网络连接)当中,即不需要序列化。

 

随机存储存取文件流和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”);

 //把以往的笔记看看,其实你之前花时间学过IO流的,不懂的位置参看一下蓝白书的例子,另外把红黄书的后面的题目做一下,宝典的对应的内容复习一下。

转载于:https://www.cnblogs.com/shijinglu2018/p/8379701.html

你可能感兴趣的文章
lintcode83- Single Number II- midium
查看>>
[工具] Sublime Text 使用指南
查看>>
Web服务器的原理
查看>>
#10015 灯泡(无向图连通性+二分)
查看>>
HAL层三类函数及其作用
查看>>
web@h,c小总结
查看>>
Data Structure 基本概念
查看>>
NEYC 2017 游记
查看>>
[搬运] 写给 C# 开发人员的函数式编程
查看>>
core--线程池
查看>>
他山之石:加载图片的一个小问题
查看>>
shell - 常识
查看>>
Spring Cloud Stream消费失败后的处理策略(三):使用DLQ队列(RabbitMQ)
查看>>
PKUWC2018 5/6
查看>>
As-If-Serial 理解
查看>>
洛谷P1005 矩阵取数游戏
查看>>
在Silverlight中使用HierarchicalDataTemplate为TreeView实现递归树状结构
查看>>
无线通信基础(一):无线网络演进
查看>>
关于python中带下划线的变量和函数 的意义
查看>>
linux清空日志文件内容 (转)
查看>>