黑马程序员--IO流

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


IO流的概述

复制粘贴 上传下载
IO流的分类
按流向
输入流
输出流
按操作的数据
字符流
字节流

文件类File类
构造方法:
 File(String pathname):根据指定的路径创建File对象。
 File(String parent, String child):根据指定的父文件夹和子文件或者文件夹创建File对象
 File(File parent, String child):根据指定的父文件夹对象和子文件或者文件夹创建File对象


创建功能:
  创建文件:public boolean createNewFile()
       如果指定的文件不存在,就创建。如果存在,就不创建。
  创建文件夹:public boolean mkdir()
  创建指定的目录,如果存在,就不创建。
    public boolean mkdirs()
  创建指定的目录,如果存储,就不创建。这个时候,如果父目录不存在,它也会自动创建。

删除功能:
  public boolean delete():既可以删除文件,也可以删除文件夹。取决于你使用的对象。

注意:
  A:如果你删除的目录下还有内容,那么,必须先把所有内容删除完毕后,在删除目录。
  B:java语言的删除不走回收站


判断功能

 boolean exists():判断file对象是否存在
 boolean isFile():判断file对象是否是文件
 boolean isDirectory():判断file对象是否是文件夹
 boolean isAbsolute():判断file对象是否是绝对路径
 boolean canRead():判断file对象是否可读
 boolean canWrite():判断file对象是否可写
 boolean isHidden():判断file对象是否隐藏


获取功能:


 String getAbsolutePath():绝对路径
 String getPath():相对路径
 String getName():文件名称
 long length():文件大小,单位是字节
 long lastModified():上次修改时间的毫秒值。


重要获取功能

 public static File[] listRoots():列出可用的系统文件根目录
 public String[] list():返回的是指定目录下所有文件或者文件夹的名称数组
 public File[] listFiles():返回的是指定目录下所有文件或者文件夹对象数组

绝对路径:以盘符开始的路径。

相对路径:不以盘符开始的路径。

字节流:
1:基本字节输出流的操作
A:创建字节输出流对象
FileOutputStream fos = new FileOutputStream("a.txt");
B:调用写数据的方法
fos.write(97);
C:释放资源
fos.close();


注意:写数据的方法有
write(byte b)
write(byte[] bys);
write(byte[] bys, int start,int lenth);
     追加写入用两个参数构造
FileOutputStream fos = new FileOutputStream("a.txt",true);


2:基本字节输入流的操作
FileInputStream fis = new FileInputStream("b.txt");

//方式1
int by = 0;
while ((by = fis.read()) != -1) {
System.out.println(by);
}

//方式2
byte[] bys = new byte[1024];
int len = 0;
while ((len = fis.read(bys)) != -1) {
System.out.print(new String(bys, 0, len));
}
//释放资源
fis.close();



注意:
1):read():读一个,光标就在下一行等着读下一个,读完后光标就放到了最后,再读就没了
和集合里面迭代器的next() 有点相似


2):当用字节流读汉字并打印到控制台上,有时候会出现 "??" 问题,是因为汉字是由两个字节
组成的,每次读一个字节,所以就会出现"??"的现象,但是此问题用字节流复制文本文件时不会出现


3:高效字节输出流

BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream("4.mp4"));
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
"d:\\a.java"));


byte[] bys = new byte[1024];
int len = 0;
while((len=bis.read(bys))!=-1){
bos.write(bys,0,len);
}


bos.close();
bis.close();


4:高效字节输入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
"d:\\copy.java"));

byte[] bys = new byte[1024];
int len = 0;
while((len=bis.read(bys))!=-1){
System.out.print(new String(bys, 0, len));
}
bis.close();

注意:不能用字符流复制二进制数据
 二进制流数据:图片,视频,音频等。
 由于二进制的合并为字符,在我们使用的编码表中没有对应的数据,那么,将来在写回去的时候,就会有数据的丢失。
 所以,二进制流数据只能使用字节流进行操作。

字符流
基本字符输出流FileWriter
1)方式一:完成一个简单在指定文件中写入数据的操作的步骤
A:创建字符输出流FileWriter对象(并且传入一个你要写入的位置)
FileWriter fw = new FileWriter("a.txt");
B:调用写数据的功能
fw.write("hello,io,我来了。祝你元旦快乐。");
C:刷新缓冲区
fw.flush();
D:释放资源(jvm不会自动回收流的资源,除非你手动标记该流已成为垃圾)
fw.close();

     方式二:

2)对简单在指定文件中写入数据的操作提出了疑问

①为什么FileWriter没有无参构造方法?
因为写数据的时候,一定要明确写道哪里去。

