java学习笔记07—IO流


IO
======================================
* Input/Output


java.io.File
java.io.RandomAccessFile

java.io.InputStream / OutputStream
java.io.FileInputStream / FileOutputStream
java.io.BufferedInputStream / BufferedOutputStream
java.io.DataInputStream / DataOutputStream
java.io.PrintStream
java.io.ObjectInputStream / ObjectOutputStream
java.io.ByteArrayInputStream / ByteArrayOutputStream


java.io.Reader / Writer
java.io.InputStreamReader / OutputStreamWriter
java.io.FileReader / FileWriter
java.io.BufferedReader / BufferedWriter
java.io.PrintWriter

java.io.File
==============================================
* 表示文件或文件夹
* 他表示的路径,不一定存在

创建实例
-----------------------------------
1) File f = new File("d:/aaa/xxx.txt");

2) File f = new File("d:/xxx",  "xxx.txt");

方法
-----------------------------------
获取文件、文件夹属性

exists() - 路径是否存在
getAbsolutePath() - 获得路径
getName() - 获得文件名
getParent() - 父目录路径
getParentFile() - 父目录File实例
length() - 文件字节量,文件夹无效
isDirectory() - 是否是文件夹
isFile() - 是否是文件
isHidden() - 是否隐藏文件
lastModified() - 最后修改时间,毫秒值


canExecute() - 是否可执行
canRead() - 是否可读
canWrite() - 是否可写
getTotalSpace() - 分区大小
getUsableSpace() - 分区可用空间大小

setLastModified(long time) 
setReadable(boolean readable) 
setReadOnly() 
setWritable(boolean writable) 

文件、文件夹操作方法

createNewFile() - 将不存在的文件创建出来,
成功返回 true,失败返回 false


delete() - 删除文件、空文件夹
成功返回 true,失败返回 false

mkdir() - 创建单层文件夹,成功返回 true,失败返回 false
mkdirs() - 创建多层文件夹,成功返回 true,失败返回 false


renameTo(File t) - 将当前文件重命名为目标文件

File.createTempFile(前缀,后缀)
- 在系统临时目录中,创建临时文件,
 并返回表示此文件的File实例
前缀必须3个字符以上

文件列表 

list() - 获得目录列表,返回String[],仅含文件名
listFiles() - 获得目录列表,返回File[]

list(FileNameFilter filter)
listFiles(FileNameFilter filter)
listFiles(FileFilter filter)

- 外接过滤器,对目录列表中的所有文件进行判断,
只留下过滤通过的文件


java.io.RandomAccessFile
==================================================
* 读写文件的工具
* 将一个文件中所有字节,看做是一个数组
可以同过位置,跳至某个字节,进行读写操作

* 用于读写固定字节格式的文件

创建实例
===========================================
1)
RandomAccessFile raf = 
new RandomAccessFile(File对象, "rw");

2)
RandomAccessFile raf = 
new RandomAccessFile(字符串路径, "r");

方法
===========================================
write(int b)

将一个字节输出到文件,并向后移动指针,
参数 int 的4个字节中,末尾字节会输出到文件
[xx][xx][xx][OO] --》 [OO]

write(byte[] arr)

输出字节数组中所有字节

write(byte[] arr, int start, int n)

数组字节数组中 start 开始的 n 个字节

writeInt(int i) - 输出 int 的4个字节
writeLong(long l) - 输出 long 的8个字节
writeDouble(double d) - 输出 double 的8个字节
writeUTF(String s)

先输出2个字节表示字符串的字节量,
再输出字符串的所有字节


read()

读取单个字节,并向后移动指针,
这个字节经过转换运算,在前面补上三个0字节变成int类型
[xx] --》 [00][00][00][xx]

readInt() - 连续读取4个字节,转为 int
readDouble() - 连续读取8个字节,转为double
readUTF()

先读取2个字节,确定字符串的字节长度,
再读取响应字节量,转为 String

seek(long position)

将指针定位到指定位置

length()

文件字节量

getFilePointer()

获得指针当前位置



=====================================
* 将数据读写抽象为字节在管道中流动


java.io.InputStream / OutputStream

=====================================
* 字节流的抽象父类

方法
------------------------------
write(int b)

将 int 的4个字节中,末尾一个字节输出

write(byte[] arr)

将数组中所有字节全部输出

write(byte[] arr, int start, int n)

将数组中从 start 开始的 n 个字节输出

flush()

如果存在缓存,刷出缓存

----------

read()

读出1个字节,并在前面补3个0字节,转为 int 类型,
如果返回 -1 ,表示没有数据

read(byte[] arr)

读出多个字节,放入指定的数组中,
返回读取的字节数量
如果返回 -1 ,表示没有数据

available()

剩余可读字节数量,
有些场景中,不可用




java.io.FileInputStream / FileOutputStream
===============================================
* 读写文件的流

创建实例
-----------------------------------------
FileOutputStream out = new FileOutputStream(File对象);

FileOutputStream out = new FileOutputStream(字符串路径);

存在不存在,都会新建文件,
如果文件夹不存在,会出现 FileNotFoundException

FileOutputStream out = new FileOutputStream(字符串路径, true);

如果文件不存在,会新建文件,
如果文件存在,在文件末尾追加数据
低级流、节点流
==========================================
* 直接与数据源相接


高级流、操作流
==========================================
* 与其他流相接,对流动的数据,进行特定的运算处理

* close() 时,会依次close与其相接的流

