简单的IO流

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jnshu_it/article/details/84133830

这里是修真院后端小课堂,每篇分享文从

【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】

八个方面深度解析后端知识/技能,本篇分享的是:

【简单的IO流】

大家好,我是IT修真院深圳分院java第9期学员,一枚正直善良的java程序员。今天给大家分享一下,Java简单的IO流。

 

1.背景介绍

 

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。

数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

 

2.知识剖析

 IO概述:

File 类

IO流 分类

InputStream&Reader

OutPutStream&Writer

RandomAccessFile类  :  随机读取;

 

字节流           输入、输出

字节流

 

学习主要的类和方法。

 

Q: 接受命令行输入:

Q:接受键盘输入

Q:如何知道文件系统中有哪些目录和子目录

如何知道文件的属性,可读|可写;

Q:如何读写文件? (字节文件,字符文件,顺序读,随机读,对象序列化和重构等)

 

概述:

输入:读取

输出:磁盘,光盘,数据库,节点等(很广)

IO流: 输入,输出流。

   字节流:以字节为单位来处理输入,输出操作

   字符流:以字符为单位来处理输入,输出操作

 

File 类

File类代表与平台无关的文件和目录(屏蔽了底层文件系统的不同,是独立平台的文件类)

广义的类,包含方法等,和文件,文件夹,且和平台无关。

 

功能: 新建,删除,重命名文件和目录。*不能通过文件类读取自己。需用IO流访问。

常用方法:

访问文件名: 文件检测 目录操作相关 文件操作相关 获取常规文件信息

getName() -exists() -mkDir() -createNewFile() -lastModify()

         创建文件夹

-getPath() -canWrite -list( ) -delete( ) -Length( )

得到构造参数的路径 ( ) 列出所有子目录

(构造参数写什么就返回什么)

 

-getAbsoluteFile -canRead -ListFile( )

( ) ( ) 列出所有文件

返回File对象的绝对路径名形式

-getAbsolutePath -isFile

( ) ( )

得到绝对路径

(全路径)

 

-getParent( ) -isDirectory

( )

-renameTo

(File newName)

 

 

根据不同的构造方法,能创建不同路径和文件的file。

eg:1:

