黑马程序员----二十二-IO流三

本文深入探讨Java中的序列流与内存输出流的概念、使用方法及面试题解析,包括序列流整合多个输入流、内存输出流向内存写数据、序列化与反序列化操作、对象操作流的应用、优化策略及键盘录入方式。

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

IO流三.

一.序列流
1.序列流可以把多个字节输入流整合成一个,从序列流中读取数据时,将从被整合的第一个流开始读,读完之后继续读第二个,以此类推.

2.sis在关闭的时候,会将构造方法中传入的流对象也都关闭.

二.序列流整合多个
FIS fis1;
FIS fis2;
FIS fis3;
Vector<FileInputStream> v=new Vector<>();
v.add(fis1);
v.add(fis2);
v.add(fis3);
Enumeration<FileInputStream> en=v.elements
SequenceInputStream sis=new SIS(en);
FileOutputStream fos=new FOS("copy");
int b;
while(  (b=sis.read()) != -1){
 fos.write(b);
}
sis.close();
fos.close();

三.内存输出流
1.内存输出流可以向内存中写数据,把内存当做一个缓冲区,写出之后可以一次性获取所有数据.
2.使用方式:
创建对象:new ByteArrayOutputStream();
写出数据:write(int); write(byte[]);
获取数据:toByteArray();
3.代码:
FIS fis=new FIS("a1.txt");
ByteArrayOutputStream baos=new ByteArrayOutputStream();
int b;
while(  (b=fis.read()) != -1){
 baos.write(b);
}
byte[] arr=baos.toByteArray();
sysout(new String(arr));
fis.close();

四.内存输出流面试题
1.定义一个文件输入流,调用read(byte[] b)方法,将a.txt文件中的内容打印出来(byte数组大小限制为5);
2.代码:
FIS fis=new FIS("a1.txt");
ByteArrayOutputStream baos=new ByteArrayOutputStream();
byte[] arr=new byte[5];
int len;
while(  (len=fis.read(arr)) != -1){
 baos.write(arr,0,len);
}
sysout(baos);
fis.close();

五.对象操作流ObjectOutputStream
1.对象操作流可以将一个对象写出,或者读取一个对象到程序中,也就是执行了序列化和反序列化的操作.
2.代码:
Person p1=new Person("a1",23);
Person p2=new Person("a2",24);
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("a.txt"));
oos.writeObject(p1);
oos.writeObject(p2);
oos.close();

六.对象操作了ObjectInputStream
代码:
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("a.txt"));
Person p1=(Person)ois.readObject();
Person p2=(Person)ois.readObject();
sysout(p1);
sysout(p2);
ois.close();

七.对象操作流优化
将对象存储在集合中写出
Person p1=new Person("a1",21);
Person p2=new Person("a2",22);
Person p3=new Person("a3",23);
Person p4=new Person("a4",24);
ArrayList<Person> list=new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("a.txt");
oos.writeObject(list);
oos.close();

读取到的是一个集合对象
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("a.txt"));
ArrayList<Person> list=(ArrayList<Person>)ois.readObject();
for(Person p:list){
 sysout(p);
}
ois.close();

八.加上ID号
1.要写出的对象必须实现Serializable接口才能被序列化.
2.不是必须加ID号

九.打印流
1.打印流可以很方便的将对象的toString()结果输出,并且自动加上换行,而且可以使用自动刷出的模式
2.System.out就是一个printStream,其默认向控制台输出信息

3.使用方式
打印:print()   println()
自动刷出:PrintWriter(OutputStream out,boolean autoFlush,String encoding)
打印流只操作数据目的

十.标准输入输出流和输出语句
1.
System.in是InputStream,标准输入流,默认可以从键盘输入读取字节数据
System.out是printStream标准输出流,默认可以向Console中输出字符和字节数据.

2.修改标准输入输出流
修改输入流:
System.setIn(InputStream)
修改输出流:
System.setOut(PrintStream)