②flush()和close()的区别?
flush():只刷新缓冲区,流对象还可以继续使用。
close():先刷新缓冲区,在关闭流对象。流对象不可以继续被使用。

③定时刷新
int count = 0;
for (int x = 0; x < 1000000; x++) {
fw.write("hello" + x);
if (++count % 10000 == 0) {
fw.flush();
}
}


3)用try{}catch(){}来处理异常

FileWriter fw = null;(必须初始化)
try {
//把有可能报错的部分都写在try里面
fw = new FileWriter("d.txt");
fw.write("hello");
fw.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fw != null) {//有可能try里面报错了,fw就是null,这时候如果不判断 下面的fw.close()就会报空指针异常
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

基本字符输入流FileReader

方式一

 A:创建字符输入流对象(并且明确你要从哪个文件读数据)
FileReader fr = new FileReader("FileWriterDemo.java");
 B:调用读取数据功能,并显示
int ch = 0;
while((ch=fr.read())!=-1){//如果数据没有了,读取的时候,将返回-1
 //如果有数据则返回int类型(字符的int值),并自动移动到下一个数据位置等待读取
System.out.print((char) ch);
}
 C:释放资源
fr.close();

方式二:

public int read(char[] cbuf)每次读取数据,把数据存储到字符数组中,返回值是实际读取长度。
A: 创建字符输入流
FileReader fr = new FileReader("FileWriterDemo.java");
B:读取数据每次读取一个数组
char[] chs = new char[1024];
int len = 0;
while ((len = fr.read(chs)) != -1) {//len表示read(chs)读取到多少个字符
   //如果实际读取长度是-1的情况,那么,说明已经读取到结尾了

System.out.print(new String(chs, 0, len));//new String(chs, 0, len) 是为了写入实际读入的数据,否则读取到最后的时候可能会有偏差
}

C:释放资源
fr.close();

高效字符输出流
BufferedWriter bw = new BufferedWriter(new FileWriter("c.txt"));

高效字符输入流
// 创建字符缓冲流对象
BufferedReader br = new BufferedReader(new FileReader("c.txt"));

// 读取数据方式一
int ch = 0;
while ((ch = br.read()) != -1) {
System.out.print((char) ch);
}
// 读取数据方式二
char[] chs = new char[1024];
int len = 0;
while ((len = br.read(chs)) != -1) {
System.out.print(new String(chs, 0, len));
}
// 释放资源
br.close();


5:高效字符流的特殊复制文本文件方式

BufferedReader br = new BufferedReader(new FileReader(
"FileOutputStreamDemo.java"));
BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));

String line = null;
while((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}

bw.close();
br.close();

注意:1)我们开始自己定义数组,给出缓冲区大小,是为了提高效率。
那么,java在设计类的时候,它也考虑到了这一点,所以,就提供了一种高效的流。带缓冲区的流。
BufferedWriter:写入数据
BufferedReader:读取数据
构造方法:BufferedWriter(Writer out) 
为什么传递的是Writer呢?
因为BufferedWriter这种流,被称为缓冲流,它只提供数据的缓冲功能。
真正的读写还得靠别人。所以,我们这里将使用FileWriter作为参数传递。
缓冲区只提供缓冲功能,没有真正的读写。

基本流:能直接进行读写的流对象。
高级流:站在基本流的基础上,提供一些特殊的功能。(处理流。)

【EI复现】基于深度强化学习的微能源网能量管理与优化策略研究(Python代码实现)内容概要:本文围绕“基于深度强化学习的微能源网能量管理与优化策略”展开研究,重点利用深度Q网络(DQN)等深度强化学习算法对微能源网中的能量调度进行建模与优化,旨在应对可再生能源出力波动、负荷变化及运行成本等问题。文中结合Python代码实现,构建了包含光伏、储能、负荷等元素的微能源网模型,通过强化学习智能体动态决策能量分配策略,实现经济性、稳定性和能效的多重优化目标,并可能与其他优化算法进行对比分析以验证有效性。研究属于电力系统与人工智能交叉领域,具有较强的工程应用背景和学术参考价值。; 适合人群:具备一定Python编程基础和机器学习基础知识,从事电力系统、能源互联网、智能优化等相关方向的研究生、科研人员及工程技术人员。; 使用场景及目标:①学习如何将深度强化学习应用于微能源网的能量管理;②掌握DQN等算法在实际能源系统调度中的建模与实现方法;③为相关课题研究或项目开发提供代码参考和技术思路。; 阅读建议:建议读者结合提供的Python代码进行实践操作,理解环境建模、状态空间、动作空间及奖励函数的设计逻辑,同时可扩展学习其他强化学习算法在能源系统中的应用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值