File类的每一个实例可以表示硬盘(文件系统)中的一个文件或目录(实际上表示的是一个抽象路径)
使用File可以做到:
1:访问其表示的文件或目录的属性信息,例如:名字,大小,修改时间等等。
2:创建和删除文件或目录。
3:访问一个目录中的子项。
但是File不能访问文件数据。
**创建一个新文件:**createNewFile()方法,可以创建一个新文件。
**删除一个文件:**delete()方法可以将File表示的文件删除。
创建目录:
**删除目录:**delete()方法可以删除一个目录,但是只能删除空目录。
**访问一个目录中的所有子项:**listFiles()方法可以访问一个目录中的所有子项。
获取目录中符合特定条件的子项:
java将IO比喻为"流",即:stream. 就像生活中的"电流",“水流"一样,它是以同一个方向顺序移动的过程.只不过这里流动的是字节(2进制数据).所以在IO中有输入流和输出流之分,我们理解他们是连接程序与另一端的"管道”,用于获取或发送数据到另一端.
java将IO按照方向划分为输入与输出:
JAVA定义了两个超类(抽象类):
**java.io.InputStream:**所有字节输入流的超类,其中定义了读取数据的方法.因此将来不管读取的是什么设备(连接该设备的流)都有这些读取的方法,因此我们可以用相同的方法读取不同设备中的数据。
**java.io.OutputStream:**所有字节输出流的超类,其中定义了写出数据的方法。
JAVA将流分为两类:节点流与处理流:
实际应用中,我们可以通过串联一组高级流到某个低级流上以流水线式的加工处理对某设备的数据进行读写,这个过程也称为流的连接,这也是IO的精髓所在。
文件流:java.io.FileInputStream和FileOutputStream是一对低级流,用于读写文件数据的流,用于连接程序与文件(硬盘)的"管道"。负责读写文件数据。
**文件输出流:**java.io.FileOutputStream【写】
**文件输入流:**FileInputStream【读】
块读写:
写文本数据:
String提供方法:byte[] getByte(String charsetName) 将当前字符串转换为一组字节
参数为字符集的名字,常用的是UTF-8。其中中文3字节表示1个,英文1字节表示1个。
文件输出流—追加模式:
重载的构造方法可以将文件输出流创建为追加模式
FileOutputStream(String path,boolean append)
FileOutputStream(File file,boolean append)
以上两个方法:当第二个参数传入true时,文件流为追加模式,即:指定的文件若存在,则原有数据保留,新写入的数据会被顺序的追加到文件中
读取文本数据:
缓冲流:java.io.BufferedOutputStream和java.io.BufferedInpputStream。
缓冲输出流写出数据时的缓冲区问题:
通过缓冲流写出的数据会被临时存入缓冲流内部的字节数组,直到数组存满数据才会真实写出一次。
缓冲流的flush方法用于强制将缓冲区中已经缓存的数据一次性写出。
Java将按照读写单位划分为字节流与字符流,java.io.Reader和java.io.Writer则是所有字符流的超类,它们和字节流的超类是平级关系
java.io.Reader(字符输入流)和java.io.Writer(字符输出流)是两个抽象类,里面规定了所有字符流都必须具备的读写字符的相关方法。
字符流最小读写单位为字符(char),但是底层实际还是读写字节,只是字符与字节的转换工作由字符流完成。
转换流:java.io.InputStreamReader和OutputStreamWriter
在流连接中的使用:
FileOutputStream fos = new FileOutputStream("pw2.txt",true);
//转换输出流(是一个高级流,且是一个字符流)。1:衔接字符与字节流 2:将写出的字符转换为字节
OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);
//缓冲输出流(是一个高级流,且是一个字符流)。块写文本数据加速
BufferedWriter bw = new BufferedWriter(osw);
//具有自动行刷新的缓冲字符输出流
PrintWriter pw = new PrintWriter(bw);
转换流的意义:
缓冲字符输出流:java.io.PrintWriter
缓冲字符输入流:java.io.BufferedReader
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PTViQ6OI-1653996530137)(C:\Users\1\QQPCMgr\Desktop\传奇笔记\IO.png)]
##三、异常处理
java异常处理机制:
异常处理机制中的try-catch:
语法:
try{
可能出现异常的代码片段
}catch(XXXException e){
try中出现XXXException后的处理代码
}
try语句块不能独立存在,后面必须跟catch语句块或finally语句块。
若try语句块中某句话出错了,则剩下的代码都不会执行!
异常处理机制中的finally:
自动关闭特性:
JDK7之后,java提供了一个新的特性:自动关闭。旨在IO操作中可以更简洁的使用异常处理机制完成最后的close操作。
语法:
语法:
try(
定义需要在finally中调用close()方法关闭的对象.
){
IO操作
}catch(XXXException e){
...
}
上述语法中可在try的"()"中定义的并初始化的对象必须实现了java.io.AutoCloseable接口,否则编译不通过。
throw关键字:
throw用来对外主动抛出一个异常,通常下面两种情况我们主动对外抛出异常:
当程序遇到一个满足语法,但是不满足业务要求时,可以抛出一个异常告知调用者。
程序执行遇到一个异常,但是该异常不应当在当前代码片段被解决时可以抛出给调用者。
public void setAge(int age) throws Exception {
if(age<0||age>100){
//使用throw对外抛出一个异常
throw new RuntimeException("年龄不合法!");
}
this.age = age;
}
throws关键字:
含有throws的方法被子类重写时的规则:
Java异常可以分为可检测异常,非检测异常:
常见的RuntimeException子类:
异常中常用的方法
catch (NumberFormatException e) {
//异常最常用的方法,用于将当前错误信息输出到控制台
e.printStackTrace();
//获取错误消息.记录日志的时候或提示给用户可以使用它
String message = e.getMessage();
System.out.println(message);
}
自定义异常:
总结:
java.net.Socket:(套接字)
java.net.ServerSocket
ServerSocket运行在服务端,作用有两个:
实例化ServerSocket时要指定服务端口,该端口不能与操作系统其他应用程序占用的端口相同,否则会抛出异常:java.net.BindException:address already in use端口是一个数字,取值范围:0-65535之间。
6000之前的的端口不要使用,密集绑定系统应用和流行应用程序。
ServerSocket提供了接受客户端链接的方法:Socket accept()
如果我们把Socket比喻为电话,那么ServerSocket相当于是某客服中心的总机。
客户端与服务端完成第一次通讯(发送一行字符串)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HLxosWWw-1653996530139)(C:\Users\1\QQPCMgr\Desktop\传奇笔记\1650329529897.png)]
需要注意的几个点:
并发:
多个线程实际运行是走走停停的。线程调度程序会将CPU运行时间划分为若干个时间片段并尽可能均匀的分配给每个线程,拿到时间片的线程被CPU执行这段时间。当超时后线程调度
程序会再次分配一个时间片段给一个线程使得CPU执行它。如此反复。由于CPU执行时间在
纳秒级别,我们感觉不到切换线程运行的过程。所以微观上走走停停,宏观上感觉一起运行
的现象成为并发运行!
用途:
创建线程有两种方式:
**方式一:继承Thread并重写run方法:**定义一个线程类,重写run方法,在其中定义线程要执行的任务(希望和其他线程并发执行的任务)。
**注:**启动该线程要调用该线程的start方法,而不是run方法!!!
**方式二:**实现Runnable接口单独定义线程任务,也要重写run方法。
以上两种方式都可以用匿名内部类创建
java中的代码都是靠线程运行的,执行main方法的线程称为“主线程”
获取线程相关信息的方法:
线程优先级:
线程start后会纳入到线程调度器中统一管理,线程只能被动的被分配时间片并发运行,而无法主动索取时间片.线程调度器尽可能均匀的将时间片分配给每个线程.
线程有10个优先级,使用整数1-10表示
sleep阻塞:
**守护线程:**也称为后台线程
当多个线程并发操作同一临界资源,由于线程切换时机不确定,导致操作临界资源的顺序出现混乱严重时可能导致系统瘫痪.
临界资源:操作该资源的全过程同时只能被单个线程完成
**static void yield():**线程提供的这个静态方法作用是让执行该方法的线程主动放弃本次时间片。
synchronized关键字:
**同步方法:**当一个方法使用synchronized修饰后,这个方法称为"同步方法",即:多个线程不能同时在方法内部执行。将多个线程并发操作临界资源的过程改为同步操作就可以有效的解决多线程并发 安全问题。相当于让多个线程从原来的抢着操作改为排队操作。
**同步块:**有效的缩小同步范围可以在保证并发安全的前提下尽可能的提高并发效率。同步块可以更准确的控制需要多个线程排队执行的代码片段。
语法:
synchronized(同步监视器对象){
需要多线程同步执行的代码片段
}
同步监视器对象即上锁的对象,要想保证同步块中的代码被多个线程同步运行,则要求多个线程看到的同步监视器对象是同一个。
**在静态方法上使用synchronized:**当在静态方法上使用synchronized后,该方法是一个同步方法。由于静态方法所属类,所以一定具有同步效果。
静态方法中使用同步块时,指定的锁对象通常也是当前类的类对象
**互斥锁:**当多个线程执行不同的代码片段,但是这些代码片段之间不能同时运行时就要设置为互斥的。当使用synchronized锁定多个不同的代码片段,并且指定的同步监视器对象相同时,这些代码片段之间就是互斥的,即:多个线程不能同时访问这些方法。
死锁:两个线程各自持有一个锁对象的同时等待对方先释放锁对象,此时会出现僵持状态。这个现象就是死锁。
**什么是集合:**集合与数组一样,可以保存一组元素,并且提供了操作元素的相关方法,使用更方便。
**java集合框架中相关接口:java.util.Collection接口:**java.util.Collection是所有集合的顶级接口,Collection下面有多种实现类,因此我们有更多的数据结构可供选择。Collection下面有两个常见的子接口:
java.util.List:线性表,是可重复集合,并且有序。
java.util.Set:不可重复的集合,大部分实现类是无序的。
这里可重复指的是集合中的元素是否可以重复,而判定重复元素的标准是依靠元素自身equals比较的结果,为true就认为是重复元素。
集合常见API:
集合存放的是元素的引用:集合只能存放引用类型元素,并且存放的是元素的引用。
**集合间的操作:**集合提供了如取并集,删交集,判断包含子集等操作
**集合的遍历:**Collection提供了统一的遍历集合方式:迭代器模式 ——Iterator iterator():该方法会获取一个用于遍历当前集合元素的迭代器。
**java.util.Iterator接口:**迭代器接口,定义了迭代器遍历集合的相关操作。规定了迭代器遍历集合的相关操作,不同的集合都提供了一个用于遍历自身元素的迭代器实现类,不过我们不需要直到它们的名字,以多态的方式当成Iterator使用即可。迭代器遍历集合遵循的步骤为:问->取->删。其中删除不是必须操作。
**迭代器遍历过程中不得通过集合的方法增删元素:**迭代器提供的相关方法:
**boolean hasNext():**判断集合是否还有元素可以遍历。
**E next():**获取集合下一个元素(第一次调用时就是获取第一个元素,以此类推)。
**注意:**迭代器要求遍历的过程中不得通过集合的方法增删元素否则会抛出异常:ConcurrentModificationException。迭代器的remove方法可以将通过next方法获取的元素从集合中删除。
**增强型for循环:**JDK5之后推出了一个特性:增强型for循环,也称为新循环,使得我们可以使用相同的语法遍历集合或数组.
for(元素类型 变量名 : 集合或数组的名称){
循环体
}
**泛型:**JDK5之后推出的另一个特性:泛型。泛型也称为参数化类型,允许我们在使用一个类时指定它当中属性,方法参数或返回值的类型。
**List集合:**java.util.List接口,继承自Collection。List集合是可重复集,并且有序,提供了一套可以通过下标操作元素的方法。常用实现类:
List集合常见方法:
集合与数组的转换:
**集合转换为数组:**Collection提供了一个方法:toArray,可以将当前集合转换为一个数组。
数据转换为List集合:数组的工具类Arrays提供了一个静态方法asList(),可以将一个数组转换为一个List集合。
**注意:**对数组转换的集合进行元素操作就是对原数组对应的操作。由于数组是定长的,因此对该集合进行增删元素的操作是不支持的,会抛出异常:java.lang.UnsupportedOperationException。
**集合的排序:java.util.Collection类:**Collections是集合的工具类,里面定义了很多静态方法用于操作集合。
**Collections.sort(List list)方法:**可以对List集合进行自然排序(从小到大)。
排序自定义类型元素:Collections.sort(List list)该方法要求集合中的元素类型必须实现接口:Comparable,该接口中有一个抽象方法compareTo,这个方法用来定义元素之间比较大小的规则。所以只有实现了该接口的元素才能利用这个方法比较出大小进而实现排序操作。
**注意:实际开发中,我们并不会让我们自己定义的类(如果该类作为集合元素使用)去实现Comparable接口,因为这对我们的程序有侵入性。**侵入性:当我们调用某个API功能时,其要求我们为其修改其他额外的代码,这个现象就是侵入性。侵入性越强的API越不利于程序的后期可维护性,应当尽量避免。
可以用匿名内部类重写方法compare
**排序字符串:**java中提供的类,如:String,包装类都实现了Comparable接口,但有时候这些比较规则不能满足我们的排序需求时,同样可以临时提供一种比较规则来进行排序。
如何组建软件开发队伍1. 组建团队的基本流程了解产品开发需求——〉确定团队的人员需求——〉物色符合需求的人才——〉建立团队比例:团队领导(10%);核心成员(30%),普通成员(60%)2. 关于人才的几个观念只有为企业创造的效益高于为其付出的成本的那些人,才是企业所需要的人才。不能为企业创造效益的人才其实就是饭桶,不论其学历和职称有多高。团队需要优秀的人才。软件开发是智力..._用人之道软件的流程
陈果,复旦大学社会科学基础部教师。2010年走红网络,但是我好像上个月某个晚上巧合之下才看到。视频长1h42m,前前后后看了十多天。公开课地址2019-5-23人是在思考自己的过程,而不是思考他人的过程中,产生了智慧。人也是在自我批判而不是批判他人的过程中展示了你的勇气。孤独者往往是极其有趣,极其丰富的人。这是一种自我消遣方式。老夫老妻相处时间长了,就像空气一样。孤独者的快乐..._陈果大学之大观后感
如果你遇到同样的问题,那么不妨看一下我这里介绍的几个解决方法1.起因:数据库没有正常关闭解决方法:关闭数据库然后再重新启动,我们的CRM每次报这个错误一般都是因为上次没有正常关闭引起的,所以只要关闭后再打开就行。具体如下:打开命令窗口:sqlplus “sys/dba as sysdba”[这里sys是用户名,dba是密码,如果用系统用户,即sys登陆,则必须后面跟上as sysdba]..._ora01034和ora27101解决方法
一、BufferedReader类. 所属类库: java.lang.Object java.io.Reader java.io.BufferedReader. 基本概念 : public class BufferedReader extends Re
转自:http://www.mkyong.com/oracle/oracle-sql-developer-unable-to-find-java-virtual-machine/ProblemHere’s my PC environment :Database : Oracle 11gOS Platform : Windows 7 Ultimate 64 bitsJDK :_sql unable to find a
Python_基础语法_组合数据类型_列表_元组_字典_集合
运算补充(因为之前看书看过的我又忘了...)python3 里 / 直接是浮点除。python2的 / 是直接整除,取整数部分,小数不要了,python3也可以这样整除,用//实现。**是乘方!!!3**2=8。这个运算符有点个性啊。比起左侧的操作符优先级高,比右侧优先级低。看图:第一句**比左侧优先级高,因此先乘方再加负号。第二句**比右侧优先级低,因此先加负号再...
阵列信号处理仿真,延时求和滤波器问题导入假设在Z轴上存在5个阵列关于原点对称,间隔0.1m,试画出f1,f2,f3,f4,f5f1,f2,f3,f4,f5f1,f2,f3,f4,f5接受到的平面波解对这个阵列实现延时——求和波束形成解问题导入假设原点处的阵列传感器接收的信号为平面波,表达式如下f(t)=cos(2πf0t+θ0)f(t) = cos(2\pi f_0t+\theta_0)f(t)=cos(2πf0t+θ0)其中 θ0=π3\theta_0 = \frac{\pi}{3}θ0_阵列信号处理仿真实验报告总结
1. 调试检测在调试加壳软件的时候,总是会突然出现调试中断,或者是程序的异常退出,但是一旦不处于调试的时候又能够正常启动,这些都是因为调试被 app 检测到的原因。2. 基本的调试监控常用的监控手段:1) 检测用户组 cmdline 中是否存在调试进程(gdb、gdbserver、android_server、xposed 等)修改调试器的名称2) 检测线程状态,查看是否存在被调试..._移动安全检测附加调试进程
游戏的意义就在于它能够给人带来快乐,如果过多的掺杂其他的东西就失去了其本身的意义,大家好,我是小三,每天给大家分享游戏中的八卦趣事。物理系的梦想说的是那些鉴定武器的装备时如果鉴定出专用的武器,而且武器的伤害属性突破了该等级的上限,那么这位玩家就会获得物理系梦想成就,但是物理系梦想能不能给物理系的玩家使用不确定的,需要看这把武器增加的属性和命中属性的,增加的三项属性全高才是和物理系使用,否则只能给其..._梦幻服务器维护没能退出游戏怎么办
原文:https://www.cnblogs.com/bonelee/p/8921311.html以上示例都是人类的迁移学习的能力。迁移学习是什么?所谓迁移学习,或者领域适应Domain Adaptation,一般就是要将从源领域(Source Domain)学习到的东西应用到目标领域(Target Domain)上去。源领域和目标领域之间往往有gap/domain discrepan...
软件项目管理考试复习加了的是考点第一章软件项目管理概述1.1.1项目及其特征项目定义:项目就是为了创造一个唯一的产品或提供一个唯一的服务而进行的临时性的努力;是以一套独特而互相联系的任务为前提,有效地利用资源,在一段时间内满足一系列特定目标的多项相关工作的总称。日常运作和项目的区别:项目是一次性的,而日常运作是重复进行的。项目是以目标为导向的,日常运作是通过效率和有效性体现的。项目是通过项目经理及其团队工作完成的,日常运作是职能式的线性管理。项目存在大量的变更管理,_软件项目管理期末