Java基础笔记6
十一、File
代表文件或目录的类。
所表示的文件或目录在计算机中不一定真实存在。
绝对路径:以盘符或者/开头的路径——不以当前路径为基准,直接跳转到指定的位置
相对路径:不以盘符或者/开头的路径。以当前路径为基准,…表示上一层目录(实际开发中用得比较多。写起来复杂,但是好改。)
java命名习惯:
has开头判断:有没有,例hasNext
is开头判断:是不是,例isFile
can开头判断:能不能,例canWrite
java命名要见名知意,提高代码可读性。
文件操作的时候大多数情况下需要使用递归。
方法摘要
 boolean canExecute()
          测试应用程序是否可以执行此抽象路径名表示的文件。
 boolean canRead()
          测试应用程序是否可以读取此抽象路径名表示的文件。
 boolean canWrite()
          测试应用程序是否可以修改此抽象路径名表示的文件。
 int compareTo(File pathname)
          按字母顺序比较两个抽象路径名。
 boolean createNewFile() 注意:创建文件的时候要求存放的路径真实存在。否则发生运行异常。
          当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。需要抛出异常IOException,因为不确定要创建的文件是否已经存在。
 boolean delete() 注意:删除的目录不能有子目录,否则删除失败。如果文件正在被使用,也会删除失败。
          删除此抽象路径名表示的文件或目录。
 boolean equals(Object obj)
          测试此抽象路径名与给定对象是否相等。
 boolean exists()
          测试此抽象路径名表示的文件或目录是否存在。
 File getAbsoluteFile()
          返回此抽象路径名的绝对路径名形式。
 String getAbsolutePath()
          返回此抽象路径名的绝对路径名字符串。
 String getName() 仅获取文件名本身
          返回由此抽象路径名表示的文件或目录的名称。
 String getParent()
          返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
 File getParentFile()
          返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。
 String getPath() 获取包含全路径的文件名
          将此抽象路径名转换为一个路径名字符串。
 int hashCode()
          计算此抽象路径名的哈希码。
 boolean isAbsolute()
          测试此抽象路径名是否为绝对路径名。
 boolean isDirectory() 注意:必须先用exists()判断文件是否存在,否则判断结果不准确。
          测试此抽象路径名表示的文件是否是一个目录。
 boolean isFile() 注意:必须先用exists()判断文件是否存在,否则判断结果不准确。
          测试此抽象路径名表示的文件是否是一个标准文件。
 boolean isHidden()
          测试此抽象路径名指定的文件是否是一个隐藏文件。
 long lastModified()
          返回此抽象路径名表示的文件最后一次被修改的时间。
 long length()
          返回由此抽象路径名表示的文件的长度。
 String[] list()
          返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
 String[] list(FilenameFilter filter)
          返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
 File[] listFiles()
          返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
 File[] listFiles(FileFilter filter) FileFilter文件过滤器,重写accept方法
          返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。 return pathname.isFile();判断是否为标准文件
 File[] listFiles(FilenameFilter filter) FilenameFilter针对文件名筛选
          返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
 boolean mkdir() 注意:如果目录已存在或路径不存在则返回false,不会报错。
          创建此抽象路径名指定的目录。
 boolean mkdirs()
          创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。
 boolean renameTo(File dest) 路径不变则重命名。文件名不变则改变存放路径。
          重新命名此抽象路径名表示的文件。 可以同时改变路径和文件名。
目标路径存在同名文件时,挪动文件失败。
 boolean setExecutable(boolean executable) 在Windows系统无法执行
          设置此抽象路径名所有者执行权限的一个便捷方法。
long lastModified()
          返回此抽象路径名表示的文件最后一次被修改的时间。
 boolean setLastModified(long time)
          设置此抽象路径名指定的文件或目录的最后一次修改时间。
 boolean setReadable(boolean readable) 在Windows系统无法执行,适用于Linux系统
          设置此抽象路径名所有者读权限的一个便捷方法。
 boolean setReadOnly() 在Windows系统几乎不用,Linux系统用的比较多
          标记此抽象路径名指定的文件或目录,从而只能对其进行读操作。
 boolean setWritable(boolean writable) 在Windows系统可成功执行
          设置此抽象路径名所有者写权限的一个便捷方法。
 boolean setWritable(boolean writable, boolean ownerOnly)
          设置此抽象路径名的所有者或所有用户的写权限。
 String toString()
          返回此抽象路径名的路径名字符串。

