Java流相关

I/O相关 输入/输出 流(数据流动)

数据流动的方向 读数据(输入Input) 写数据(输出output)

文件流 字符流 对象流 网络流....

文件

1.什么叫文件

一种电脑的存储形式

文件有不同的格式 .txt .doc .ppt .mp4 .jpg .rar ...

文件夹?----目录路径

File----->File不是一个真正的文件与电脑上的文件或文件夹产生一一对应的映射关系

File是一个类

1. java.io包中

2. 文件或目录路径名的抽象表示形式

3. File与真实硬盘中的文件或文件夹 不是一个东西

File是在内存中的一个对象<---映射--->硬盘上的文件或文件夹

硬盘上的文件名字是不区分大小写 内存中File对象 变量名字区分大小写

4. File类中的常用的方法

canRead() //可读 canWrite()//可写 isHidden()//是否隐藏

isFile() isDirectory() //返回值都是boolean类型 exists()文件是否存在

file.isFile();判断当前的file是否是一个文件

file. isDirectory();判断当前的file是否是一个目录(文件夹)

length()获取文件中字节的个数(文件大小)

lastModified()获取文件最后的修改时间--->毫秒值

String path = getAbsolutePath() 获取文件的绝对路径 D://test//Test.txt

相对路径 test//Test.txt

绝对路径<---->相对路径

绝对路径可以通过完整的字符串 定位盘符 文件夹 文件

相对路径没有盘符的写法 从当前idea工程(项目)所在的位置找寻

C:\Users\Administrator\IdeaProjects\TestFile//存储idea项目的路径

String name = getName() 获取文件的名字 Test.txt

boolean = createNewFile() 创建新的文件//需要先创建对象 在对象里面写创建文件的名字,然后在调用这个方法

会出现编译时异常,必须抛出异常 如果路径中没有后缀名就创建出一个没有后缀名的文件

已经有的文件不能再次创建

boolean = mkdir 创建新的文件夹 外层没有 不能创建

boolean = mkdirs 创建新的文件夹 外层没有 可以自动创建

String pname = getParent() 获取当前file的父亲file名字

File file = getParentFile() 获取当前file的父亲file对象

String[] names = list() 获取当前file的所有儿子名字 只有文件夹才可以调用

File[] files = listFiles() 获取当前file的所有儿子对象

数组对象为空 证明当前的file是一个文件

数组对象不为空 证明当前的file是一个文件夹 数组长度不为0 证明当前的file是一个不为空的文件夹

遍历儿子的所有对象不能通过循环 通过递归算法

boolean = delete() 删除文件或空的文件夹 不能删除带元素的文件夹

删除不是空的文件夹 通过递归往下一层一层找,然后从内到外一层一层删除

2.什么叫文件流 做什么

读取文件中的内容 向文件中写内容

文件输入流 文件输出流

字节型文件输入流 字节型文件输出流

字符型文件输入流 字符型文件输出流

1.文件夹的遍历----需要一个递归

2.文件夹的删除----需要一个递归

3.文件夹的路径(找父目录)

文件流来完成---->读取文件内容 将内容写入文件

4.文件的复制

5.文件的加密

文件夹的复制

流按照方向(功能)来区分 in(读取) out(写入) 操作的目标来区分 文件流 数组流 字符串流 数据流 对象流 网络流

学习文件流--->

顾名思义 读取文件中的信息in 将信息写入文件中out

文件流按照读取或写入的单位(字节数)大小来区分

字节型文件流(1字节)

FileInputStream/FileOutputStream

字符型文件流(2字节--1字符)

FileReader/FileWriter

字节型流可以操作任何文件

字节型文件输入流(读数据)

FileInputStream

1.包 java.io

2.了解一下继承关系 InputStream类 字节型输入流的父类

3.创建对象

调用一个带File类型的构造方法

调用一个带String类型的构造方法