File myfile = new file("xx","xxx.test)

File myfile = new file("xxx.test")

 

Eg: 2:

File myDic = new= new File("xxx") //在当前路径创建文件夹

myDic = new File(myDic , "xxx.test") //直接调用这个文件夹,让xxx.test放在xxx文件夹下面;

————————————

Console I/O

System.out Standard Out put 是一个PrintStream 里面有很多的重载方法

System.in Standard Input 是一个InputStream ~

System.err Standard error 是一个PrintStream ~

 

 

在java util里面

Scanner 提供了一种标准(格式化)的输入函数。

 

------------------------------------

Advanced I/O Streams

Def: 输入输出流:

输入输出流:说的都是数据流,而数据流是一组有顺序的,有起点和终点的字节集合。

Java 的IO通过 Java.io包的一系列类和接口来实现;

 

 

java开发者,提供了标准的输入输出流类,屏蔽了底层硬件或者是程序的不同;

 

-Java不能直接操作I/O设备,而是通过流作为中间介质,在程序和设备之间建立通道;   

流封闭了底层I/O设备的不同。

-建立流,实际上就是建立数据传输通道,将起点和终点链接起来。

-流是输出传输的抽象表达,与具体设备无关。程序一旦建立了流,就可以不用理会起点或者终点是什么设备。

-输入流: 从文件,标准输入,其它外设的输入, 加载到内存中;

-输出流: 将内存中的数据保存到文件中,或者传输给输出设备;

 

 

File (文件类)学习:

File: 一:

1:Before  I/O operater 需要获得这个文件到基本信息

Path File name  read or  write permission (Create time) (file size)

 

2:File本身不涉及文件内部的具体内容,只是在整体上对文件进行处理,如

上面常用方法提供的操作;

Pass:能对文件名和路径操作.  (是一个广义的类)

 

3:文件和目录是同一抽象成文件处理的;

若“file”是目录,那么具有list方法。

若“file”是文件,那么就不具有list方法;

 

File: 二:

File类有四个构造方法:

 

File的对象,可以是: 目录,文件,存在的具体文件,尚未存在的文件(构建完成会自动创建)

 

——————————————————————————————————————————

I/O基础

 

Byte : in. out

Character : Reader writer

 

 

InputStream:

除了FilterInputStream,其它都是按照字节读的(功能流),效率很低,一次只读一个字节

FileInputStream 读文件-起点是文件;读取本地文件

ObjectInputStream 分布式编程,(节点之间)在两个虚拟机上传输对象

PipeInputStream 多线程之间传输数据;

用于管道输入/输出时从管道中读取数据

SequenceInputSteam 流是多节点来的,依次读取节点

(转换成单个InputStream输入流对象使用)

FileterInputStream DataInputStream 

对数据进行格式处理,可以用来读取java中的基本数据类型

 

用于从本地文件读取数据 PushbackInputStream 

(先读一部分确定属性,再把数据回压,

Pushback~~ 然后读取整个文件)

Buffered~~ BufferedInputStream

读取时都可以多数据进行缓冲 (添加了缓存的流)

 

LineNumberInputStream

(一行一行的读)

StringBufferInputStream 从内存中读,从内存开始的流

ByteArrayInputStream 内存中,是字节数组的流

AudioInputStream Audio的输入输出

 

 

OutputStream

fileOutputStream DataOutPutStream

 

本地文件写入数据 bufferdOutPutStream

PrintStream

提供了向屏幕输出有格式数据的很多方法

ObjectOutPutStream

 

PipedOutPutStream

(成对成在的) 把数据向管道输出

 

ByteArrayOutPutStream

 

DataOutPutStream 提供了对java的基本数据类型的支持

Reader

 

BufferdReader  LineNumberReader

CharArrayReader

StringReader

InputStreamReader FilerReader

字节向字符转换的桥梁

PipedReader

FilterReader pushbackReader

Writer:

BufferedWriter

CharArrayWriter

StringWriter

OutputStreamWriter  fileWriter

PrintWriter

PipeWriter

FilterWriter

判断读写终点;  判断读取方式。  就能选择对应的功能实现; file.jia buff

____________________________________________________________________

InputStream Methods ————————抽象方法

Int read(). 抽象方法; 一次读一个

Int read(byte[ ] buffer )--- 具体方法; 一次读几个,方法byte[]里面

Int read (byte [ ] buffer , int offset , int length )  具体 方法 一次读几个,哪里开始读,读多长

Other methods include:

Void close( )

Int avaliable( ) 有多少个字节,然后方便后续开辟内存

Long skip (long n) 跳过多少个字节读

Boolean makSupported ( )

Void mark (int readlimit)

Void reset( )  回到上次的标记,重复读

 

OutputStream Methods __抽象方法

Void write(int c) 抽象方法

Void write(byte[ ] buffer 具体方法

Void write(byte[ ] buffer ,int offset , int length )  具体方法

Void close ( ) 具体方法

Void flush ( ) 具体方法 最后的流自己push掉;

 

The Reader Methods

Int  read()  抽象

Int read(char[ ] cbuf ) 具体

其它同InputStream 只是声明的数据不是byte ,而是 char[ ] 具体

 

The Writer Methods

Void write(int c)

Void write(char[ ] cbuf)

Void write(char[ ] cbuf ,int offset , int length )

Void write(String string )

Void write(String string ,int offset ,int length)

Void close( )

Void flush( )

 

 

3.常见问题

字符流与字节流转换的特点、何时转换、具体体现?

4.解决方案

转换流的特点:

其是字符流和字节流之间的桥梁

可对读取到的字节数据经过指定编码转换成字符

可对读取到的字符数据经过指定编码转换成字节

何时使用转换流?

当字节和字符之间有转换动作时;

流操作的数据需要编码或解码时。

具体的对象体现:

InputStreamReader:字节到字符的桥梁

OutputStreamWriter:字符到字节的桥梁

这两个流对象是字符体系中的成员,它们有转换作用,本身又是字符流,所以在构造的时候需要传入字节流对象进来。

 

5.编码实战

 

。。。

 

6.扩展思考

 

什么时候使用字节流,什么时候使用字符流?

 

只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流。

 

7.参考文献

 百度 CSDN

 

8.更多讨论

Q1:

InputStream的基本介质流是什么:

A1:

ByteArrayInputStream、StringBufferInputStream、FileInputStream是三种基本的介质流,

它们分别从Byte 数组、StringBuffer、和本地文件中读取数据。

PipedInputStream是从与其它线程共用的管道中读取数据。

ObjectInputStream和所有FilterInputStream 的子类都是装饰流(装饰器模式的主角)。

 

Q2:

 

OutputStream的基本介质流是什么:

A2:

utputStream是所有的输出字节流的父类,它是一个抽象类。

ByteArrayOutputStream、FileOutputStream是两种基本的介质流,

它们分别向Byte 数组、和本地文件中写入数据。PipedOutputStream 是向与其它线程共用的管道中写入数据,

ObjectOutputStream和所有FilterOutputStream 的子类都是装饰流。

 

Q3:

什么是对象的串行化?

A3:

把对像转化成一系列字节,并且记录字节的状态,以便能够在另一台机器进行对象的重构。

 


 

 

 

PPT链接:戳这里

 

腾讯视频:戳这里

 

 

PPT链接 视频链接

更多内容,可以加入IT交流群565734203与大家一起讨论交流

这里是技能树·IT修真院:http://www.jsnhu.com,初学者转行到互联网的聚集地

猜你喜欢

转载自blog.csdn.net/jnshu_it/article/details/84133830