separatorChar在Windows中会自动编译为”\”,在Linux中会自动编译为”/”。
pathSeparatorChar在Windows中会自动编译为”;”,在Linux中会自动编译为”:”。

如何创建多层目录下的文件?
File file=new File(“F:\Test\my test\day18\1.txt”); //目录及文件不一定存在
File parent=file.getParentFile(); //获取父目录,上一层目录全路径名
System.out.println(parent);//F:\Test\my test\day18
if(!parent.exists()) { //判断父目录是否真实存在
parent.mkdirs(); //如果不存在就创建多层目录
}
file.createNewFile(); //创建file指定路径下创建文件

十二、IO流
传输数据的机制。
IO——Input Output——输入输出流。
1.根据流的传输方向划分:
(1)输入流:数据从外部流向程序
(2)输出流:数据从程序流向外部
读取文件——数据从文件流向程序——属于输入流
写TXT文档——数据从程序流向文件——属于输出流
2.根据流的传输形式划分:字节流和字符流
四个基本流 输入流 输出流
字节流 InputStream OutputStream
字符流 Reader Writer
4个基本流都是抽象类。
数据的来源/目的地:存储设备 (包括 硬盘、U盘、光盘)、内存、网络、输入设备(如键盘、鼠标)。
往一个TXT文件写入一段字符串——输出流——字符流,用FileWriter(继承OutputStreamWriter)。
缓冲区8KB大小。
reader.read(); //读取单个字符,返回int型数据(类型自动提升)。用一个char变量接收就可以得到char类型。
reader.read(char[] c); //读取指定数组长度字符,返回字符串
writer.write(“写入数据内容”); //写入数据
writer.flush(); //冲刷数据(避免关流失败,故手动冲刷一次)
writer.close(); //关流(默认关流前冲刷一次数据)
writer=null; //释放内存
流中的异常处理:
1.将流放在try之外声明并且赋值为null,然后放在try之内初始化。
2.在关流之前需要判断流对象是否为null。
3.为了防止关流失败导致流占用文件,需要将流强制回收(设置为null)。
4.为了防止关流失败数据死在缓冲区,所以在关流前必须手动冲刷数据。
JDK1.7开始允许在try之后使用()来定义资源,try之后自动关流。简化了流异常处理。try()中的对象对应的类必须实现AutoCloseable接口。
try (FileWriter writer = new FileWriter(“E:\c.txt”)) {
writer.write(“abc”);
writer.flush();
} catch (Exception e) {
e.printStackTrace();
}
注意:java中原生的字符流无法读取Office组件(java针对Office开发POI插件),只能读取字符类文件——.txt .java .html
练习:复制文件 — 输入流读取原文件,将读取的内容写到新文件 — 输出流
// 创建一个输入流对象指向要复制的文件
FileReader reader = new FileReader(“E:\a.txt”);
// 创建一个输出流对象指向要存放的文件,如果这个文件已经存在,则创建新文件覆盖原文件
FileWriter writer = new FileWriter(“D:\b.txt”);
// 创建一个字符数组存储每次读取的字符
char[] cs = new char[10];
// 创建一个变量记录每次读取的字符个数
int len = -1;
// 读取数据
while((len = reader.read(cs)) != -1){
// 将读取到的数据写到新文件中
writer.write(cs, 0, len);
}
// 关流
reader.close();
writer.close();
}
尘梦缭绕吾独欢,静雅清幽离闹喧。自嗅其香神情芳,宁谧吐蕊心花妍。
缓冲流
BufferedReader——需要传入字符输入流,真正读取数据的是传入的这个字符输入流,缓冲流仅仅提供了一个缓冲区。
构造方法:
BufferedReader(Reader in)
BufferedReader(Reader in, int sz)
将一个Reader传入BufferedReader后 BufferedReader会在原来Reader的基础上增加缓冲区,从而实现高效的读取数据,这个过程中BufferedReader不会改变原有Reader的功能,只是为底层的流提供了缓冲的能力,用来提高读取效率。
方法摘要
 void close()
          关闭该流并释放与之关联的所有资源。
 void mark(int readAheadLimit)
          标记流中的当前位置。
 boolean markSupported()
          判断此流是否支持 mark() 操作(它一定支持)。
 int read()
          读取单个字符。
 int read(char[] cbuf, int off, int len)
          将字符读入数组的某一部分。
 String readLine()
          读取一个文本行。
 boolean ready()
          判断此流是否已准备好被读取。
 void reset()
          将流重置到最新的标记。
 long skip(long n)
          跳过字符。
