22.01_IO流(序列流)(了解)
-
1.什么是序列流
- 序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时, 将从被整合的第一个流开始读, 读完一个之后继续读第二个, 以此类推.
-
2.使用方式
-
整合两个: SequenceInputStream(InputStream, InputStream)
-
整合多个: SequenceInputStream(Enumeration)
/**
* @param args
* 整合两个输入流
* SequenceInputStream(InputStream s1, InputStream s2)
* 整合多个输入流
* SequenceInputStream(Enumeration<? extends InputStream> e)
* @throws IOException
*/
public static void main(String[] args) throws IOException {
//demo1();
//demo2();
FileInputStream fis1 = new FileInputStream(“a.txt”);
FileInputStream fis2 = new FileInputStream(“b.txt”);
FileInputStream fis3 = new FileInputStream(“c.txt”);Vector<FileInputStream> v = new Vector<>(); //创建集合对象 v.add(fis1); //将流对象存储进来 v.add(fis2); v.add(fis3); Enumeration<FileInputStream> en = v.elements(); //Vector中的方法,返回此向量的组件的枚举 SequenceInputStream sis = new SequenceInputStream(en); //将枚举中的输入流整合成一个 FileOutputStream fos = new FileOutputStream("d.txt"); int b; while((b = sis.read()) != -1) { fos.write(b); } sis.close(); fos.close(); } public static void demo2() throws FileNotFoundException, IOException { FileInputStream fis1 = new FileInputStream("a.txt"); FileInputStream fis2 = new FileInputStream("b.txt"); SequenceInputStream sis = new SequenceInputStream(fis1, fis2); FileOutputStream fos = new FileOutputStream("c.txt"); int b; while((b = sis.read()) != -1) { fos.write(b); } sis.close(); //sis在关闭的时候,会将构造方法中传入的流对象也都关闭 fos.close(); } public static void demo1() throws FileNotFoundException, IOException { FileInputStream fis1 = new FileInputStream("a.txt"); //创建字节输入流关联a.txt FileOutputStream fos = new FileOutputStream("c.txt"); //创建字节输出流关联c.txt int b1; while((b1 = fis1.read()) != -1) { //不断的在a.txt上读取字节 fos.write(b1); //将读到的字节写到c.txt上 } fis1.close(); //关闭字节输入流 FileInputStream fis2 = new FileInputStream("b.txt"); int b2; while((b2 = fis2.read()) != -1) { fos.write(b2); //清空是FileOutputStream fos = new FileOutputStream("c.txt");这条语句清空的,与fos.write()语句无关,两个语句先后,会继续写 } fis2.close(); fos.close(); }
-
22.03_IO流(内存输出流*****)(掌握)
-
1.内存输出流(ByteArrayOutputStream())
- 该输出流可以向内存中写数据, 把内存当作一个缓冲区, 写出之后可以一次性获取出所有数据
-
2.使用方式
- 创建对象: new ByteArrayOutputStream()
- 写出数据: write(int), write(byte[])
- 获取数据: toByteArray()
-
/** * @param args * ByteArrayOutputStream * 内存输出流 * * FileInputStream读取中文的时候出现了乱码 * * 解决方案 * 1,字符流读取 * 2,ByteArrayOutputStream //此类实现了一个输出流,其中的数据被写入一个byte数组,缓冲区会随着数据的不断写入而自动增长,可使用toByteArray()和toString()获取数据,参数为空或指定字节数组大小 * @throws IOException */ public static void main(String[] args) throws IOException { //demo1(); FileInputStream fis = new FileInputStream("e.txt"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); //在内存中创建了可以增长的内存数组 int b; while((b = fis.read()) != -1) { baos.write(b); //将读取到的数据逐个写到内存中 } //byte[] arr = baos.toByteArray(); //将缓冲区的数据全部获取出来,并赋值给arr数组 //System.out.println(new String(arr)); System.out.println(baos.toString()); //将缓冲区的内容转换为了字符串,在输出语句中可以省略调用toString方法 fis.close(); //流是需要在硬盘上读取数据,所以需要关流,而ByteArrayOutputStream对象与集合,数组一样,都是直接在内存中,所以不需要关流 } public static void demo1() throws FileNotFoundException, IOException { FileInputStream fis = new FileInputStream("e.txt"); byte[] arr = new byte[3]; int len; while((len = fis.read(arr)) != -1) { System.out.println(new String(arr,0,len)); } //FileInputStream读取中文的时候出现了乱码 fis.close(); }
22.04_IO流(内存输出流之黑马面试题)(掌握)
定义一个文件输入流,调用read(byte[] b)方法,将a.txt文件中的内容打印出来(byte数组大小限制为5)
-
public static void main(String[] args) throws IOException { //1,read(byte[] b)是字节输入流的方法,创建FileInputStream,关联a.txt FileInputStream fis = new FileInputStream("a.txt"); //2,创建内存输出流,将读到的数据写到内存输出流中,这样子,即使是数组长度只有5也不会乱码 ByteArrayOutputStream baos = new ByteArrayOutputStream(); //因为是内存,所以不需要写文件名 //3,创建字节数组,长度为5 byte[] arr = new byte[5]; int len; while((len = fis.read(arr)) != -1) { baos.write(arr, 0, len); //数组与普通文件输入不同 //System.out.println(new String(arr,0,len)); //大家? ? } //4,将内存输出流的数据全部转换为字符串打印 System.out.println(baos); //大家好,即使没有调用,底层也会默认帮我们调用toString()方法 //5,关闭输入流 fis.close(); }
22.05_IO流(随机访问流概述和读写数据)(了解)
-
A:随机访问流概述(RandomAccessFile())
- RandomAccessFile概述
- RandomAccessFile类不属于流,是Object类的子类。但它融合了InputStream和OutputStream的功能。
- 支持对随机访问文件的读取和写入。
-
B:read(),write(),seek()
/** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { RandomAccessFile raf = new RandomAccessFile("g.txt", "rw"); //读和写,不清空 //raf.write(97); //写入a //int x = raf.read(); //System.out.println(x); //97 raf.seek(0); //在指定位置设置指针 raf.write(98); //a修改为b,因为在第0个位置 raf.close(); }
22.06_IO流(对象操作流ObjecOutputStream)(了解)
-
1.什么是对象操作流
- 该流可以将一个对象写出, 或者读取一个对象到程序中. 也就是执行了序列化(数据上传)和反序列化(读档)的操作.
-
2.使用方式
-
写出: new ObjectOutputStream(OutputStream), writeObject()
-
将对象存储在集合中写出
public class Demo3_ObjectOutputStream { /** * @param args * @throws IOException * 将对象写到文件上,序列化 */ public static void main(String[] args) throws IOException { //demo1(); //将对象存储在集合中写出(对象操作流优化) Person p1 = new Person("张三", 23); Person p2 = new Person("李四", 24); Person p3 = new Person("王五", 25); Person p4 = new Person("赵六", 26); ArrayList<Person> list = new ArrayList<>(); list.add(p1); list.add(p2); list.add(p3); list.add(p4); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("e.txt")); oos.writeObject(list); //把整个集合对象一次写出 oos.close(); } public static void demo1() throws IOException, FileNotFoundException { Person p1 = new Person("张三", 23); Person p2 = new Person("李四", 24); //Person类中要实现Serializable 接口,不需要加别的语句,只需implements Serializable,因为接口中没有具体方法 //FileOutputStream fos = new FileOutputStream("e.txt"); //fos.write(p1); //FileWriter fw = new FileWriter("e.txt"); //fw.write(p1); //无论是字节输出流,还是字符输出流都不能直接写出对象 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("e.txt")); //创建对象输出流 oos.writeObject(p1); //Person自动类型提升为Object类,好处是可以写任意对象 oos.writeObject(p2); oos.close(); //文件中是乱码,但不重要,因为文件内容不需可读 }
-
22.07_IO流(对象操作流ObjectInputStream)(了解)
-
读取: new ObjectInputStream(InputStream), readObject()
-
读取到的是一个集合对象
/** * @param args * @throws IOException * @throws FileNotFoundException * @throws ClassNotFoundException * ObjectInputStream * 对象输入流,反序列化 */ public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException { //demo1(); //读取到的是一个集合对象(对象操作流优化) ObjectInputStream ois = new ObjectInputStream(new FileInputStream("e.txt")); ArrayList<Person> list = (ArrayList<Person>) ois.readObject(); //强转,将集合对象一次读取 //泛型在运行期会被擦除,索引运行期相当于没有泛型 //想去掉黄色可以加注解@Suppresswarnings("unchecked") for (Person person : list) { System.out.println(person); } ois.close(); } public static void demo1() throws IOException, FileNotFoundException, ClassNotFoundException { ObjectInputStream ois = new ObjectInputStream(new FileInputStream("e.txt")); Person p1 = (Person) ois.readObject(); Person p2 = (Person) ois.readObject(); //readObject读的是Object类,所以此处需要强转 //Person p3 = (Person) ois.readObject(); //不存在p3,当文件读取到了末尾时出现EOFException System.out.println(p1); System.out.println(p2); ois.close(); }
-
22.09_IO流(加上id号)(了解)
22.10_IO流(数据输入输出流)(了解)
-
1.什么是数据输入输出流(DataInputStream(), DataOutputStream())
- DataInputStream, DataOutputStream可以按照基本数据类型大小读写数据
- 例如按Long大小写出一个数字, 写出时该数据占8字节. 读取的时候也可以按照Long类型读取, 一次读取8个字节.
-
2.使用方式
-
DataOutputStream(OutputStream), writeInt(), writeLong()
-
DataInputStream(InputStream), readInt(), readLong()
/** * @param args * @throws IOException * 00000000 00000000 00000011 11100101 //int类型的997 * 11100101 * 00000000 00000000 00000000 11100101 */ public static void main(String[] args) throws IOException { //demo1(); //demo2(); //demo3(); DataInputStream dis = new DataInputStream(new FileInputStream("h.txt")); int x = dis.readInt(); int y = dis.readInt(); int z = dis.readInt(); System.out.println(x); System.out.println(y); System.out.println(z); //999 dis.close(); } public static void demo3() throws FileNotFoundException, IOException { DataOutputStream dos = new DataOutputStream(new FileOutputStream("h.txt")); dos.writeInt(997); dos.writeInt(998); dos.writeInt(999); //乱码,但没关系,读取时可以正常读取 dos.close(); } public static void demo2() throws FileNotFoundException, IOException { FileInputStream fis = new FileInputStream("h.txt"); int x = fis.read(); int y = fis.read(); int z = fis.read(); System.out.println(x); //十进制: 229 System.out.println(y); //230 System.out.println(z); //231 fis.close(); } public static void demo1() throws FileNotFoundException, IOException { FileOutputStream fos = new FileOutputStream("h.txt"); fos.write(997); fos.write(998); fos.write(999); //乱码,没有找到对应的码表值,超过一个字节的范围,将前3个8位砍掉,只写最后一个8位 fos.close(); }
-
22.11_IO流(打印流的概述和特点)(掌握)
-
1.什么是打印流
-
该流可以很方便的将对象的toString()结果输出, 并且自动加上换行, 而且可以使用自动刷出的模式
-
System.out就是一个PrintStream(打印字节流), 其默认向控制台输出信息
PrintStream ps = System.out; ps.println(97); //其实底层用的是Integer.toString(x),将x转换为数字字符串打印 ps.write(97); //查找码表,找到对应的a并打印 ps.println("xxx"); ps.println(new Person("张三", 23)); Person p = null; ps.println(p); //如果是null,就返回null,如果不是null,就调用对象的toString()
-
-
2.使用方式
- 打印: print(), println()
- 自动刷出: PrintWriter(OutputStream out, boolean autoFlush, String encoding) //打印字符流
- PrintStream和PrintWriter分别是打印的字节流和字符流,打印流只操作数据目的
-
PrintWriter pw = new PrintWriter(new FileOutputStream("g.txt"), true); pw.write(97); //a pw.print("大家好"); pw.println("你好"); //自动刷出autoFlush,只针对的是println方法,对write与print方法都无效,但若写在最后,前面的在缓冲区的内容也能刷新出来。并没有大用 pw.close(); //输出流有内置的小的缓冲区,close方法可以将其刷新出来
22.12_IO流(标准输入输出流概述和输出语句)
-
1.什么是标准输入输出流(掌握)
- System.in是InputStream, 标准输入流, 默认可以从键盘输入读取字节数据
- System.out是PrintStream, 标准输出流, 默认可以向Console中输出字符和字节数据
-
2.修改标准输入输出流了解
- 修改输入流: System.setIn(InputStream)
- 修改输出流: System.setOut(PrintStream)
-
/** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { //demo1(); System.setIn(new FileInputStream("a.txt")); //改变标准输入流(抽象类) System.setOut(new PrintStream("b.txt")); //改变标准输出流 InputStream is = System.in; //获取标准的键盘输入流,默认指向键盘,改变后指向文件 PrintStream ps = System.out; //获取标准输出流,默认指向的是控制台,改变后就指向文件 int b; while((b = is.read()) != -1) { ps.write(b); } //System.out.println(); //也是一个输出流,不用关,因为没有和硬盘上的文件产生关联的管道 is.close(); ps.close(); } public static void demo1() throws IOException { InputStream is = System.in; int x = is.read(); System.out.println(x); is.close(); //不需要关,并没有关联到某个具体的文件,内存与硬盘没有关联,若是关联到某个具体的文件,一定要关流 InputStream is2 = System.in; int y = is2.read(); System.out.println(y); //输入流只有一个,关了就没了,这个也再开不了,运行会报错 }
22.13_IO流(修改标准输入输出流拷贝图片)(了解)
System.setIn(new FileInputStream("IO图片.png")); //改变标准输入流
System.setOut(new PrintStream("copy.png")); //改变标准输出流
InputStream is = System.in; //获取标准输入流
PrintStream ps = System.out; //获取标准输出流
int len;
byte[] arr = new byte[1024 * 8];
while((len = is.read(arr)) != -1) {
ps.write(arr, 0, len);
}
is.close();
ps.close();
22.14_IO流(两种方式实现键盘录入)(了解)
-
A:BufferedReader的readLine方法。
- BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
-
B:Scanner
/*BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //InputStreamReader转换流 String line = br.readLine(); System.out.println(line); br.close();*/ Scanner sc = new Scanner(System.in); String line = sc.nextLine(); System.out.println(line); sc.close();
22.15_IO流(Properties的概述和作为Map集合的使用)(了解)
-
A:Properties的概述(读取硬盘中的配置文件,如config.properties)
- Properties 类表示了一个持久的属性集。
- Properties 可保存在流中或从流中加载。
- 属性列表中每个键及其对应值都是一个字符串。
-
B:案例演示
-
Properties作为Map集合的使用
#Tue Jun 29 05:34:44 CST 2088 qq=12345 tel=18912345678 username=zhangsan
-
22.16_IO流(Properties的特殊功能使用)(了解)
-
A:Properties的特殊功能
- public Object setProperty(String key,String value)
- public String getProperty(String key)
- public Enumeration stringPropertyNames()
-
B:案例演示
- Properties的特殊功能
22.17_IO流(Properties的load()和store()功能)(了解)
-
B:案例演示
-
Properties的load()和store()功能
/** * @param args * Properties是Hashtable的子类,可继承Hashtable的put方法 * @throws IOException * @throws FileNotFoundException */ public static void main(String[] args) throws FileNotFoundException, IOException { //demo1(); //demo2(); Properties prop = new Properties(); prop.load(new FileInputStream("config.properties")); //将文件上的键值对读取到集合中 prop.setProperty("tel", "18912345678"); //此处只修改了内存,并没有写入配置文件(硬盘)上 prop.store(new FileOutputStream("config.properties"), null); //第二个参数是对列表参数的描述,可以给值(字符串,如“吃吃吃”),也可以给null,写在开头:#吃吃吃,还有一行是:#时间,都是注释 System.out.println(prop); //打印无序,因为是Hashtable的子类,Hash算法存取无序 } public static void demo2() { Properties prop = new Properties(); prop.setProperty("name", "张三"); prop.setProperty("tel", "18912345678"); //System.out.println(prop); //直接打印 //遍历 Enumeration<String> en = (Enumeration<String>) prop.propertyNames(); //返回所有键的枚举,强转,否则默认为Object类 while(en.hasMoreElements()) { String key = en.nextElement(); //获取Properties中的每一个键 String value = prop.getProperty(key); //根据键获取值 System.out.println(key + "="+ value); } } public static void demo1() { Properties prop = new Properties(); prop.put("abc", 123); System.out.println(prop); }
-