Java IO流(四)

****************************转换流*****************************

作用: 把字节流 转换成 字符流

别人给你一个字节流, 但是我们想以字符为单位读和写,这时需要使用转换流,转换一下

字节 字符

输入 InputStream Reader InputStreamReader

输出 OutputStream Writer OutputStreamWriter

演示代码:

package com.chapter13.演示字节读;

import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;

/**
* 公司:蓝桥软件学院
* 作者:zhangzy
* 时间:2017年7月24日 下午2:02:58
* 功能:演示转换流
*/
public class 演示转换流 {

public static void main(String[] args) throws Exception {

/*FileInputStream fis = new FileInputStream("d:\\jidi16\\io\\HelloIO.txt");//别人给的

Reader reader = new InputStreamReader(fis);

char c = (char)reader.read();
System.out.println(c);*/

FileOutputStream fos = new FileOutputStream("d:\\jidi16\\io\\HelloIO.txt",true);//别人给的 字节流

Writer writer = new OutputStreamWriter(fos);

writer.write(‘好‘);

writer.close();
}
}

****************************适配器模式Adapter(转换器)*****************************

描述: 让原本不兼容的接口 变的兼容 达到用户想要的目的

package com.degisnPattern.adapter;

//适配器类
//一.实现目标接口(实现想要的)
public class DuckToBirdAdapter implements Bird{

//二.组合现有的
private Duck duck;

public DuckToBirdAdapter(){

}

public DuckToBirdAdapter(Duck duck){
this.duck = duck;
}

@Override
public void fly() {

//三.使用现有的 模拟想要的

for(int i=1;i<=10;i++){
duck.run();
}
}

}

package com.degisnPattern.adapter;

public class Test {

public static void main(String[] args) {

Duck duck = new DonaldDuck();

//Reader new InputStreamReader
Bird bird = new DuckToBirdAdapter(duck);

bird.fly();
}
}

*************************************按行读写*****************************

按行读

BufferedReader readLine()

按行写

BufferedWriter write

PrintWriter print 或 println

演示代码:

package com.chapter13.演示字节读;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

/**
* 公司:蓝桥软件学院
* 作者:zhangzy
* 时间:2017年7月24日 下午3:19:20
* 功能:按行读写
*/
public class 演示按行读写 {

public static void main(String[] args) {

String s = "";
//按行读
//一.建立通道
FileReader fr = null;
BufferedReader br = null;
try {
fr = new FileReader("d:\\jidi16\\io\\HelloIO.txt");
br = new BufferedReader(fr);
} catch (FileNotFoundException e) {
System.out.println("文件没有找到");
e.printStackTrace();
System.exit(-1);
}

FileWriter fw = null;;
PrintWriter pw = null;
try {
fw = new FileWriter("d:\\jidi16\\io\\copy.txt");
pw = new PrintWriter(fw);
} catch (IOException e1) {
System.out.println("文件夹没有找到");
e1.printStackTrace();
System.exit(-1);
}

//二.利用read循环读
try {
while((s=br.readLine())!=null){

//ready()是判断有没有下一行
//如果有返回 true 没有返回false
if(br.ready()){

pw.println(s);
}else{
pw.print(s);
}
}
} catch (IOException e) {
System.out.println("文件复制失败");
e.printStackTrace();
}finally{
//三.关闭通道
if(br!=null){
try {
br.close();
} catch (IOException e) {
System.out.println("关闭BufferedReader失败");
e.printStackTrace();
}
}

if(fr!=null){
try {
fr.close();
} catch (IOException e) {
System.out.println("关闭FileReader失败");
e.printStackTrace();
}
}

if(pw!=null){
pw.close();
}

if(fw!=null){
try {
fw.close();
} catch (IOException e) {
System.out.println("关闭FileWriter通道失败");
e.printStackTrace();
}
}

}

}
}

*************************************缓冲流*****************************

按行读

BufferedReader readLine()

按行写

BufferedWriter write

PrintWriter print 或 println

以上三个类都是带有缓冲区的, 为什么要使用缓冲流???

因为如果每次读取一个字节, 都要和硬盘打一次交道, 和硬盘打交道开销比较大...效率低

提高存和读的效率

硬盘(楼底下 离你500米 垃圾场)

缓冲区(小的垃圾桶)

******************************缓冲区中的数据什么时候会真正写到文件中(面试题)*******************************

1. 当缓冲流关闭时

close()

调close()方法的时候 底层代码会自动先调用flush()方法

2. 调用缓冲流的flush()时

会把缓冲区的内容写入到硬盘上

3. 缓冲区满的时候