BufferedWriter
构造方法:
BufferedWriter(Writer out)
BufferedWriter(Writer out, int sz)
将一个Writer传入BufferedWriter后 BufferedWriter会在原来Writer的基础上增加缓冲区,从而实现高效的写出数据,这个过程中BufferedWriter不会改变原有Writer的功能,只是为底层的流提供了缓冲的能力,用来提高写出效率。
方法摘要
 void close()
          关闭此流,但要先刷新它。
 void flush()
          刷新该流的缓冲。
 void newLine()
          写入一个行分隔符。相当于/r /n
 void write(char[] cbuf, int off, int len)
          写入字符数组的某一部分。
 void write(int c)
          写入单个字符。
 void write(String s, int off, int len)
          写入字符串的某一部分。
设计模式:前人编写java代码的套路的总结,java一共有23种设计模式。
装饰设计模式就是其中的一种。
装饰设计模式主要的能力。是通过装饰者包装被装饰者,在被装饰者原有的功能的基础上,增加额外的能力。
装饰设计模式实现方式:
写一个类,实现和被装饰者相同的接口,获继承相同的父类,使其具有相同的方法,提供构造方法,将被装饰者,传入保存在类的内部。
对于不想改造的方法直接调用原有对象本来的方法。
对于想改造的方法,进行改造。
对于想增加的方法,直接增加。
这样可以将被装饰者传入、装饰,增加特定的功能。
和继承不一样,继承是新建一个子类对象,并不影响父类对象。
StringReader
输入流——字符串字符流。
将一个字符串作为数据来源,通过StringReader读取再通过FileWriter写出到文件中。
StringReader reader=new FileReader(“字符串”);
FileInputStream以字节流的方式实现类文件的拷贝,以字节为单位读取数据。
字节流
1.InputStream - FileInputStream
以字节为基本单位来操作数据
构造方法:
FileInputStream(File file)
FileInputStream(String name)
方法:
int read()
int read(byte[] b)
int read(byte[] b, int off, int len)
int available() //获取文件里的字节长度即容量
void close()
案例:以字节为单位从文件中读取数据

2.OutputStream - FileOutputStream以字节为基本单位来操作数据构造方法:FileOutputStream(File file) FileOutputStream(String name) 方法:void write(int b) void write(byte[] b) void write(byte[] b, int off, int len) void flush()void close() 案例:以字节为单位向文件写出数据案例:利用字节流实现文件的拷贝 文本文件 和 非文本文件都可以拷贝案例:利用字节流实现文件的拷贝 - 自定义缓冲区提升性能。

