思维导图
如何实现数据的换行?
- 写了字节数据,并没有写入换行符号。解决方法
new FileOutputStream(filename, true);
字节写入文件末尾处,而不是写入文件开始处(覆盖原文) BufferedWriter.newLine()
也可以实现换行- 不同的系统使用的换行符是不一样的,而一些常见的个高级记事本,是可以识别任意换行符号的。
windows:\r\n
linux:\n
Mac:\r
字符的乱码问题
- String --> byte[]
String(byte[] bytes, String charsetName)
:通过指定的字符集解码字节数组 - 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关键字声明不需要序列化的成员变量