* flush() 时,会依次flush与其相接的流

java.io.BufferedInputStrteam / BufferedOutputStream
=======================================================
* 提供一个缓冲区,以提高数据读写效率

* flush() 方法
输出数据时,缓冲区没有满时,可刷出这些数据

* 默认缓冲大小 8192

构造方法
----------------------------
BufferedOutputStream out = new BufferedOutputStream(其它流);

BufferedOutputStream out = new BufferedOutputStream(其它流, 缓冲区大小);

java.io.DataInputStream / DataOutputStream
=======================================================
* 以固定的字节格式读写数据

DataInputStream与DataOutputStream必须成对出现,此外,DataInputStream与DataOutputStream可以直接装饰FileinputStream和FileOutputStream。
方法
-----------------------------
writeInt(int i) - 将int的4个字节输出
writeDouble(double d) - 将double的8个字节输出
writeUTF(String s)

先输出2字节,表示字符串字节量,
再输出字符串的字节

readInt() - 连续读4个字节,转为 int
readDouble() - 连续读8个字节,转为 double
readUTF()

先读2个字节确定字节量,
再读取响应数量的字节,转为 String


java.io.PrintStream
===========================================
* 可将任何类型数据,转为字符数据输出

创建实例
------------------------------
PrintStream out = new PrintString(其它流);

PrintStream out = new PrintStream(文件);

PrintStream out = new PrintStream(文件, 字符集);

方法
------------------------------
print(数据)
println(数据)




java.io.Reader / Writer
==============================================
* 字符流的抽象父类
* 只用来读取纯文字数据,而字节流可读取任何数据

方法
---------------------------------
write(int c) - 输出末尾两个字节

write(char[] arr) - 输出数组中所有字符

write(char[] arr, int start, int n) - 输出数组中start开始的n个字符

write(String s) - 输出字符串中所有字符

---------

read() - 读取一个字符,前面补两个字节,转为 int 类型

read(char[] arr) - 读取多个字符,放入数组


java.io.InputStreamReader / OutputStreamWriter
=====================================================
* 从字节流读取字节数据,
并执行编码转换运算,
将字节,转为字符

* 转换流

* 内部存在 8k 字节缓冲

java.io.FileReader / FileWriter
=====================================================
* 就是转换流接文件流
* 不能指定字符集


创建实例
--------------------------------
FileWriter out = new FileWriter(文件);




java.io.BufferedReader / BufferedWriter
=====================================================
* 字符缓冲,对提高效率作用不大,因为java.io.InputStreamReader 本身就有8k的缓冲
* BufferedReader 提供了 readLine()方法(常用)


java.io.PrintWriter
=====================================================
* 将所有数据转为字符数据输出

创建实例
-----------------------------
PrintWriter out = new PrintWriter(文件);

PrintWriter out = new PrintWriter(文件,字符集);

PrintWriter out = new PrintWriter(字符流);

PrintWriter out = new PrintWriter(字节流);

常用方法
-----------------------------
print()
println()




对象序列化
============================================
* 将内存中一个实例的信息,
转为一系列的字节数据

* 字节信息包含:
0) 4字节的序列化头
1) 类型名称
2) 成员变量类型、名称
3) 每个成员变量的值

* 不序列化的成员:
*) static

静态属于类,不属于实例,
序列化实例时,不属于实例的成员不序列化

*) transient

瞬间、临时
仅在程序运行时,在内存中保存,
不会序列化为字节序列,持久保存,

serialVersionUID
------------------------------------
* 类的版本标识,
如果自己不赋值,编译器根据类的信息,自动生成值

* 手动赋值:
private static final long serialVersionUID = 1L;




java.io.ObjectInputStream / ObjectOutputStream
=================================================
* 将一个实例转为一系列字节输出或读取

方法
-----------------------------------------
writeObject(对象)

将指定实例,转为字节序列输出

readObject()

读取字节序列,转为一个实例




java.io.ByteArrayInputStream / ByteArrayOutputStream
===========================================================
* 读写内存中的字节数组
* 低级流,直接与一个数组相接

ByteArrayOutputStream
----------------------------------------
向这个流输出的字节数据,被存放在它内部一个字节数组中;

可用通过方法取出它内部的数组

toByteArray()




流小结
=======================================
* 如何选择流?

原则: 不知道该不该接时,就不接

*) 每个流的功能
*) 自己的数据格式

字符集charset、字符编码encoding
======================================================
ASC II
----------------------------------------
* 128 个字符

0 - ?
1 - ? 
..
97 - a
98 - b
..
127 - ?

ISO-8859-1 
Latin-1
-----------------------------------------
* 西欧字符集

159 - ?
160 - ?
...
255 - ?

-----------------------------------------
* 256 - 65535

GB2312 - 7千多中文字

GBK - 20902个中文
*中文 2个字节
*英文 1个字节

BIG5
JP...
KR...

UNICODE
统一码、万国码
-----------------------------------------
* 容纳全球所有文字
* 所有文字都是用双字节表示
* java 中 char 类型字符,采用 UNICODE 编码

* UNICODE 传输格式
--------------------------------
UTF-8
------------------------
* 用单字节表示英文
* 用双字节表示某些标点
* 用三字节表示中文

UTF-16Be
*双字节,与UNICODE完全一致。例如a的编码都是 0061
UTF-16Le
*双字节  与unicode编码高地位互换,例如a的编码在此编码中是6100


























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值