转换流
字符流的底层也是通过字节来操作数据的 只不过在字节流的基础上增加了 默认的转换器 可以经字节和字符进行映射 采用的编码集为系统码 且无法更改
所以当使用字符流 操作 非系统码的文件时 可能产生乱码
此时可以通过转换流 将自己构建的字节流 转换为字符流 并在这个过程中 指定需要的编码集 来解决问题
InputStreamReader - 可以将字节输入流转换为字符输入流 在转换的过程中 其实内部就是多了一个将字节 映射为 字符的操作 而采用的编码集 可以由程序来指定
构造方法:
InputStreamReader(InputStream in) //将字节输入流转换为字符输入流 内部增加的转换器 采用默认的码表(系统码)
InputStreamReader(InputStream in, String charsetName) //将字节输入流转换为字符输入流 内部增加的转换器 采用的码表由charsetName来指定
方法:
int read()
int read(char[] cbuf)
int read(char[] cbuf, int offset, int length)
void close()
OutputStreamWriter - 可以将字节输出流转换为字符输出流 在转换的过程中 其实内部就是多了一个将字符 映射为 字节的操作 而采用的编码集 可以由程序来指定
构造方法:
OutputStreamWriter(OutputStream out)//将字节输出流转换为字符输出流 内部增加的转换器 采用默认的码表(系统码)
OutputStreamWriter(OutputStream out, String charsetName) //将字节输出流转换为字符输出流 内部增加的转换器 采用的码表由charsetName来指定
方法:
void write(int c)
void write(char[] cbuf)
void write(char[] cbuf, int off, int len)
void write(String str)
案例5:利用转换流实现utf-8编码集的文本文件的拷贝
案例6(作业):请写程序将gbk的文本文件转换为utf-8的文本文件 实现一个转码的过程
案例7(作业):请写程序将utf-8的文本文件转换为gbk的文本文件 实现一个转码的过程
系统流/标准流
都属于字节流。
System是java内置的代表当前系统的类 其上提供了很多和系统相关的属性和方法 方便我们对系统进行操作
常用的属性:
static InputStream in - 标准输入流
static PrintStream out - 标准输出流
static PrintStream err - 标准错误输出流
常用的方法:
static void exit(int status) //退出虚拟机
static void gc() //启动垃圾回收 虚拟机通常会根据自身的内存使用情况 自动决定什么时候来进行垃圾回收 但是也可以通过这个方法 通知虚拟机该垃圾回收 但是注意 这个方法调用并不会触发垃圾回收 只是一个通知告诉虚拟机该回收垃圾了 至于是否启动垃圾回收 仍然由虚拟机自己决定
static void setIn(InputStream in) //设定系统标准输入流
static void setOut(PrintStream out) //设定系统标准输出流
static void setErr(PrintStream err) //设定系统标准错误输出流
其中System上提供的 in out err三个字节流 称之为系统流
系统流其实也是字节流 只不过这个字节流不需要我们自己创建 是系统创建好 直接提供给我们用的 不要关 也不能关
其中 in 是系统输入流 从系统标准输入流中获取数据 默认的系统标准输入流的来源 是控制台
其中 out err 是系统输出流 向系统标准输出流中写出数据 默认的系统标准输出流的目的地 是控制台
所以,平常大家写的 System.out.println(“hello world~”); 起始就是通过System.out得到的了系统输出流 向这个流中 通过println方法写出了 数据 最终去往了控制台显示
也可以用 System.err.println(“xxx”) 写出数据 和 System.out 唯一的不同是 打印出来将会是红色的文本 更加醒目 通常用来打印错误信息 平常大家见到的异常信息 就是通过System.err打印的
系统输出流的默认位置是控制台 也可以通过System.setOut() 或System.setErr() 方法修改out或err指向的 系统输出流
而其中的System.in代表标准输入流 默认数据来源是控制台 所以可以利用它从控制台中读取数据
所以平常从控制态中读取数据可以写成:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))
简单写法:Scanner scanner = new Scanner(System.in)
系统标准输入流默认的位置是控制台 也可以通过System.setIn() 方法来修改系统默认输入流 从而从其他位置读取数据
打印流
采用了装饰设计模式 为普通输出流 增加打印功能
PrintStream
可以讲普通的字节流转换为打印字节流 这也是一个装饰设计模式 增加了打印的机制 有如下的三个好处
打印流增加了打印各种类型数据的方法,省去了将各种类型的数据转换为字节再输出的过程。
打印流会自动刷新流,不需要手动进行flush。
打印流永远不抛异常,它的内部自动解决异常。
PrintWriter
可以将普通的字符流转换为打印字符流 这也是一个装饰设计模式 增加了打印的机制 有如下的三个好处
打印流增加了打印各种类型数据的方法,省去了将各种类型的数据转换为字符再输出的过程。
打印流会自动刷新流,不需要手动进行flush。
打印流永远不抛异常,它的内部自动解决异常。
序列化 / 反序列化
序列化:将对象转化为字节数组的过程。将对象的信息进行完整保存——持久化。
反序列化:将之前序列化的对象的字节数组,再转回成对象的过程。
必须实现Serializabl接口,此接口中并没有定义任何的方法,这个接口仅仅是一个标志,告知虚拟机当前类的对象可以进行序列化反序列化,这样使用接口的方式,称之为标记接口。
java通过创建对象代表现实中的一个具体的事物。
而对象本身是存活在内存中的,内存中的对象的结构是很复杂的,没法直接将一个对象当作一个字节数组来操作。
而在现实开发中,经常需要将内存中的对象 存储到磁盘 通过网络来传输 等等操作,此时需要将内存中的对象转换为可以直接操作的字节数组,这个过程称之为对象的序列化。
java中的序列化反序列化 主要是靠如下两个流来实现的:
ObjectOutputStream - 将对象序列化的流
此类也是装饰设计模式的实现,可以在构造方法中将一个普通字节流传入,此类在传入的流的基础上增加了将对象转换为字节输出的方法。
构造方法:
ObjectOutputStream(OutputStream out)
方法:
void writeObject(Object obj)
void flush()
void close()
案例:创建Person对象 并通过序列化将对象转为字节后输出到文件中 – 这个过程也称之为将对象持久化
ObjectInputStream - 将对象反序列化的流
此类也是装饰设计模式的实现,可以在构造方法中将一个普通字节流传入,此类在传入的流的基础上增加了将之前序列化的字节信息转换为对象的方法。
构造方法: ObjectInputStream(InputStream in)
方法:Object readObject()
void close()
案例:将之前案例中序列化后持久化保存的Person对象反序列化恢复到内存中
java在序列化 和 反序列化时 会通过类中的SerialVersionUID来判断 序列化和反序列化时使用的类 是否是同一个 如果一致 则认为是同一个类 正常反序列化 如果不同则认为不是同一个类 抛出异常。 所以通常要在需要在实现了Serializable接口的类中 声明static final long SerialVersionUID 属性 来指定此编号,并且要保证,序列化和反序列时编号一致。如果不手动指定此编号,虚拟机会自动生成一个编号。
将对象进行序列化 转换为字节数组 保存在磁盘中的过程 也称之为将对象持久化了起来。将持久化的对象 再变回内存中对象的过程 也称之为反持久化。
注意: 1. 用static/transient修饰的属性不会被序列化。
2.静态的属性、集合、数组也不能被序列化。
Properties - java属性对象
是一个类,继承了Hashtable,是一个持久化的映射。
键和值默认是String类型。
持久化指对象保存到硬盘上。
可以通过store方法存储到硬盘,也可以通过load方法反持久化回来。
Properties文件作为配置文件使用,不存储中文,一旦放入中文可能会乱码。因为默认编码是西文编码,不支持中文。
java开发中往往涉及到一些配置型的参数,例如连接数据库时的用户名 密码等信息。。访问网络时的地址 端口等信息。。,这些参数经常会发生变化,不希望写死在程序中,此时,可以将这些参数写在外部的配置文件中,在程序中通过流来进行读取,解析出配置的信息,再基于这些信息工作。这样这些信息发生变化时,就不需要改代码,而只需要改配置文件中的信息就可以了,修改起来更便利,对于代码来说也更安全。
这种使用配置文件 将程序中经常变化的配置信息 提取到程序外统一保存和管理的机制是非常常见的 在很多软件中都会这样去做 常见的配置文件的类型也有很多 比如 .ini .xml .json .yaml 等等 其中 java开发中常用的是.properties文件
java中的.properties文件是java原生提供的配置信息存储方式,可以直接通过java提供的api来方便的操作。
java为了方便解析.properties文件,专门提供了相应的解析类:
java.util.Properties
构造方法:
Properties()
方法:
void load(InputStream inStream)
void load(Reader reader)
String getProperty(String key)
Enumeration<?> propertyNames()
Object setProperty(String key, String value)
void store(OutputStream out, String comments)
void store(Writer writer, String comments)
**.properties文件中只能支持iso8859-1码表的内容,只能写英文 数字 和常见符号,无法包含中文,如果想在properties文件中有中文,必须转换为\u表示的形式
//1.创建Properties对象
Properties prop = new Properties();
//2.加载配置信息 传入一个流 从流中解析该信息 解析过后 prop对象中就已经有了该文件中所有的配置的信息
InputStream in = new FileInputStream(“conf.properties”);
prop.load(in);
//3.从prop中根据键获取对应的值
String user = prop.getProperty(“user”);
//4.获取properties中的所有配置信息
Enumeration enums = prop.propertyNames();
while(enums.hasMoreElements()){
String key = (String) enums.nextElement();
String value = prop.getProperty(key);
System.out.println(key+"~"+value);
}
单元测试
Junit:工程在第一次使用时要导入测试库。右键项目–>Bulid Path–>Add library–>Junit–>next–>finish
@Test-----放在要测试的方法上-----要求方法“三无”:无参数、无返回值、非静态@Before—一般用于完成一些初始化的操作,@After—用于善后
静态导入
import static 包名.类名.方法名 表示导入的静态方法。
静态导入可以在一定程度上提高加载速率,但是写起来麻烦而且降低程序的可读性。如果本类中含有同名方法,会导致这个静态导入无效。
可变参数
可变参数本质上是一个数组。
用…定义可变参数。
参数可有可无,可变参数的个数可以不做限定。
可变参数必须放在参数列表的最后一位,只能有一位。
枚举
用enum关键字来定义枚举。
取值固定而且能够一一列举的情况。
本身是一个特殊的抽象类。
枚举类中可以定义一切方法和属性,允许抽象方法的存在。
枚举类中的构造方法默认私有化。
枚举常量要定义在枚举类的首行。
顶级父类是java.lang.Enum
switch……case在使用的时候的值可以是byte/short/char/int,从jdk1.7开始允许使用String,从JDK1.5开始可以使用枚举常量。
断言assert
根据条件预测结果。
assert i > 20 : “预测结果应该是一个大于20的数字,但实际上是” + i;
如果断言成功,继续往下执行;如果断言失败,就此停止。
断言不是默认开启的,需要手动开启,需要配置参数-ea。
e:enable
a:assertion

