dede后台做两个网站,html编辑器怎么设置为word,苏州市住房建设局网站首页,如何搭建一个网站开发环境目录
一、转换流 二、字节缓冲流 三、字符缓冲流 四、序列化流与反序列化流 五、打印流 六、标准输入、输出流 七、IO流总结
一、转换流
1. OutputStreamWriter 类
#xff08;1#xff09; 概述
java.io.OutputStreamWriter继承 Writer类#xff1b;就是一个字符输出流…目录
一、转换流 二、字节缓冲流 三、字符缓冲流 四、序列化流与反序列化流 五、打印流 六、标准输入、输出流 七、IO流总结
一、转换流
1. OutputStreamWriter 类
1 概述
java.io.OutputStreamWriter继承 Writer类就是一个字符输出流写文本文件是字符通向字节的桥梁将 字符流 转成 字节流write()字符字符数组字符串
2 构造方法
OutputStreamWriter(OuputStream out)接收所有的字节输出流 字节输出流目前只有 FileOutputStream OutputStreamWriter(OutputStream out, String charsetName) String charsetName传递 编码表名字GBK、UTF-8 public class OutputStreamWriterDemo {public static void main(String[] args) throws IOException {writeUTF();}//转换流对象OutputStreamWriter写文本采用UTF-8编码表写入public static void writeUTF()throws IOException{//创建字节输出流绑定文件FileOutputStream fos new FileOutputStream(c:\\utf.txt);//创建转换流对象构造方法保证字节输出流并指定编码表是UTF-8OutputStreamWriter osw new OutputStreamWriter(fos,UTF-8); //GBK可以不写osw.write(你好);osw.close(); //使用close()连刷新带关闭}
}2. InputStreamReader 类
1 概述
java.io.InputStreamReader继承 Reader是 字符输入流读取文本文件字节流向字符的桥梁将 字节流 转为 字符流读取的方法read() 读取1个字符读取字符数组
2 构造方法
InputStreamReader(InputStream in)接收所有的 字节输入流 可以传递的字节输入流 FileInputStream InputStreamReader(InputStream in,String charsetName): 传递编码表的名字
public class InputStreamReaderDemo {public static void main(String[] args) throws IOException {readUTF();}//转换流,InputSteamReader读取文本采用UTF-8编码表,读取文件utfpublic static void readUTF()throws IOException{//创建字节输入流,传递文本文件FileInputStream fis new FileInputStream(c:\\utf.txt);//创建转换流对象,构造方法中,包装字节输入流,同时写编码表名InputStreamReader isr new InputStreamReader(fis,UTF-8);char[] ch new char[1024];int len isr.read(ch);System.out.println(new String(ch,0,len));isr.close();}
}###3. 转换流子类父类的区别
继承关系 OutputStreamWriter 的子类: FileWriter InputStreamReader 的子类FileReader区别OutputStreamWriter 和 InputStreamReader 是字符和字节的桥梁也可以称之为字符转换流。字符转换流原理字节流 编码表FileWriter 和 FileReader作为子类仅作为操作字符文件的便捷类存在。当操作的字符文件使用的是默认编码表时可以不用父类而直接用子类就完成操作了简化了代码。以下三句话功能相同 InputStreamReader isr new InputStreamReader(new FileInputStream(“a.txt”));//默认字符集。 InputStreamReader isr new InputStreamReader(new FileInputStream(“a.txt”),“GBK”);//指定GBK字符集。 FileReader fr new FileReader(“a.txt”); 注意一旦要指定其他编码时绝对不能用子类必须使用字符转换流。什么时候用子类呢 条件1、操作的是文件。2、使用默认编码。 二、字节缓冲流
1. 概述
可提高IO流的读写速度分为字节缓冲流与字符缓冲流
2. 字节输出缓冲流 BufferedOutputStream
java.io.BufferedOuputStream作用: 提高原有输出流的写入效率BufferedOuputStream 继承 OutputStream方法写入 write 字节,字节数组构造方法BufferedOuputStream(OuputStream out)可以传递任意的字节输出流传递的是哪个字节流就对哪个字节流提高效率
public class BufferedOutputStreamDemo {public static void main(String[] args)throws IOException {//创建字节输出流,绑定文件//FileOutputStream fos new FileOutputStream(c:\\buffer.txt);//创建字节输出流缓冲流的对象,构造方法中,传递字节输出流BufferedOutputStream bos newBufferedOutputStream(new FileOutputStream(c:\\buffer.txt));bos.write(55);byte[] bytes HelloWorld.getBytes();bos.write(bytes);bos.write(bytes, 3, 2);bos.close();}
}3. 字节输入缓冲流 BufferedInputStream
BufferedInputStream继承 InputStream ,标准的字节输入流读取方法 read() 单个字节字节数组构造方法: BufferedInputStream(InputStream in)可以传递任意的字节输入流传递是谁就提高谁的效率可以传递的字节输入流 FileInputStream
public class BufferedInputStreamDemo {public static void main(String[] args) throws IOException{//创建字节输入流的缓冲流对象,构造方法中包装字节输入流,包装文件BufferedInputStream bis newBufferedInputStream(new FileInputStream(c:\\buffer.txt));byte[] bytes new byte[1024];int len 0 ;while((len bis.read(bytes))!-1){System.out.print(new String(bytes,0,len));}bis.close();}
}4. 四种文件复制方式的效率比较
结论字节流读写单个字节 125250 毫秒字节流读写字节数组 193 毫秒字节流缓冲区流读写单个字节1210 毫秒字节流缓冲区流读写字节数组 73 毫秒代码
public class Copy {public static void main(String[] args)throws IOException {long s System.currentTimeMillis();copy_4(new File(c:\\q.exe), new File(d:\\q.exe));long e System.currentTimeMillis();System.out.println(e-s);}/** 方法,实现文件复制* 4. 字节流缓冲区流读写字节数组*/public static void copy_4(File src,File desc)throws IOException{BufferedInputStream bis new BufferedInputStream(new FileInputStream(src));BufferedOutputStream bos new BufferedOutputStream(new FileOutputStream(desc));int len 0 ;byte[] bytes new byte[1024];while((len bis.read(bytes))!-1){bos.write(bytes,0,len);}bos.close();bis.close();}/** 方法,实现文件复制* 3. 字节流缓冲区流读写单个字节*/public static void copy_3(File src,File desc)throws IOException{BufferedInputStream bis new BufferedInputStream(new FileInputStream(src));BufferedOutputStream bos new BufferedOutputStream(new FileOutputStream(desc));int len 0 ;while((len bis.read())!-1){bos.write(len);}bos.close();bis.close();}/** 方法,实现文件复制* 2. 字节流读写字节数组*/public static void copy_2(File src,File desc)throws IOException{FileInputStream fis new FileInputStream(src);FileOutputStream fos new FileOutputStream(desc);int len 0 ;byte[] bytes new byte[1024];while((len fis.read(bytes))!-1){fos.write(bytes,0,len);}fos.close();fis.close();}/** 方法,实现文件复制* 1. 字节流读写单个字节*/public static void copy_1(File src,File desc)throws IOException{FileInputStream fis new FileInputStream(src);FileOutputStream fos new FileOutputStream(desc);int len 0 ;while((len fis.read())!-1){fos.write(len);}fos.close();fis.close();}
}三、字符缓冲流
1. 字符输出缓冲流 BufferedWriter
java.io.BufferedWriter继承 Writer写入方法 write () 单个字符,字符数组,字符串构造方法BufferedWriter(Writer w)传递任意字符输出流传递谁就高效谁能传递的字符输出流 FileWriter, OutputStreamWriter
public class BufferedWrierDemo {public static void main(String[] args) throws IOException{//创建字符输出流,封装文件FileWriter fw new FileWriter(c:\\buffer.txt);BufferedWriter bfw new BufferedWriter(fw);bfw.write(100);bfw.flush();bfw.write(你好.toCharArray());bfw.flush();bfw.write(你好);bfw.flush();bfw.write(我好好);bfw.flush();bfw.write(大家都好);bfw.flush();bfw.close();}
}2. 字符输出缓冲流 BufferedWriter—特有方法 newLine
void newLine() 写换行newLine()文本中换行, \r\n也是文本换行方法具有平台无关性 windows \r\n Linux \n newLine()运行结果和操作系统是相互关联的JVM: 安装的是 Windows 版本newLine()写的就是 \r\n安装的是 Linux 版本newLine() 写的就是**\n**
3.字符输入流缓冲流 BufferedReader
1概述
java.io.BufferedReader继承 Reader从字符输入流中读取文本缓冲各个字符从而实现字符、数组和行的高效读取 读取功能 read() 单个字符,字符数组 构造方法BufferedReader(Reader r)可以任意的字符输入流有FileReaderInputStreamReader
2BufferedReader 自己的功能
String readLine(): 读取文本行 \r\n 读取一个文本行包含该行内容的字符串不包含任何行终止符如果已到达流末尾则返回 null 获取内容的方法一般都有返回值 int没有返回的都是 负数 引用类型 找不到返回 null boolean 找不到返回 false public class BufferedReaderDemo {public static void main(String[] args) throws IOException {int lineNumber 0;//创建字符输入流缓冲流对象,构造方法传递字符输入流,包装数据源文件BufferedReader bfr new BufferedReader(new FileReader(c:\\a.txt));//调用缓冲流的方法 readLine()读取文本行//循环读取文本行, 结束条件 readLine()返回nullString line null;while((line bfr.readLine())!null){lineNumber;System.out.println(lineNumber line);}bfr.close();}
}4. 字符流缓冲区流复制文本文件
/** 使用缓冲区流对象,复制文本文件* 数据源 BufferedReaderFileReader 读取* 数据目的 BufferedWriterFileWriter 写入* 读取文本行, 读一行,写一行,写换行*/
public class Copy_1 {public static void main(String[] args) throws IOException{BufferedReader bfr new BufferedReader(new FileReader(c:\\w.log)); BufferedWriter bfw new BufferedWriter(new FileWriter(d:\\w.log));//读取文本行, 读一行,写一行,写换行String line null;while((line bfr.readLine())!null){bfw.write(line);bfw.newLine();bfw.flush();}bfw.close();bfr.close();}
}四、序列化流与反序列化流
1. 概述
对象的序列化对象中的数据以流的形式写入到文件中保存过程称为写出对象ObjectOutputStream将对象写道文件中实现序列化对象的反序列化在文件中以流的形式将对象读出来读取对象ObjectInputStream将文件对象读取出来
2. 实现
ObjectOutputStream 写对象,实现序列化 构造方法:ObjectOutputStream(OutputSteam out)传递任意的 字节输出流void writeObject(Object obj)写出对象 ObjectInputStream读取对象,实现反序列化 构造方法ObjectInputStream(InputStream in)传递任意的 字节输入流,输入流封装文件,必须是序列化的文件 Object readObject() 读取对象
//定义类
public class Person implements Serializable{//省略}
}public class ObjectStreamDemo {public static void main(String[] args)throws IOException, ClassNotFoundException {writeObject();readObject();}//ObjectOutputStreampublic static void writeObject() throws IOException{//创建字节输出流,封装文件FileOutputStream fos new FileOutputStream(c:\\person.txt);//创建写出对象的序列化流的对象,构造方法传递字节输出流ObjectOutputStream oos new ObjectOutputStream(fos);Person p new Person(lisi,25);//调用序列化流的方法writeObject,写出对象oos.writeObject(p);oos.close();//ObjectInputStreampublic static void readObject() throws IOException, ClassNotFoundException{FileInputStream fis new FileInputStream(c:\\person.txt);//创建反序列化流,构造方法中,传递字节输入流ObjectInputStream ois new ObjectInputStream(fis);//调用反序列化流的方法 readObject()读取对象Object obj ois.readObject();System.out.println(obj);ois.close();}
}3. 细节
1transient 瞬态关键字
作用 被 transient修饰的属性不会被序列化transient关键字只能修饰成员变量
2静态不能序列化
原因序列化是把对象数据进行持久化存储静态的东西不属于对象而属于类
3Serializable 接口
作用给需要序列化的类上加标记。该标记中没有任何抽象方法只有实现了 Serializable接口的类的对象才能被序列化
4. 序列化中的序列号冲突问题 问题产生 当一个类实现Serializable接口后创建对象并将对象写入文件之后更改了源代码 (比如将成员变量的修饰符有private改成public)再次从文件中读取对象时会报异常 原因一旦修改了源码重新编译产生class文件会根据类的成员重新计算序列号这样新编译的class文件中的序列号与原来文件中的序列号就不同了 解决需要做一个终身不变的序列号! 需要在序列化中自定义序列号
private static final long serialVersionUID 1478652478456L;
// 这样每次编译类时生成的 serialVersionUID 值都是固定的
//类自定义了序列号,编译器就不会计算序列号五、打印流
1. 概述
打印流添加输出数据的功能使它们能够方便地打印各种数据值表示形式.
2. 打印流根据流的分类
字节打印流 PrintStream字符打印流 PrintWriter
3. 方法
void print(String str): 输出任意类型的数据void println(String str): 输出任意类型的数据自动写入换行操作
4. 特点
此流不负责数据源只负责数据目的可以操作任意类型的数据。boolean int long float double打印流,可以开启自动刷新功能 满足两个条件 使用特定的构造方法打开打印流的自动刷新输出的数据目的必须是流对象OutputStreamWriter必须调用 printlnprintfformat三个方法中的一个,启用自动刷新 为其他输出流添加功能永远不会抛出 IOException但是可能抛出别的异常
5. 构造方法
就是打印流的输出目的端PrintStream构造方法 接收File类型,接收字符串文件名,接收字节输出流OutputStream PrintWriter构造方法 接收File类型,接收字符串文件名,接收字节输出流OutputStream, 接收字符输出流Writer
6. 打印字符数组
println数组只有打印字符数组时是打印内容其余均打印数组的地址因为api中定义了打印字符数组的方法其底层是在遍历数组中的元素而其他打印数组的方法都是将数组对象编程Object其底层再将对象编程String调用了 String s String.valueOf(x);方法
7. 利用打印流完成文本文件的复制
/** 打印流实现文本复制* 读取数据源 BufferedReaderFile 读取文本行* 写入数据目的 PrintWriterprintln 自动刷新*/
public class PrintWriterDemo1 {public static void main(String[] args) throws IOException{BufferedReader bfr new BufferedReader(new FileReader(c:\\a.txt));PrintWriter pw new PrintWriter(new FileWriter(d:\\a.txt),true);String line null;while((line bfr.readLine())!null){pw.println(line);}pw.close();bfr.close();}
}六、标准输入、输出流
1. 概述
标准输入流 System.in默认指键盘输入标准输出流 System.out向显示器输出
2. 继承关系
PrintStream extends FilterOutputStreamFilterOutputStream extends OutputStream
3. 案例
public class StandardIO {public static void main(String[] args) throws IOException {BufferedReader br new BufferedReader(new InputStreamReader(System.in));String s;// 标准输入流的read方法读取键盘数据的时候当当前没有键盘输入数据的时候// read会阻塞当前线程使得不能结束只有自定义协议才能结束标准输入流while((s br.readLine()) ! null) {//自定协议当用户输入886结束接收用户输入if(886.equals(s)) {break;}System.out.println(输出 s);}br.close();}
}七、IO流总结
字节流 字节输入流 InputStream FileInputStream 操作文件的字节输入流BufferedInputStream高效的字节输入流ObjectInputStream 反序列化流 字节输出流 OutputStram FileOutputStream 操作文件的字节输出流BufferedOutputStream 高效的字节输出流ObjectOuputStream 序列化流PrintStream 字节打印流 字符流 字符输入流 Reader FileReader 操作文件的字符输入流BufferedReader 高效的字符输入流InputStreamReader 输入操作的转换流(把字节流封装成字符流) 字符输出流 Writer FileWriter 操作文件的字符输出流BufferedWriter 高效的字符输出流OutputStreamWriter 输出操作的转换流(把字节流封装成字符流)PrintWriter 字符打印流 方法 读数据方法 read() 一次读一个字节或字符的方法read(byte[] char[]) 一次读一个数组数据的方法readLine() 一次读一行字符串的方法(BufferedReader类特有方法)readObject() 从流中读取对象(ObjectInputStream特有方法) 写数据方法 write(int) 一次写一个字节或字符到文件中write(byte[] char[]) 一次写一个数组数据到文件中write(String) 一次写一个字符串内容到文件中writeObject(Object ) 写对象到流中(ObjectOutputStream类特有方法)newLine() 写一个换行符号(BufferedWriter类特有方法) 向文件中写入数据的过程 1创建输出流对象 2写数据到文件 3关闭输出流从文件中读数据的过程 1 创建输入流对象 2 从文件中读数据 3 关闭输入流文件复制的过程 1 创建输入流数据源 2 创建输出流目的地 3 从输入流中读数据 4 通过输出流把数据写入目的地 5 关闭流
File类
方法获取文件名称 getName()获取文件绝对路径 getAbsolutePath()获取文件大小 length()获取当前文件夹中所有File对象 File[] listFiles()判断是否为文件 isFile()判断是否为文件夹 isDirectory()创建文件夹 mkdir() mkdirs()创建文件 createNewFile()异常 try…catch…finally捕获处理异常throws 声明异常throw 抛出异常对象 异常的分类 编译期异常 Exception运行期异常 RuntimeException 注意 编译期异常必须处理不然无法编译通过运行期异常程序运行过程中产生的异常信息 实现文件内容的自动追加 构造方法 FileOutputStream(File file, boolean append)FileOutputStream(String fileName, boolean append)FileWriter(File, boolean append)FileWriter(String fileName, boolean append) 实现文件内容的自动刷新 构造方法 PrintStream(OutputStream out, boolean autoFlush)PrintWriter(OutputStream out, boolean autoFlush) 异常 try…catch…finally捕获处理异常throws 声明异常throw 抛出异常对象 异常的分类 编译期异常 Exception运行期异常 RuntimeException 注意 编译期异常必须处理不然无法编译通过运行期异常程序运行过程中产生的异常信息 实现文件内容的自动追加 构造方法 FileOutputStream(File file, boolean append)FileOutputStream(String fileName, boolean append)FileWriter(File, boolean append)FileWriter(String fileName, boolean append) 实现文件内容的自动刷新 构造方法 PrintStream(OutputStream out, boolean autoFlush)PrintWriter(OutputStream out, boolean autoFlush)