会自动把缓冲区的内容写入到文件中

缓冲区的实质:字符数组

char[] charArr = new char[8192];

***************************************数据流*****************************

字节流 每次读写一个字节

字符流 每次读写一个字符

按行读写 每次以行为单位读写

数据流 每次读写一个数据类型,例如int、long、String等

writeLong()

writeInt()

writeUTF();//写一个字符串 或writeChars(String s)

演示代码:

package com.chapter13.演示数据流;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;

/**
* 公司:蓝桥软件学院
* 作者:zhangzy
* 时间:2017年7月24日 下午4:28:56
* 功能:演示数据流
*/
public class 演示数据流 {

public static void main(String[] args) throws Exception {

FileOutputStream fos = new FileOutputStream("d:\\jidi16\\io\\data.txt");

DataOutputStream dos = new DataOutputStream(fos);

dos.writeLong(10);

//数据流 读
FileInputStream fis = new FileInputStream("d:\\jidi16\\io\\data.txt");
DataInputStream dis = new DataInputStream(fis);

long a = dis.readLong();

System.out.println(a);
}
}

***************************************对象流*****************************

序列化: 把内存中的对象 保存到文件中 叫做序列化

反序列化: 把文件中的对象 恢复成 内存中的对象 叫做反序列化..

知识点:

1. 序列化的对象 所属的类 一定要实现 Serializable 接口,否则运行时会报错,不可序列化的异常

Exception in thread "main" java.io.NotSerializableException: com.chapter12.DVD

//空规范 实现它以后 就可以当它来使用了

public interface Serializable {

}

2. transient 关键字 只能用来修饰属性

临时的,使用transient 修饰的属性 不会被 序列化到文件中

3. 序列化id

序列化id 唯一的标示一个字节码文件的

序列化时使用的.class文件 反序列化的时候 也要使用同一个.class文件

用户没有声明序列化id,IDE会出现一个警告,序列化id是和 类的属性相关的算法 自动产生的..

10

20

Exception in thread "main" java.io.InvalidClassException: com.chapter12.DVD; local class incompatible: stream classdesc serialVersionUID = -7999102326333215443, local class serialVersionUID = 5724934721374926400

演示代码:

package com.chapter13.演示对象流;

import java.io.*;

import java.util.ArrayList;
import java.util.List;

import com.chapter12.DVD;

/**
* 公司:蓝桥软件学院
* 作者:zhangzy
* 时间:2017年7月24日 下午4:51:44
* 功能:演示对象流
*/
public class 演示对象流 {

public static void main(String[] args) throws Exception{

List<DVD> shoppingCart = new ArrayList<DVD>();

DVD dvd1 = new DVD(1,"神偷奶爸3",50);
DVD dvd2 = new DVD(2,"悟空传",60);
DVD dvd3 = new DVD(3,"战狼2",70);

shoppingCart.add(dvd1);
shoppingCart.add(dvd2);
shoppingCart.add(dvd3);

//序列化: 对象 ----->文件中

FileOutputStream fos = new FileOutputStream("d:\\jidi16\\io\\shoppingCart.serial");

ObjectOutputStream oos = new ObjectOutputStream(fos);

oos.writeObject(shoppingCart);

//反序列化: 文件中的对象--------> 内存中的对象

FileInputStream fis = new FileInputStream("d:\\jidi16\\io\\shoppingCart.serial");
ObjectInputStream ois = new ObjectInputStream(fis);

List<DVD> shoppingCart2 = (List<DVD>)ois.readObject();

System.out.println(shoppingCart2);
}
}

*************************************序列化的具体应用*****************************************

RMI= Remote Method Invoke 远程方法调用

RPC= Remote Procedure Call 远程过程调用

*************************************装饰者模式 Decorator*****************************************

举例: 披萨店

装饰者模式: 在不改变原有类代码的基础上,给类添加功能(使用组合来实现),可以防止类爆炸

BufferedWriter

DataOutputStream

ObjectOutputStream

这些类都是装饰者类..

*************************************总结*****************************************

字节流、字符流、按行读写、数据流、对象流、转换流

原文地址:https://www.cnblogs.com/MrTanJunCai/p/9906829.html

时间: 2024-10-11 17:54:55

Java IO流(四)的相关文章

装饰器模式及JAVA IO流例子★★★☆☆

