黑马程序员--Java_IO流(二)
来源:互联网 发布:黑暗之魂 隐藏 知乎 编辑:程序博客网 时间:2024/06/05 17:37
——- android培训、java培训、期待与您交流! ———-
字符流
字符流其实就是通过转换流把字节流转换成字节流+编码表。
编码表有很多,不过我们最常见的有两种:
- ACSII表:7位表示一个数据,最高位为符号位。
- UTF-8:最多用三个字节来表示一个字符。能用一个就用一个,现在不行就用三个。
我们在写程序的时候,可以使用指定的编码表,如果不指定,则使用系统默认的编码表。
转换流
import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;/* * OutputStreamWriter:字符输出流 * public OutputStreamWriter(OutputStream out):根据默认编码表把字节流的数据转换为字符流 * public OutputStreamWriter(OutputStream out,Charset cs):根据指定编码表把字节流的数据转换为字符流 * * InputStreamReader:字符输入流 * public InputStreamReader(InputStream in):根据默认编码表把字节流的数据转换为字符流 * public InputStreamReader(InputStream in,Charset cs):根据指定编码表把字节流的数据转换为字符流 * */public class ZiFu { public static void main(String[] args) throws IOException { InputStreamReader isr = new InputStreamReader(new FileInputStream( "a.txt")); OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream( "b.txt")); int i = 0; while ((i = isr.read()) != -1) { osw.write(i); } osw.flush(); osw.close(); isr.close(); }}
flush()和close()的区别:
- A:close()关闭流对象,但是先刷新一次缓冲区。关闭之后,流对象不可以继续再使用了。
- B:flush()仅仅刷新缓冲区,刷新之后,流对象还可以继续使用。
由于转换流的代码比较长,Java就提供了其子类供我们使用。
OutputStreamWriter = FileOutputStream + 编码表(GBK)
FileWriter = FileOutputStream + 编码表(GBK)
InputStreamReader = FileInputStream + 编码表(GBK)
FileReader = FileInputStream + 编码表(GBK)
转换流复制文件
import java.io.FileReader;import java.io.FileWriter;import java.io.IOException; /* * 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中 * * 数据源: * a.txt -- 读取数据 -- 字符转换流 -- InputStreamReader -- FileReader * 目的地: * b.txt -- 写出数据 -- 字符转换流 -- OutputStreamWriter -- FileWriter */public class CopyFileDemo2 { public static void main(String[] args) throws IOException { // 封装数据源 FileReader fr = new FileReader("a.txt"); // 封装目的地 FileWriter fw = new FileWriter("b.txt"); // 一次一个字符数组 char[] chs = new char[1024]; int len = 0; while ((len = fr.read(chs)) != -1) { fw.write(chs, 0, len); fw.flush(); } // 释放资源 fw.close(); fr.close(); }}
高效字符流
import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class ZiFuDemo2 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new FileReader("a.txt")); BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt")); BufferedReader br2 = new BufferedReader(new FileReader("a.txt")); BufferedWriter bw2 = new BufferedWriter(new FileWriter("c.txt")); int i = 0; while ((i = br.read()) != -1) { bw.write(i); } char[] chs = new char[1024]; int len = 0; while ((len = br2.read(chs)) != -1) { bw2.write(chs); } br.close(); bw.close(); br2.close(); bw2.close(); }}
高效字符流的特殊用法
import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;/* * 字符缓冲流的特殊方法: * BufferedWriter: * public void newLine():根据系统来决定换行符 * BufferedReader: * public String readLine():一次读取一行数据 * 包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null */public class BufferedDemo { public static void main(String[] args) throws IOException { // write(); read(); } private static void read() throws IOException { // 创建字符缓冲输入流对象 BufferedReader br = new BufferedReader(new FileReader("bw2.txt")); // 最终版代码 String line = null; while ((line = br.readLine()) != null) { System.out.println(line); } //释放资源 br.close(); } private static void write() throws IOException { // 创建字符缓冲输出流对象 BufferedWriter bw = new BufferedWriter(new FileWriter("bw2.txt")); for (int x = 0; x < 10; x++) { bw.write("hello" + x); // bw.write("\r\n"); bw.newLine(); bw.flush(); } bw.close(); }}
其他类型的流
数据输入输出流
import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;/* * 可以读写基本数据类型的数据 * 数据输入流:DataInputStream * DataInputStream(InputStream in) * 数据输出流:DataOutputStream * DataOutputStream(OutputStream out) */public class DataStreamDemo { public static void main(String[] args) throws IOException { // 写 // write(); // 读 read(); } private static void read() throws IOException { // DataInputStream(InputStream in) // 创建数据输入流对象 DataInputStream dis = new DataInputStream( new FileInputStream("dos.txt")); // 读数据 byte b = dis.readByte(); short s = dis.readShort(); int i = dis.readInt(); long l = dis.readLong(); float f = dis.readFloat(); double d = dis.readDouble(); char c = dis.readChar(); boolean bb = dis.readBoolean(); // 释放资源 dis.close(); System.out.println(b); System.out.println(s); System.out.println(i); System.out.println(l); System.out.println(f); System.out.println(d); System.out.println(c); System.out.println(bb); } private static void write() throws IOException { // DataOutputStream(OutputStream out) // 创建数据输出流对象 DataOutputStream dos = new DataOutputStream(new FileOutputStream( "dos.txt")); // 写数据了 dos.writeByte(10); dos.writeShort(100); dos.writeInt(1000); dos.writeLong(10000); dos.writeFloat(12.34F); dos.writeDouble(12.56); dos.writeChar('a'); dos.writeBoolean(true); // 释放资源 dos.close(); }}
内存操作流
import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;/* * 内存操作流:用于处理临时存储信息的,程序结束,数据就从内存中消失。 * 字节数组: * ByteArrayInputStream * ByteArrayOutputStream * 字符数组: * CharArrayReader * CharArrayWriter * 字符串: * StringReader * StringWriter */public class ByteArrayStreamDemo { public static void main(String[] args) throws IOException { // 写数据 ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 写数据 for (int x = 0; x < 10; x++) { baos.write(("hello" + x).getBytes()); } byte[] bys = baos.toByteArray(); // 读数据 ByteArrayInputStream bais = new ByteArrayInputStream(bys); int by = 0; while ((by = bais.read()) != -1) { System.out.print((char) by); } }}
合并流
import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.SequenceInputStream;/* * 以前的操作: * a.txt -- b.txt * c.txt -- d.txt * * 现在想要: * a.txt+b.txt -- c.txt */public class SequenceInputStreamDemo { public static void main(String[] args) throws IOException { // SequenceInputStream(InputStream s1, InputStream s2) // 需求:把ByteArrayStreamDemo.java和DataStreamDemo.java的内容复制到Copy.java中 InputStream s1 = new FileInputStream("ByteArrayStreamDemo.java"); InputStream s2 = new FileInputStream("DataStreamDemo.java"); SequenceInputStream sis = new SequenceInputStream(s1, s2); BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream("Copy.java")); byte[] bys = new byte[1024]; int len = 0; while ((len = sis.read(bys)) != -1) { bos.write(bys, 0, len); } bos.close(); sis.close(); }}
序列化流和反序列化流
import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;/* * 序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输。对象 -- 流数据(ObjectOutputStream) * 反序列化流:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。流数据 -- 对象(ObjectInputStream) */public class ObjectStreamDemo { public static void main(String[] args) throws IOException, ClassNotFoundException { // 由于我们要对对象进行序列化,所以我们先自定义一个类 // 序列化数据其实就是把对象写到文本文件 // write(); read(); } private static void read() throws IOException, ClassNotFoundException { // 创建反序列化对象 ObjectInputStream ois = new ObjectInputStream(new FileInputStream( "oos.txt")); // 还原对象 Object obj = ois.readObject(); // 释放资源 ois.close(); // 输出对象 System.out.println(obj); } private static void write() throws IOException { // 创建序列化流对象 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream( "oos.txt")); // 创建对象 Person p = new Person("蔡依林", 27); // public final void writeObject(Object obj) oos.writeObject(p); // 释放资源 oos.close(); }}
Properties
Properties的基本演示
import java.util.Properties;import java.util.Set;/* * Properties:属性集合类。是一个可以和IO流相结合使用的集合类。 * Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。 * * 是Hashtable的子类,说明是一个Map集合。 */public class PropertiesDemo { public static void main(String[] args) { // 作为Map集合的使用 Properties prop = new Properties(); // 添加元素 prop.put("it002", "hello"); prop.put("it001", "world"); prop.put("it003", "java"); // 遍历集合 Set<Object> set = prop.keySet(); for (Object key : set) { Object value = prop.get(key); System.out.println(key + "---" + value); } }}
Properties的特殊功能
import java.util.Properties;import java.util.Set;/* * 特殊功能: * public Object setProperty(String key,String value):添加元素 * public String getProperty(String key):获取元素 * public Set<String> stringPropertyNames():获取所有的键的集合 */public class PropertiesDemo2 { public static void main(String[] args) { // 创建集合对象 Properties prop = new Properties(); // 添加元素 prop.setProperty("张三", "30"); prop.setProperty("李四", "40"); prop.setProperty("王五", "50"); Set<String> set = prop.stringPropertyNames(); for (String key : set) { String value = prop.getProperty(key); System.out.println(key + "---" + value); } }}
Properties的load和store方法
import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.Reader;import java.io.Writer;import java.util.Properties;/* * 这里的集合必须是Properties集合: * public void load(Reader reader):把文件中的数据读取到集合中 * public void store(Writer writer,String comments):把集合中的数据存储到文件 */public class PropertiesDemo3 { public static void main(String[] args) throws IOException { // myLoad(); myStore(); } private static void myStore() throws IOException { // 创建集合对象 Properties prop = new Properties(); prop.setProperty("李延旭", "21"); prop.setProperty("康小广", "23"); prop.setProperty("任兴亚", "25"); Writer w = new FileWriter("name.txt"); prop.store(w, "helloworld"); w.close(); } private static void myLoad() throws IOException { Properties prop = new Properties(); // 注意:这个文件的数据必须是键值对形式 Reader r = new FileReader("prop.txt"); prop.load(r); r.close(); System.out.println("prop:" + prop); }}
总结
IO流是Java中比较常用的知识,记得分清字节流和字符流的区别,对于指定的文件,需要使用适合的流,不过字节流可以操作任何文件,如果你不知道用什么,那就使用字节流,有时效率可能会低,但肯定不会错。
——- android培训、java培训、期待与您交流! ———-
0 0
- 黑马程序员--Java_IO流(二)
- java_IO流(黑马程序员)
- 黑马程序员--Java_IO流(一)
- 黑马程序员 java_IO流笔记(一)
- 黑马程序员 java_IO流笔记(三)
- 马程序员 java_IO流笔记(二)
- “黑马程序员”java_IO流之PipedInputStream管道流的使用
- 黑马程序员——学习笔记09.Java_IO流
- java_io.FileInputStream(二)
- 黑马程序员-------JAVA_IO输入与输出
- 黑马程序员------Java_IO关于缓冲区提高代码复用性
- 黑马程序员(二)
- 第十九天-Java_IO(流)
- 黑马程序员--IO流笔记(二)
- 黑马程序员_javaIO流(二)
- 黑马程序员 IO流(二)
- 黑马程序员--IO流(二)
- 黑马程序员_IO流(二)
- C++_如何得到类内字符串内容
- mysql的查询、子查询及连接查询
- ip_queue内核通信
- 整合spark和hive
- 对象的简单内存分析
- 黑马程序员--Java_IO流(二)
- UINavigationController及界面传值
- [cocoa]_[初级]_[解析XML文件获取数据]
- 深入理解ThreadLocal
- 使用Toolbar + DrawerLayout快速实现高大上菜单侧滑
- mysql登录报错“Access denied for user 'root'@'localhost' (using password: YES”的处理方法
- DIV 边框重叠 像素变粗 解决办法
- Kth Largest Element in an Array
- 1041. Be Unique (20)