System: 类中的方法和属性都是静态的 .
out: 标准输出 , 默认是控制台
in: 标准输入 , 默认是键盘 .
获取系统属性信息 :Properties getProperties();
Runtime 对象
该类没有提供构造函数 , 说明不可以 new 对象 . 那么会直接想到该类中方法都是静态的 , 但该类中还有非静态方法. 说明该类肯定会提供了方法获取本类对象 , 而且该方法是静态的 , 并返回值类型是本类类型 . 该类使用了单例设计模式 .
该方法是 static Runtime getRuntime();
Runtime r=Runtime.getRuntime();
r.exec(“xxx.exe”);
IO 流用来处理设备之间的数据传输
Java 对数据的操作是通过流的方式
Java 用于操作流的对象都在 IO 包中
流按操作数据分为两种:字节流与字符流
按流向分为:输入流,输出流
字节流的抽象基类
InputStream outputStream
字符流的抽象基类
Reader Writer
IO 异常处理方式 , 在外面建立 null 引用 , 在 try 内初始化 , 在 finally 里关闭资源 .
一个标准的 IO 处理异常
import java.io.FileWriter;
public class FileWriterDemo {
public static void main(String[] args){
FileWriter fw= null ;
try {
fw = new FileWriter( "demo.txt" );
fw.write( "nihaoma?" );
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fw!= null )
fw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
字符流的缓冲区
缓冲区的出现提高了对数据的读写效率
对应类
BufferedWriter BufferedReader
缓冲区要结合流才可以使用 , 在流的基础上对流的功能进行了增强 .
缓冲区的出现是为了提高流的操作效率而出现的 . 所以在创建缓冲区前 , 必须要先有流对象 . 只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数 .
其实关闭缓冲区就是在关闭缓冲区中的流对象 .
装饰设计模式 :
当想要对已经对象进行功能增强时 , 可以定义一个类 , 将该对象传入 , 基于已有对象的功能并提供加强功能 , 那么自定义的该类就称为装饰类 .
装饰类通常会通过构造方法接收被装备的对象 . 并基于被装饰的对象的功能提供加强的功能 .
字符流 :
FileReader
FileWriter
BufferedReader 缓冲区
BufferedWriter
字节流 :
FileInputStream FileOutputStream
BufferedInputStream BufferedOutputStream 缓冲区
读取转换流 .InputStreamReader
键盘录入 .BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
写入转换流 OutPutStreamWriter
控制台输出 :BufferedWriter buwr=new BufferedWriter(new OutputStreamWriter(System.out));
上面可以通过 System.setIn 和 System.setOut 来设置对应的源和目的 .
转换流什么时候用 ?
字符和字节之间的桥梁 , 通常波及到编码转换时要用到转换流 .
流操作的基本规律 :
1. 明确源和目的
2. 操作的数据是否是纯文本 .
3. 当体系明确后 , 在明确要使用哪个具体对象 . 是否要提高效率 . 来加入转换流 .
IO 包 File 类是文件和目录路径名的抽象表示形式。
用来将文件或者文件夹封闭成对象 .
方便对文件与文件夹的属性信息进行操作 .
File 对象可以作为参数传递给流的构造函数 .
separator 字段是目录分隔符 .
File f=new File(“a.txt”);// 将 a.txt 封闭成 file 对象 . 可以将已有的和末出现的文件夹封装成对象 .
File f2=new File(“c:\\abc”,”b.txt”);//”b.txt” 可以传一个可变的参数 .
syso(f);// 打印文件的路径 , 按封装时的格式打印出来 .
File 常见方法 .
1. 创建 boolean createNewFile();
2. 删除 boolean delete(); void deleteOnExit(); mkdir(); new File(“abc\\kk”).mkdir();
mkdirs(); 创建多级文件夹 .
3. 判断 Boolean exists(); 文件是否存在 .
isDirectory();isFile(); 通过这两方法可以判断封装完的对象是什么 ?
4. 获取信息 .getXXX();
列出目录下的所有内容 , 递归 .
1. 递归注意限定条件 .
2. 注意递归的次数 , 不要内存溢出 .
Properties 是 hashtable 的子类 . 也就是说它具备 map 集合的特点 , 而且它里边存储的键值都是字符串 . 是集合和IO 技术相结合的集合容器 .
该对象的特点 : 可以用于键值对形式的配置文件 .
InputStreamReader 和OutputStreamWriter
明白这是什么转换流?按操作数据它们是什么流?
看JDK:InputStreamReader 是字节流通向字符流的桥梁;OutputStreamWriter 是字符流通向字节流的桥梁
明白这为什么是这样?明确接收什么流类型?为什么转成另一种流类型和转的过程?
我认为彻底明白了上面这些问题才算明白IO流的基础,才能知道什么流何时用合适.
自己刚学时也是一点不明白.到后面复习知识点时这在脑海中思路才清晰起来.
打印流 PrintWriter 与 PrintStream 可以直接操作输入流和文件 .
该流提供了打印方法 , 可以将各种数据类型的数据都原样打印 .
PrintStream 构造函数可以接收的参数类型 :
1. file 对象 . File
2. 字符串路径 . String
3. 字节输出流 . OutputStream
字符打印流 :PrintWriter 构造函数可以接收的参数类型 :
1. file 对象 . File
2. 字符串路径 . String
3. 字节输出流 . OutputStream
4. 字符输出流 Writer
序列流 SequenceInputStream 对多个流进行合并 .
表示其他输入流的逻辑串联 . 可以接收多个字节流对象 , 用 enum 形式来表示 .
操作对象 ObjectInputStream 与 ObjectOutputStream 被操作的对象需要实现 Serializable( 标记接口 ).
管道流 PipedInputStream 和 PipedOutputStream
对应的用 connect 相连接 .
随机访问文件 RandomAccessFile
该类直接继承自 Object, 不算是 IO 体系中子类 , 因为具备读写所以是 IO 包中成员 .
内部封装了一个数组 , 而且通过指针对数组元素进行操作 . 可以通过 getFilePointer 获取指针位置 , 还可以通过seek 改变指针位置 .
其实能完成读写的原理就是内部封装了字节输入流和字节输出流 , 该类只能操作文件 . 而且操作文件还有模式 . r rw
该对象的构造函数要操作的文件不存在会自动创建 , 如果存在不会覆盖 .
如果模式为 r 不会创建文件 , 只会读取 , 文件如果不存在会出异常 .
如果模式为 rw, 文件不存在会创建 , 存 在不会覆盖 .
操作基本数据类型的 IO 类
DateInputStream 与 DateOutputStream
操作字节数组
ByteArrayInputStream 与 ByteArrayOutputStream
这两个流对象都操作的数组 , 并没有使用系统资源 , 所以不用 close 关闭 .
内存就是 ArrayStream, 用流的读写思想操作数组 .
操作字符数组
CharArrayReader 与 CharArrayWriter
操作字符串
StringReader 与 StringWriter
字符编码 :
编码 : 字符串变成字节数组 String à byte[]; str.getBytes();
解码 : 字节数组变成字符串 . byte[] à String: new String(byte[]);
服务器用的是 ISO8859-1