一.什么是装饰模式 通过关联机制给类增加行为,其行为的扩展由修饰对象来决定: 二.补充说明 与继承相似,不同点在于继承是在编译期间扩展父类,而装饰器模式在运行期间动态扩展原有对象: 或者说,继承是对类进行扩展,装饰模式是对对象进行扩展: 三.角色 抽象构件 具体构件 抽象装饰类 具体装饰类 说明:具体构件.抽象装饰类.具体装饰类的共同父类是抽象构件,具体装饰类继承抽象装饰类并在运行期间装饰具体构件: 四.例子 例子说明: 画家接口Painter,为抽象构件,有两个方法,获取画家描述信息及绘画:

黑马程序员-Java IO流

--Java培训.Android培训.iOS培训..Net培训.期待与您交流!-- 一.概述 Java中与IO相关的类有很多,都集中在java.io中,都是以流的形式操作的,流是有一定的顺序,像一个管道一样,它的本质是传输数据.根据数据类型的不同可以分为字节流和字符流,根据流向的不同可以分为输入流和输出流. 字符流:因为数据有不同的编码,可以对字符进行不同的操作,其本质还是基于字节流,然后再查询相应的码表.一般用于处理纯文本数据. 字节流:可以处理所有类型数据,二进制文件(图片,音频等). 输入

学习笔记-java IO流总结 转载

1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.Java的I/O流提供了读写数据的标准方法.任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法. Java.io是大多数面向数据流的输入/输出类的主要软件包.此外,Java也对块传输提供支持,在核心库 java.nio中采用的便是块IO. 流IO的好处是简单易用,缺点是效率较低.块IO效率很高,但编程比较

java io流 分析

java io流 在java应用或者android应用中很常见,并且使用频率很高的一个模块.当时每次需要用到这个模块的时候总是有提笔忘字的感觉,不知道该用哪个流或者该用谁包装谁. 所以我就花了一点时间把这个块的结构梳理了一下.一是能让自己理清一下思路.二是以后如果还有提笔忘字的时候,看这篇文章就好了. 首先java io流分两大系统InputStream 和Reader,前者及其子类主要用于读取字节流,后者及其子类主要用于读取字符流.下面是InputSteram系的继承树 首先可以看InputS

Java IO流详解(五)——缓冲流

缓冲流也叫高效流,是处理流的一种,即是作用在流上的流.其目的就是加快读取和写入数据的速度. 缓冲流本身并没有IO功能,只是在别的流上加上缓冲效果从而提高了效率.当对文件或其他目标频繁读写或操作效率低,效能差时.这时使用缓冲流能够更高效的读写信息.因为缓冲流先将数据缓存起来,然后一起写入或读取出来.所以说,缓冲流还是很重要的,在IO操作时加上缓冲流提升性能. Java IO流中对应的缓冲流有以下四个: 字节缓冲流:BufferedInputStream.BufferedOutputStream 字

Java:IO流与文件基础

Java:IO流与文件基础 说明: 本文所有内容包含图片均为MrSaber自己编写,转载请练习我哦. 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象称作 输入流,可以向其中写入一个字节序列的对象称作 输出流. ? 这些字节序列的来源可以是:文件.网络连接.内存块等. ? 抽象类InputStream和OutputStream是构成输入/输出(I/O)的基础. ? 因为面向字节的流

java io流(字节流)复制文件

java io流(字节流) 复制文件 //复制文件 //使用字节流 //复制文本文件用字符流,复制其它格式文件用字节流 import java.io.*; public class Index{ public static void main(String[] args) throws Exception{ //字符流方式 //FileReader fz = new FileReader("E:/1.txt"); //FileWriter zt = new FileWriter(&qu

【Android】数据存储-java IO流文件存储

1.数据持久化:将在内存中的瞬时数据保存在存储设备中.瞬时数据:设备关机数据丢失.持久化技术提供一种机制可以让数据在瞬时状态和持久状态之间转换. 2.Android中简单的三种存储方式:文件存储.SharedPreference 存储以及数据库存储. 1.文件存储 :不对数据作任何处理,将数据原封不动地存储到文件中,适合存储一些简单的文本数据和二进制数据. a.将数据存储到文件中 Context类提供了一个openFileOutput()方法,可以用于将数据存储到文件中.这个方法接收两个参数,第

Java IO流学习总结

Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作. IO流的分类 根据处理数据类型的不同分为:字符流和字节流 根据数据流向不同分为:输入流和输出流 字符流和字节流 字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象.本质其实就是基于字节流读取时,去查了指定的码表. 字节流和字符流的区

Java IO流学习总结(转)

原文地址:http://www.cnblogs.com/oubo/archive/2012/01/06/2394638.html Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作.   IO流的分类 根据处理数据类型的不同分为:字符流和字节流 根据数据流向不同分为:输入流和输出流 字符流和字节流 字符