FileInputStream fps=new FileInputStream("d://test");会出现编译时错误

如果文件路径有问题 则抛出异常 FileNotFoundException

4.常用方法

int code = read(); 每次从流管道中读取一个字节 返回字节的code码//会出现编译时错误

读不到结果是-1 //读取中文可能会产生问题

int count = read(byte[] b) 每次从流管道中读取若干个字节 存入数组内

返回有效元素个数 没有有效元素就返回-1

int count=write(byte[] b, int off, int len)带偏移量的,长度不能超过数组的长度

int count = available(); 返回流管道中还有多少缓存的字节数 读取网络数据的数据可能会有延迟

long=skip(long n) 跳过几个字节 读取//返回的就是跳过字节的个数

多线程--->利用几个线程同时读取文件

10000字节 5个小人同时读取

1-2000 2001-4000 4001-6000 6001-8000 8001-10000

D盘当做服务器 E盘当做客户端

close() 将流管道关闭---必须要做 最好放在finally里 注意代码的健壮性 判断严谨、

//编译时错误

字节型文件输出流

FileOutputStream 将数据写入文件中

1.java.io

2.继承OutputStream 所有字节型输出流的父类

3.创建对象

调用一个带File参数 还有File boolean重载

FileOutputStream fos=new FileOutputStream(new File("d://test//a.txt"));

调用一个带String参数 还有String boolean重载

FileOutputStream fos=new FileOutputStream("d://test//a.txt");

//需要抛出异常

如果文件路径有问题,就会自动创建一个文件

4.常用方法

write(int code); 将给定code对应的字符写入文件 '=' 传递char类型会自动转化//将文件写入到流管道中

//默认是调一次会覆盖之前写的 如果在创建对象的时候写了带两个参数的

写入文件时可以写出没有创建的文件,写入后自己就创建了文件

append是true就可以重复写 new OutputStream(file,true);

byte[] b=string.getBytes();//将一个字符串转化为byte数组类型

write(byte[]) 将数组中的全部字节写入文件 必须抛出异常 str.getBytes()//将字符串变成数组

write(byte[] b, int off, int len)带偏移量的

flush(); 将管道内的字节推入(刷新)文件

close(); 注意在finally中关闭

字节流好处在于什么类型文件都可以

不好出在于处理纯文本文件可能会有问题

加密文件适合于任何格式 记事本最好不用加密(没有多大的效果)

字符型文件流

不管读字母还是文字都算作一个字节来读 FileReader FileWriter

用来操作纯文本文件(文件右键打开方式 记事本打开 能看懂的都可以)

.txt .properties

FileReader

1.java.io包

2.继承 InputStreamReade--> Reader

3.构造方法 需要抛出异常

4.常用

int code=read()//返回code码

read(char[])

FileWriter

1.java.io包

2.继承 OutputStreamWriter Writer 需要抛出异常

3.构造方法

带file参数 带file,boolean参数

带String参数 带String,boolean参数

4.常用

write(int code)

write(char[])

write(string)

flush close

扩展:字符集

字符 文字和符号总称(Character)

不同国家的数字和符号是一样的 字母

不同国家的文字 中文 日文 韩文

计算机最早产生是按照英语单词 单个字符设计的

字母 数字 符号-----1字节 8bit 256

如果计算机想要处理除了上述字母符号以外的其他字符---比如中文2字节

需要将中文进行字符编码----->拆分 和 组合

拆分合组合的规则---所谓的字符编码

常见的字符编码

ASCII American Standard Code for Information Interchange 处理英文

ISO-8859-1 处理不了中文

处理中文

GB2312 GB18030 GBK(国标扩展码) BIG5(中国繁体字) 处理中文汉字

Unicode

UTF-8 UTF-16

平台(windows操作系统)默认字符集GBK Linux(MacOS)默认字符集UTF-8

编程序使用的开发环境(IDE) Idea-->UTF-8 Eclipse-->GBK

