0
点赞
收藏
分享

微信扫一扫

IO与网络编程1(对象流结尾。)

Sky飞羽 2022-01-09 阅读 57
java

1.File类的使用

1.1构造一个File文件。

构造方法2,就是在父路径下,造一个子路径。

IDEA里面相对路径在module。

 

分隔符,在java层面单杠有转义字符的作用。这里用双杠。不同系统下有不同的写法。

 第二行调用separator后,用加号就能相连接。

 

1.2File类里的方法。

main方法里的路径,是在project里找的。module在project里面。

单元测试里面是直接测的module里的文件。 

 

 

 获得毫秒数的文件包进Date,可以看看现在的时间。

后面两个方法就是获取

这个目录下的子目录或者这个目录下的文件。

JavaSenior目录下的目录,挨个放进字符串数组。要求这个JavaSenior存在,不然报错

 

 这个用的File数组装的。

 

 输出出来,是一个完整的路径。

renameTo,改名加移动,把file1移动到file2的位置,并且改成file2的名字。

file2是不存在的。(即是预定格式)。

对文件的几个判定方法。

 第一个是判断是否是文件目录,可以用于遍历所有文件目录以及其子目录。(递归)

 

如何获得一个文件的大小?

对于目录,不能直接file.length。记录一个变量,递归的时候,把所有文件的大小记录。

删除目录,只能删一个空目录,IO4,里不能有子目录和子文件。

如果想要,删除这个目录和它所有的子目录和文件呢?

 

获得上层路径即可。

 

 

2.IO流的原理以及分类。

 

节点流,直接作用在文件上。

 处理流,作用在节点流上的流。

 

 

 

2.1读数据

步骤

 4.还有流的关闭。

读一个内容为helloword,的txt文件。

总结:一共三个read

1.无参read,一次读一个,读完一个指针往下一个。

2.read(数组),一次读一个数组。

3.read(数组,数组起始位,,数组终止位)。左开右闭。

 read方法,相当于读完一个指针下移。、

流必须手动进行关闭。

 JVM无能为力。

alt shift Z快捷加上try catch finally

在read的时候,如果阻塞,这个数据读不过来,直接抛出异常,但是没能在执行到

close();关闭流这一步。

对流进行操作的时候,必须要有try catch finally ,保证流资源一定可以关闭。

用一个read的重载方法,,每次输出一个字符数组。

len是每次读入这个数组里字符的个数。

遍历的时候不能用数组的长度,应该用这次读入的个数,因为字符数组的赋值是覆盖的,可能有上一轮的值在里面。

 

 

方式二也错,因为这样还是把字符数组里面的值全取出来了。

 

这个重载的方法也行。左开右闭。

 

2.2写数据到硬盘的文件里

一个简单的例子

 False的意思是不在原有的数据上添加,是直接重写,覆盖原文件。

如果是true,在现有文件内容的基础上再加。

 

 结果为

 

写和读同时存在,如何关闭。try catch就是处理了这个异常。还会接着往下走。两个都能关。

 2.3复制文件

 文本文件也可以用字节流复制,但不能在控制台读,文件里是可以实现复制的。

2.3.1复制字符文件(txt)

字符流,读取的单位是字符。

 4.资源的关闭。

2.3.2图片的复制

这俩类对字节处理。

处理字符的类不能用来处理字节。

处理字节的可以对字符文件txt进行复制(如果里面都是英文和数字)。UTF-8,兼容ascii码。

但不能有中文。

 数组换成Byte数组即可。

2.4对指定路径下文件的复制。

写个copy方法即可。

 

2.5缓冲流

相当于在内存里自己开了个缓冲区。先把文件一次读到缓冲区,然后,对缓冲区进行操作。

中间定义个小数组进行中转操作。

对左边的流进行包装。

作用:提高文件读写效率。

 

读用bis,写用bos指针。

资源关闭关四个,先关外层,再关内层。

关外层的时候,内层顺便也关闭了。所以内层两个不用关。

 

 比较这个方法快的Test,写一个缓冲流复制文件的方法。

 BufferReader和BufferWriter