System.setIn(new FileInputStream("a.txt"))
System.setOut(new PrintStream("b.txt");
InputStream in=System.in;
PrintStream ps=System.out;
int b;
while(   (b=in.read())  != -1){
 ps.write(b);
}
in.close();
ps.close();

十一.两种方式实现键盘录入
1.BufferedReader的readLine方法
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String line=br.readLine();
br.close();

2.Scanner
Scanner sc=new Scanner(System.in);
String line=sc.nextLine();
sc.close();

十一.修改标准输入输出流拷贝图片
System.setIn(new FileInputStream("IO图片.png"));
System.setOut(new PrintStream("copy.png"))
InputStream is=System.in;
PrintStream ps=System.out;
int len;
byte[] arr=new byte[1024*8];
while(  (len=is.read(arr))  != -1){
 ps.write(arr,0,len);
}
is.close();
ps.close();

十二.随机访问流
1.随机访问流
RandomAccessFile
RandomAccessFile类不属于流,是Object的子类,但它融合了InputStream和OutputStream的功能
支持对随机访问文件的读取和写入.

十三.数据输入输出流
1.
DataInputStream,DataOutputStream可以按照基本数据类型大小读写数据
2.例如按Long大小写出一个数字,写出时该数据占8字节,读取的时候也可以按照Long类型读取,一次读取8个字节.
DataOutputStream dos = new DataOutputStream(new FileOutputStream("b.txt"));
dos.writeInt(997);
dos.writeInt(998);
dos.writeInt(999);
dos.close();

DataInputStream dis = new DataInputStream(new FileInputStream("b.txt"));
int x = dis.readInt();
int y = dis.readInt();
int z = dis.readInt();
System.out.println(x);
System.out.println(y);
System.out.println(z);
dis.close();

十四.Properties
1.Properties是双列集合.父类是Hashtable
为什么没有泛型?
因为Properties有自己的固定作用,是当做配置文件,存储信息,都是以键值对的形式存在,都是以字符串的形式存储,都是String所以不加泛型.

十五.Properties的特殊功能
1.public Object setProperty(String key,String value)
2.public String getProperty(String key)
3.public Enumeration stringPropertyNames()

也就是存键值对,取值和迭代

十六.Properties的load()和store()功能
1.配置文件要跟程序有所关联,是通过IO流和程序相关联.也就是通过load()和store()两个方法

 

 

## 软件功能详细介绍 1. **文本片段管理**:可以添加、编辑、删除常用文本片段,方便快速调用 2. **分组管理**:支持创建多个分组,不同类型的文本片段可以分类存储 3. **热键绑定**:为每个文本片段绑定自定义热键,实现一键粘贴 4. **窗口置顶**:支持窗口置顶功能,方便在其他应用程序上直接使用 5. **自动隐藏**:可以设置自动隐藏,减少桌面占用空间 6. **数据持久化**:所有配置和文本片段会自动保存,下次启动时自动加载 ## 软件使用技巧说明 1. **快速添加文本**:在文本输入框中输入内容后,点击"添加内容"按钮即可快速添加 2. **批量管理**:可以同时编辑多个文本片段,提高管理效率 3. **热键冲突处理**:如果设置的热键与系统或其他软件冲突,会自动提示 4. **分组切换**:使用分组按钮可以快速切换不同类别的文本片段 5. **文本格式化**:支持在文本片段中使用换行符和制表符等格式 ## 软件操作方法指南 1. **启动软件**:双击"大飞哥软件自习室——快捷粘贴工具.exe"文件即可启动 2. **添加文本片段**: - 在主界面的文本输入框中输入要保存的内容 - 点击"添加内容"按钮 - 在弹出的对话框中设置热键和分组 - 点击"确定"保存 3. **使用热键粘贴**: - 确保软件处于运行状态 - 在需要粘贴的位置按下设置的热键 - 文本片段会自动粘贴到当前位置 4. **编辑文本片段**: - 选中要编辑的文本片段 - 点击"编辑"按钮 - 修改内容或热键设置 - 点击"确定"保存修改 5. **删除文本片段**: - 选中要删除的文本片段 - 点击"删除"按钮 - 在确认对话框中点击"确定"即可删除
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值