2020.11.3收获
今日学习内容:流与文件
File类:java.io包下与平台无关的文件和目录
java可以使用文件路径字符串来创建File实例,文件路径可以是绝对路径,也可以是相对路径,默认情况下,相对路径是依据用户工作路径,通常就是运行Java虚拟机所在的路径
创建File对象后,可以调用File对象的方法来访问操作文件和目录
1.访问文件名相关方法:
String getName():返回文件名或路径名(如果是路径,则返回最后一级子路径)
String getPath():返回路径名
String getAsolutePath():返回绝对路径
。。。。。。
各种文件目录的操作方法
文件过滤器:list()方法接收FilnameFilter参数,只列出符合条件的文件
Java IO流:
流的分类:(从程序所在内存的角度来分类的)
输入流:只能从中读数据
输出流:只能向其中写数据
字节流:操作数据是8位的字节
字符流: 操作数据是16位的字符
节点流和处理流(典型的装饰设计模式)
节点流:从一个特定IO设备读写数据的流,称为节点流
处理流:用于对一个已存在的节点流进行连接和封装,通过封装后的流实现数据读写功能,也被称为高级流/包装流
InputStream/Reader :所有输入流的基类,前者是字节输入流,后者是字符输入流 读数据(抽象类,无法创建实例)
OutputStream/Writer:所有输出流的基类,前者是字节输出流,后者是字符输出流 写数据(抽象类,无法创建实例)
FileInputStream/FileReader FileOutputStream/FileWriter 节点流,直接和指定文件关联
将节点流包装成处理流就能使用相同的代码读写不同的输入输出设备的数据
InputStream和Reader()
InputStream:
int read();从输入流中读取单个字节(字节数据直接转化为int类型)
int read(byte[] b):从输入流中读取b.legth个字节,返回读取的字节个数
int read(byte[] b, int off, int len):从流中读取len个字节,存放在b 从off开始存储
Reder类似只是对象是字符 char
OutputStream和Write
类似
40多个类中,有一些节点流(构造函数的参数是具体的文件,或字符串),还有处理流(构造函数的参数是节点流,或其他已经存在的流)
还有位于JDK其他包下的特殊io流:AudionInputStream访问音频的流
转化流InputStreamReader():字节输入流转化字符输入流 OutputStreamWriter():字节输出流---》字符输出流
System.in:标准输入流,是InputStream的实例
推回输入流:PushbackInputStream PushbackReader 就是unread()方法
参考:http://blog.csdn.net/ma451152002/article/details/11900917
重定向标准输入输出:setIn(), setOut(), setErr()
1 import java.io.*;
2 import java.util.*;
3
4 public class RedirectIn
5 {
6 public static void main(String[] args)
7 {
8 System.out.println("Hello World!");
9
10 try(FileInputStream fis = new FileInputStream("RedirectIn.java"))
11 {
12 System.setIn(fis);
13 Scanner sc = new Scanner(System.in);
14 sc.useDelimiter("\n");
15 while(sc.hasNext())
16 {
17 System.out.println(sc.next());
18 }
19 }
20 catch(Exception e)
21 {
22
23 }
24 }
25 }
Scanner 一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器。
java虚拟机进程读写其他进程数据:
Runtime对象的exec()方法可以运行平台上的其他程序,该方法饭会一个Process对象,代表该程序的子进程,process提供三个方法用于程序和子进程间的通讯
getErrorStream()
getInoutStream()
getOutputStream() 输入输出流在这里思考还还是以Java程序为中心来的(当年老师讲的时候始终没搞明白)
RandomAccessFile()随机机访问文件的方式,程序可以直接跳转到文件任意的地方来读取数据(可以用来实现多线程断点下载)
对象序列化:目标是将对象保存到磁盘,或允许在网络中直接传输对象
机制是把内存的Java对象转换成平台无关的二进制流
某个对象要支持序列化机制,则他的类要实现下面两个接口之一
Serializable
Externalizable(这两个接口无需实现任何方法)
如果序列化的对象有多个父类,那这些父类要么能序列化,要么有空的构造函数否则反序列化时会抛出异常
反序列化时无需通过构造器初始化对象,但要有对象对应的class文件
对象引用的序列化:对象的成员包含引用类型,要序列化该对象时,包含的引用类型也必须是可序列化,否则包含该引用类型的对象不能被序列化
当多个要序列化的对象同时引用了一个对象时,该对象只会序列化一次,(序列化时会检查该对象是否已被序列化过)(会导致一些问题)
自定义序列化:不希望某些变量序列化,不想在某个实例时递归序列化
transient关键字修饰解决这个问题
需要特殊处理的类提供如下的特殊签名的方法实现对序列化和反序列化的完全控制(如何序列化如何反序列化)
private void writeObject(java.io.ObjectOutputStream out) throws IOException
private void readObject(java.io.ObjectInputStream in) throws IOException ,ClassNotfoundException
private void readObjectNoData()throws .......
writeReplace()实现在序列化可以把要序列化的对象替换成别的对象
实现自定义序列化的另一种机制:实现Externalizable实现其两个方法
序列化时Class版本的控制