黑马程序员 Java基础--IO流(三)

----------android培训java培训java学习型技术博客、期待与您交流!------------


在此,分享一下自己学习JAVA的学习心得。有不对的地方请帮忙改正,也希望对想java的同学有帮助!


JAVA基础

        —IO流



   一、 数据输入输出流DataInputStream和DataOutputStream

   数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。 
   


    二、操作字节数组:

       ByteArrayInputStream:可以取出被缓存的byte数组
       构造:ByteArrayInputStream(byte[] buf)  创建一个 ByteArrayInputStream,使用 buf 作为其缓冲区数组。      方法:read();

       ByteArrayOutputStream:类似于一个byte数组的缓存。可以向其中添加byte数组
       构造:ByteArrayOutputStream():创建一个新的 byte 数组输出流。
       方法:toByteArray():获取内部的所有数据。

       操作字符数组
CharArrayReader
CharArrayWrite
       操作字符串
StringReader
StringWriter
   
   三、打印流:
   
   1.字节打印流:PrintStream

   2.字符打印流:
PrintWriter
   
   打印流的特点:
    1.只能操作目的地,不能操作数据。(只能写,没有读)
    2.可以操作任意类型的数据。
    3.如果启动了自动刷新,能够自动刷新。
    4.可以操作文件的流:
    1)基本字节流:
    2)缓冲区字节流:
    3)基本字符流:
    4)缓冲区字符流
        5)打印流
    6)都可以操作文件


   将PrintWriter作为Writer使用:PrintWriter是Writer的子类,必然会实现Writer中的所有抽象方法;
   
   自动刷新:
   使用构造方法:
   PrintWriter(OutputStream out, boolean autoFlush):通过现有的 OutputStream 创建新的 PrintWriter。
   PrintWriter(Writer out, boolean autoFlush) :创建新 PrintWriter。
   autoFlush - boolean 变量;如果为 true,则 println、printf 或 format 方法将刷新输出缓冲区
  
Java练习代码:

练习:使用打印流复制文本:
public class Demo {
	public static void main(String[] args) {
		// 1.读取流
		try {
			BufferedReader in = new BufferedReader(new FileReader(
					"printWriter_test.txt"));
			// 2.输出流
			PrintWriter out = new PrintWriter("copy.txt");

			// 3.开始复制
			String row = null;
			while ((row = in.readLine()) != null) {
				// out.write(row);
				// out.write("\r\n");

				out.println(row);// print() + newLine()
			}
			in.close();
			out.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}


   RandomAccessFile类:

   1.此类的实例支持对随机访问文件的读取和写入。
   2.RandomAccessFile类不属于流,是Object类的子类。
   3.它融合了InputStream和OutputStream的功能。支持对随机访问文件的读取和写入。
   
   常用方法:
   1.writeXxxx()
   2.readXxxx()
   3.getFilePointer():获取当前的文件指针的偏移量
   4.seek():设置当前文件指针的偏移量;


   序列化和反序列化:(重点)
   
   1.序列化流:ObjectOutputStream:它可以将一个对象写入到文本文件中,或者通过网络传输;
   2.反序列化流:ObjectInputStream:它可以将一个序列化的对象反序列化;
   
   注意:
   1.需要被序列化的对象必须实现java.io.Serializable接口;
   2.Serializable接口没有任何方法。没有任何方法的接口,叫:标记接口。
   3.一个类的对象被序列化后,可能会被更改,如果发生更改后,再反序列化,将会抛出java.io.InvalidClassException异常;
     解决方法:需要被序列化的类中添加serialVersionUID变量;此变量如果跟序列化的对象的值相同,就认为是相同版本的。
   
Java代码:
练习:序列化反序列化
public class Demo {
	public static void main(String[] args) {
		// 1.序列化
		// Student stu = new Student("张三",20,'男');
		try {
			/*
			 * ObjectOutputStream out = new ObjectOutputStream( new
			 * FileOutputStream("ObjectOutputStream.txt"));
			 * out.writeObject(stu); out.close(); System.out.println("输出完毕!");
			 */

			// 返序列化
			ObjectInputStream in = new ObjectInputStream(new FileInputStream(
					"ObjectOutputStream.txt"));
			Object obj = in.readObject();
			Student stu2 = (Student) obj;
			System.out.println("读取的内容:" + stu2.getName() + "--" + stu2.getAge()
					+ "--" + stu2.getSex());

		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

Student类:
<span style="font-size:18px;">import java.io.Serializable;

public class Student implements Serializable {

	private static final long serialVersionUID = 1L;
	private String name;
	private int age;
	// 可以指定sex不被序列化使用关键字:transient
	private transient char sex;
        //构造函数
	public Student(String name, int age, char sex) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
	}
<span style="white-space:pre">	</span>//无参,构造函数
	public Student() {
		super();
	}
<span style="white-space:pre">	</span>//get和set方法
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public char getSex() {
		return sex;
	}

	public void setSex(char sex) {
		this.sex = sex;
	}

}</span>



properties类:

    Properties类用于操作配置文件:

   1.它集成自Hashtable,所以Properties就是一个Map;

   2.特有的方法:Properties中的键和值都是String类型;

     public Object setProperty(String key,String value)
 public String getProperty(String key)
 public Set<String> stringProperty

   3.Properties类操作配置文件:使用此类操作配置文件是非常方便,不用自己去一行一行的去读,还得一行一行的解析;
    public void load(Reader reader):读取
public void store(Writer writer,String comments):写入

Java代码:
练习:
public class Demo {
	public static void main(String[] args) {
		// 将Properties作为Map使用
		Properties pro = new Properties();
		// 填充集合
		pro.put("it001", "张三");
		pro.put("it002", "李四");
		pro.put("it003", "王五");

		// 遍历集合
		Set keySet = pro.keySet();

		for (Object obj : keySet) {
			System.out.println("键:" + obj + " 值:" + pro.get(obj));
		}

		// 测试Properties的特有方法:
		// setProperties(String key,String value):它相当于Map的put()方法
		Properties pro2 = new Properties();
		pro2.setProperty("it004", "章子怡");
		pro2.setProperty("it005", "邓超");
		pro2.setProperty("it006", "陈赫");

		// 通过某个键获取值:getProperties():它相当于Map的get()方法
		String v1 = pro2.getProperty("it005");
		System.out.println("v1 = " + v1);

		// 遍历
		// stringPropertyNames():它相当于Map的keySet()方法
		Set<String> keySet2 = pro2.stringPropertyNames();
		for (String s : keySet2) {
			System.out.println("键:" + s + " 值:" + pro2.getProperty(s));
		}

	}
}


















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值