传统读写方法。

readline,有就读,没有就是null。

 

 2.6图片加密操作。

 

2.7获取文本上每个字符出现的次数。

存进map的步骤。

将map里的东西写出来的步骤。

 

3.转换流(字符集GBK,UTF-8,Unicode)

 

 fis  是输入的字节流。

操作后isr就转成了字符流。

 这俩编码都兼容ASCII码,所以读英文和数字不会乱码。

GBK,可能是一个字节表示一个字符,也可能是两个字节表示一个字符。

如何区分?

看首位,首位如果是0,则表明这个字符只有一个字节。

是1,则...两个字节表示一个字符。

Unicode,每个字符两个字节

 Unicode转UTF-8,给unicode的二进制表达,塞进UTF-8编码格式里。

4.标准的输入输出流(了解)

IDEA里面不支持在控制台system in 写数据。

4.1输入

4.1.1输入写法1

题目1:输入字符串读到e或者exit就退出。

 记得关闭br。readline,按了回车之后a接受这一行的数据。

题目2:读个各种类型的数据。比如int 或者double。

4.1.2输入写法2

用Scanner。读String 调用next(),读Int,用nextInt。

5.打印流(了解)

 Setout的作用是,本应该打印到控制台的数据,打印在一个新 的文件里。

 6.数据流(了解)

6.1写到文件里,按类型写。 

写完就flush更新。

 6.2从文件中按类型读出数据。

按写的顺序读 

7.对象流(网络编程)

把对象写入数据源。

对象是可序列化,才能存到文件里,也可以通过网络传承对象。

那这个对象属于的类一定是可序列化。

图中例子是String 类,是可序列化的。

 

 7.1用objectOutputStream实现序列化

黑线的地方,写要序列化的对象存在哪的文件路径。

将文件还原为一个对象。

 7.2用objectInputStream进行反序列化。

黑线标记为要反序列化的文件路径。

因为前面序列化的是String 类型对象,这里接收到了强转回来。

7.3自定义类的序列化

 

 1.这个类必须实现这两个接口之一

 2.实现IO接口下的接口,然后定义一个版本号(可以不定义,JVM里自动生成,根据类里的细节,但容易出问题,因为对类一修改,版本号可能变化。)。就可以序列化这个类的对象。

版本号的作用是反序列化的时候,识别是哪个类的对象。

3.自定义类里所有属性也必须是可序列化的。

例如 private Account A;定义一个变量

那么这个Account 也必须是可序列化。

7.4 static,transient修饰的成员变量不可序列化。

从内存加载的角度。static,和transient修饰的归类所有,不归对象所有。

 在持久化对象时,对于一些特殊的数据成员(如用户的密码,银行卡号等),我们不想用序列化机制来保存它。就用transient修饰这个变量。(transient也只能修饰变量)。

8.随机存取文件流

意义:进入文件指定位置修改。

例子:浏览器下资源下一半,停了,过两天重新开始下载。停的时候就会记录下到哪了。

既可以当输入流,也可以当输出流。

seek方法(角标),把指针调整到角标位置。

角标:第几个字符的下标。

 

两个构造器,mode,参数用来指明访问模式。

8.1复制文件,可作 输入与输出流

 8.2把数据写进文件。

写的xyz,write里面要放字节数组。

如果要写的文件已经存在,要对文件进行覆盖。默认从头覆盖。

 8.3把数据插入文件。(视觉的插入罢了)

原来文件

变成这样

 可这一步没办法插入,顶多去角标那覆盖了xyz。

 这个时候把后面内容保存下来,

write写xyz,然后接着覆盖写defghijklmn。

这样呈现出插入的效果。

 

 保存到StringBuilder里。指针会自动跑到最后,这个时候把指针调回来。

8.3.1保存后面文件的方法一

8.3.2保存后面数据的方法二

将后面的数据存进流里。

不需要管类型,直接存下后面的字节。

这里的fis可以通过seek方法,调整下标。

 

 8.3.3 将存进的数组写入。

 

举报

相关推荐

0 条评论