注意在用记事本存储文字 流操作纯文本形式的时候

字符的形式采用UTF-8

String s = "你我他";

byte[] = s.getBytes("UTF-8");

new String(byte[],"UTF-8");

文件流(低级)

FileInputStream/FileOutputStream

FileReader/FileWriter

缓冲流(高级)

高级流就是通过装饰者模式进行一层一层包装的

在流管道内增加缓存的数据

让我们使用流读取的文字更加的流畅

高级流--->创建通过低级流

BufferedInputStream/BufferedOutputStream

BufferedReader/BufferedWriter

BufferedInputStream

构建方式 使用低级流构建

FileInputStream fis=new FileInputStream(file);

BufferedInputStream bis=new BufferedInputStream(fis);

基本使用与低级流的方法完全一致

read() skip() available() close()

BufferedOutputStream

构建方式 使用低级流构建

注意 缓冲流构建的时候没有boolean(在构建低级流FileOutputStream的时候有)类型的参数

基本使用与低级流的方法完全一致

write() flush() close()

BufferedReader

先构建低级流FileReader

String value = readLine();读一行

BufferedWriter

先构建低级流FileWriter

write(String)

newLine()换行

通过高级流写入文件需要调用flush

数组 box 集合(List Set Map)--->做真实数据的存储

都不好--->临时性的存储 都在内存中

文件----->永久性的存储 存储在硬盘

总结

文件流

低级

字节型 FileInputStream FileOutputStream

字符型 FileReader FileWriter 字符集65279

缓冲

字节型

BufferedInputStream BufferedOutputStream

字符型

BufferedReader BufferedWriter

数组流

byte数组

ByteArrayInputStream ByteArrayOutputStream

char数组

CharArrayReader CharArrayWriter

数据流

DataInputStream DataOutputStream

字符串流

StringReader StringWriter

对象流

ObjectInputStream ObjectOutputStream

ois.readObject oos.writeObject

注意:使用输出流的时候一定要把信息推进流管道(flush)  不然输入流就读取不到信息

1.为什么要有文件?

文件永久性的保存信息 将很多的数据直接存入文件----数据持久化

2.如果按照以行为单位写信息

好处在于每一行记录的信息都是相关的

信息我们可以读取出来 直接看懂文件

不好在于第一不安全 直接看懂

不好在于只能记录String信息 不能记录一些动作(方法)

3.读取出来的信息 String ---> Person

4.如果能将对象拆分成字节码 直接写入文件

将对象直接存入文件中----对象流

将对象写入到文件中

Person p=new Person("张三","男","18");
ObjectOutputStream os=new ObjectOutputStream(new FileOutputStream("src//person.txt"));
os.writeObject(p);
os.flush();

直接写入对象会出现异常NotSerializableException(序列化)

需要让对象实现Serializable接口,这个接口是一个示意性接口没有任何实质的动作,告诉一声  

反序列化

ObjectInputStream os=new ObjectInputStream(new FileInputStream("src//person.txt"));
Person p=(Person) os.readObject();

对象的序列化/反序列化

对象序列化后不能在修改对象里面的任何东西,也不能新添加任何东西,否则会出现异常

对象的序列化指的是

将一个完整的对象 拆分成字节碎片 记录在文件中

对象的反序列化指的是

将文件中记录的对象随便 反过来组合成一个完整的对象

如果想要将对象序列化到文件中 必须实现接口(Serializable)

需要让对象实现Serializable接口

是一个示意性接口

同时为了让对象可以反序列化

需要让对象中多存在一个属性 private static long serialVersionUID = 任意L;

使对象序列化之前和之后的版本号保持一致

Settings-->Editor-->inspections-->

搜索框搜索UID,勾选JVM Languages

如果想要将对象反序列化

需要给对象提供一个序列化的版本号 1.7版本-->String 1.8-->String

  • 30
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值