IO流的学习

思维导图

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190225145749575.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3OTYyNzE0,size_16,color_FFFFFF,t_70)

如何实现数据的换行?

  1. 写了字节数据,并没有写入换行符号。解决方法new FileOutputStream(filename, true);字节写入文件末尾处,而不是写入文件开始处(覆盖原文)
  2. BufferedWriter.newLine() 也可以实现换行
  3. 不同的系统使用的换行符是不一样的,而一些常见的个高级记事本,是可以识别任意换行符号的。
    windows:\r\n
    linux:\n
    Mac:\r

字符的乱码问题

  1. String --> byte[]
    String(byte[] bytes, String charsetName):通过指定的字符集解码字节数组
  2. byte[]–> String
    byte[] getBytes(String charsetName):使用指定的字符集合把字符串编码为字节数组

字节流转字符流

InputStreamReader(InputStream); //通过构造函数初始化,使用的是本系统默认的编码表GBK。
InputStreamWriter(InputStream,String charSet); //通过该构造函数初始化,可以指定编码表。
OutputStreamWriter(OutputStream); //通过该构造函数初始化,使用的是本系统默认的编码表GBK
OutputStreamwriter(OutputStream,String charSet); //通过该构造函数初始化,可以指定编码表。

close()和flush()的区别?

  • close()关闭流对象,但是先刷新一次缓冲区。关闭之后,流对象不可以继续再使用了。
  • flush()目的是把缓冲区里的东西强行写入输出流.仅仅刷新缓冲区,刷新之后,流对象还可以继续使用。

xx

// 字符缓冲流一次读写一个字符串
	private static void method5(String srcString, String destString)
			throws IOException {
		BufferedReader br = new BufferedReader(new FileReader(srcString));
		BufferedWriter bw = new BufferedWriter(new FileWriter(destString));

	String line = null;
	while ((line = br.readLine()) != null) {
		bw.write(line);
		bw.newLine();
		bw.flush();
	}

	bw.close();
	br.close();
}

// 字符缓冲流一次读写一个字符数组
private static void method4(String srcString, String destString)
		throws IOException {
	BufferedReader br = new BufferedReader(new FileReader(srcString));
	BufferedWriter bw = new BufferedWriter(new FileWriter(destString));

	char[] chs = new char[1024];
	int len = 0;
	while ((len = br.read(chs)) != -1) {
		bw.write(chs, 0, len);
	}

	bw.close();
	br.close();
}

// 字符缓冲流一次读写一个字符
private static void method3(String srcString, String destString)
		throws IOException {
	BufferedReader br = new BufferedReader(new FileReader(srcString));
	BufferedWriter bw = new BufferedWriter(new FileWriter(destString));

	int ch = 0;
	while ((ch = br.read()) != -1) {
		bw.write(ch);
	}

	bw.close();
	br.close();
}

// 基本字符流一次读写一个字符数组
private static void method2(String srcString, String destString)
		throws IOException {
	FileReader fr = new FileReader(srcString);
	FileWriter fw = new FileWriter(destString);

	char[] chs = new char[1024];
	int len = 0;
	while ((len = fr.read(chs)) != -1) {
		fw.write(chs, 0, len);
	}

	fw.close();
	fr.close();
}

// 基本字符流一次读写一个字符
private static void method1(String srcString, String destString)
		throws IOException {
	FileReader fr = new FileReader(srcString);
	FileWriter fw = new FileWriter(destString);

	int ch = 0;
	while ((ch = fr.read()) != -1) {
		fw.write(ch);
	}

	fw.close();
	fr.close();
}

打印流PrintWriter

  • PrintWriter类对象的write()、print()、append()、println()(可以自动换行)方法实现最后结果相同,只是在调用的时候其返回值有所不同,可根据需要进行灵活的选择,其他没有看出有什么不同。

打印流的特点

  • 只有写数据的,没有读取数据。只能操作目的地,不能操作数据源。
  • 可以操作任意类型的数据。
  • 如果启动了自动刷新,能够自动刷新。
  • 该流是可以直接操作文本文件的。 *

哪些流对象是可以直接操作文本文件的呢?

  • FileInputStream – FileOutputStream
  • FileReader-- FileWriter
  • PrintStream – PrintWriter

标准输入输出流

System类中的两个成员变量:

  • public static final InputStream in “标准”输入流。
  • public static final PrintStream out “标准”输出流。

随机访问流

  • RandomAccessFile类不属于流,是Object类的子类。
  • 但它融合了InputStream和OutputStream的功能。
  • 支持对文件的随机访问读取和写入。
  • public RandomAccessFile(String name,String mode):第一个参数是文件路径,第二个参数是操作文件的模式。

合并流
从一个有序的输入流集合开始,从第一个读取到文件的结尾,然后从第二个文件读取,依此类推,直到最后一个输入流达到文件的结尾。 (即可以读取多个文件)

通过Vector.elements() 得到Enumeration<E>,即将流对象存放入Vector集合中

构造方法

SequenceInputStream(Enumeration<? extends InputStream> e) 
SequenceInputStream(InputStream s1, InputStream s2) 

序列化流

  • 序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输。
    对象 --> 流数据(ObjectOutputStream)
  • 反序列化流:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。
    流数据 -->对象(ObjectInputStream)
  • 类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。(自动产生一个序列化id值。)

一个类中可能有很多的成员变量,有些不想进行序列化。该怎么办?

  • 使用transient关键字声明不需要序列化的成员变量
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值