Java基础笔记6——File、流、枚举、断言相关推荐

  1. Java基础笔记 – 枚举类型的使用介绍和静态导入

    Java基础笔记 – 枚举类型的使用介绍和静态导入 本文由 arthinking 发表于404 天前 ⁄ Java基础 ⁄ 暂无评论 ⁄ 被围观 1,433 views+ 1.枚举(Enum): JD ...

  2. Java基础笔记23-集合练习题

    Java基础笔记23-集合练习题 定义一个集合,实现去重复的功能 定义一个数组,数组中存放的是图片的后缀,给一个文件的名字,判断是否是图片 定义一个带有数字和字符串的集合,使用迭代器进行迭代,只输出字 ...

  3. Java基础笔记(2)——HashMap的源码,实现原理,底层结构是怎么样的

    Java基础笔记(2)--HashMap的源码,实现原理,底层结构是怎么样的 HashMap的源码,实现原理,底层结构 1.HashMap: HashMap是基于哈希表的 Map 接口的实现.此实现提 ...

  4. Java基础笔记(14)—— Java的基础类型和字节大小

    Java基础笔记(14)-- Java的基础类型和字节大小 Java基础笔记(14)-- Java的基础类型和字节大小 Java语言提供了八种基本类型.六种数字类型(四个整数型(默认是int 型),两 ...

  5. java基础9(IO流)-File类

    File类 File:文件和目录路径名的抽象表示形式.即java中把文件或者目录都封装成File对象 代码练习1 import java.io.File;public class FileDemo1{ ...

  6. Java基础笔记(4w字长文警告)

    Java核心笔记 提示:点击右上角关注博主,收获共同话题 下面是我的个人学习Java的笔记,现在分享给广大友友: 文章目录 Java核心笔记 0.导论 标柱注释: 学习方法: 1 java概述 1.1 ...

  7. java学习笔记16--I/O流和文件

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input  Output)流 IO流用来处理 ...

  8. Java基础:常用IO流

    1. 数据流 1.1 概述 数据流是操作基本数据类型的流,分为数据输入流,数据输出流. 1.2 数据输入流 1.DataInputStream:数据输出流允许应用程序以适当方式将基本 Java 数据类 ...

  9. Java基础教程:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...

最新文章

  1. 阿里云地图添加点线面
  2. python是不是特别垃圾-Python 这语言真是混乱和原始
  3. maven+springMVC+mybatis+junit详细搭建过程
  4. 插件式架构设计实践:插件式系统架构设计简介
  5. 数据结构与算法--5.Python实现十大排序算法
  6. Linux C高级编程——网络编程之UDP(4)
  7. evplayer2可以多设备登录吗_这么多自助设备,你都选对投放位置了吗
  8. string常用函数用法集合
  9. android view绘制速度,关于android ui的优化 view 的绘制速度
  10. 场效应管原理_IGBT场效应管的工作原理以及极性判断、好坏判断方法
  11. QT、C++面试中的几个问题
  12. 【微信小程序开发】 踩坑 抽奖幸运大转盘 完美实战
  13. 前端工具使用记录(css/js/htm)
  14. Go语言utf8汉字字符串截取处理小记
  15. 图层蒙版和图层剪贴路径_PS图层蒙版与剪贴蒙版综合应用——水杯里的树
  16. 在线图片尺寸修改 生成图标
  17. get、put、post、delete四大请求的含义与区别个人理解和解释
  18. 立创eda入门-原理图,PCB制作
  19. 互联网摸鱼日报(2023-04-30)
  20. 利用公式计算π=4(1-1/3+1/5-1/7+1/9-...)的近似值,直到括号中最后一项的绝对值小于0.000001为止

热门文章

  1. 倒计时算法(计算剩余多少天)实现
  2. VXLAN 基本概念
  3. flutter 阿里云上传文件
  4. python图形界面化编程GUI(五)坦克大战(一)
  5. nnU-Net v2的环境配置到训练自己的数据集(详细步骤)
  6. css选择器解析:从右向左
  7. linux下载sra数据库,linux下使用Aspera Connect下载sra数据
  8. bryntum gantt
  9. Java中负数的二进制表示
  10. codevs 1160