LineNumberReader
方法:
public int getLineNumber():获取行号
public void setLineNumber(int lineNumber):设置起始行号(默认其实行号从0开始)
String readLine():读取一行
需求:读取文件,每次读取一行打印并且加上行号。
package com.edu_01;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
public class LineNumberDemo {
public static void main(String[] args) throws IOException {
//创建LineNumberReader对象
LineNumberReader lnr = new LineNumberReader(new FileReader("a.txt"));
//设置起始行号
lnr.setLineNumber(9);
//读取数据
String line;
while ((line=lnr.readLine())!=null) {
System.out.println(lnr.getLineNumber()+":"+line);
}
//关流
lnr.close();
}
}
操作基本数据类型的流
1.可以操作基本数据类型的流对象。
2.DataInputStream:读数据。
成员方法:
public byte readByte()//读取byte类型数据
public short readShort()//读取short类型数据
public int readInt()//读取int类型数据
public long readLong()//读取long类型数据
public char readChar()//读取char类型数据
public float readFloat()//读取float类型数据
public double readDouble()//读取double类型数据
public boolean readBoolean()//读取boolean类型数据
3.DataOutputStream:写数据。
成员方法:
public void readByte()//将byte类型数据写入基础输出流
public void readShort()//将short类型数据写入基础输出流
public void readInt()//将int类型数据写入基础输出流
public void readLong()//将long类型数据写入基础输出流
public void readChar()//将char类型数据写入基础输出流
public void readFloat()//将float类型数据写入基础输出流
public void readDouble()//将double类型数据写入基础输出流
public void readBoolean()//将boolean类型数据写入基础输出流
注意:读写顺序必须一致,否则会有问题。
内存操作流
1.内存操作流可以解决临时数据存储的问题。
2.操作字节数组:
public ByteArrayInputStream()
public ByteArrayOutputStream()
byte[] toByteArray() 将之前写入内存的流转换成字节数组
需求:给内存中写入数据。
package com.edu_01;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class ByteArrayOutputStreamDemo {
public static void main(String[] args) throws IOException {
//给内存中写数据public ByteArrayOutputStream()
ByteArrayOutputStream daos = new ByteArrayOutputStream();
//调用方法写数据
daos.write("hello".getBytes());
//byte[] toByteArray() 将之前写入内存的流转换成字节数组
byte[] bys=daos.toByteArray();
//读取数据
ByteArrayInputStream bais = new ByteArrayInputStream(bys);
int by;
while ((by=bais.read())!=-1) {
System.out.println((char)by);
}
//关流
daos.close();
bais.close();
}
}
输出:
h
e
l
l
o
3.操作字符数组:
CharArrayReader
CharArrayWrite
4.操作字符串:
StringReader
StringWriter
(操作字符数组和操作字符串的方法差不多)
打印流
1.打印流分类:
字节打印流:PrintStream
字符打印流:PrintWriter
2.打印流特点:
(1)只能操作目的地,不能操作数据源;
(2)可以操作任意数据类型的数据;
(3)如果利用构造方法开启了自动刷新,可以自动刷新;
PrintWriter(OutputStream out, boolean autoFlush)
PrintWriter(Writer out, boolean autoFlush)
注意:如果开启了自动刷新,只有在调用println、printf或者format其中一个方法才能实现自动刷新。
(4)可以操作文件的流。
需求:利用字符打印流给文件中书写数据。
package com.edu_01;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class PrintWriterDemo {
public static void main(String[] args) throws IOException {
//创建字符打印流对象,并开启自动刷新
//public PrintWriter(Writer out,boolean autoFlush)
PrintWriter pw = new PrintWriter(new FileWriter("d.txt"),true);
//println()这个方法:1.写数据 2.换行 3.刷新
pw.println("hello");
pw.println("world");
//可以操作任意类型的数据
pw.println(23);
pw.println(23.34);
//关流
pw.close();
}
}
运行结果:在d.txt文件内写入了数据。
注意:
println这个方法有三个作用:
(1)写入数据;
(2)换行;
(3)自动刷新缓冲区。
标准输入输出流
1.标准输入流:public static final InputStream in
此流已打开并准备提供输入数据。通常,此流对应于键盘输入或者由主机环境或用户指定的另一个输入源。
2.标准输出流:public static final PrintStream out
此流已打开并准备接受输出数据。通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标。
对于简单独立的 Java 应用程序,编写一行输出数据的典型方式是:
System.out.println(data)
注意:这两个都是System类下的字段。
合并流
1.合并流:SequenceInputStream类可以将多个输入流串流在一起,合并为一个输入流。
2.合并流的构造: SequenceInputStream(InputStream s1, InputStream s2) :将s1和s2合并成一个输入流,先读取s1后读取s2。
对象的序列化和反序列化
1.序列化流(ObjectOutputAtream):把对象按照流一样的方式写到文件中或者在网络中传输。
writeObject(Object obj)//将指定的对象写入ObjectOutputStream
2.反序列化流(ObjectInputStream):把文件或者网络中的流对象数据还原成对象。
Object readObject()//从 ObjectInputStream读取对象
3.如何实现序列化:
对象所属类通过实现Serializable接口来启动其序列化功能。没有实现这个接口的类无法使其任何状态序列化或反序列化,会报异常:java.io.NotSerializableException。
Properties
1.Properties(本质上是一个Map集合):Properties属性列表中每个键及其对应值都是一个字符串。
2.Properties特点:可以保存在流中或从流中加载。
3.Properties的特有功能:
public Object setProperty(String key,String value)//添加元素,调用 Hashtable 的方法 put
public String getProperty(String key)//用指定的键在此属性列表中搜索属性
public Set<String> stringPropertyNames()//返回此属性列表中的键集(字符串类型)
4.Properties的遍历:
(1)因为它本质上是一个Map集合,所以可以用Map集合的遍历方法(通过键找值)。
Set<Object> keys = prop.keySet();
for (Object key : keys) {
System.out.println(key+":"+prop.get(key));
}
(2)用stringPropertyNames()方法获取键集,进行遍历。
Set<String> keys = prop.stringPropertyNames();
for (String key : keys) {
System.out.println(key+":"+prop.getProperty(key));
}
需求:使用它的特有功能添加元素并遍历。
package com.edu_08;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
import java.util.Set;
public class PropertiesDemo2 {
public static void main(String[] args) throws IOException, IOException {
Properties prop = new Properties();
//添加元素
prop.setProperty("zas","21");
prop.setProperty("efe","22");
prop.setProperty("wee","24");
prop.setProperty("ttt","23");
//将文件中的元素存储到集合中
prop.load(new FileReader("h.txt"));
//集合中的文件存储到文本文件中
prop.store(new FileOutputStream("g.txt"),null);
//遍历
Set<String> keys = prop.stringPropertyNames();
for (String key : keys) {
System.out.println(key+":"+prop.getProperty(key));
}
}
}
5.Properties和IO流结合使用:
(1)把文件中的数据加载到集合中:
public void load(InputStream inStream)//从输入流中读取属性列表(键和元素对)
public void load(Reader reader)//从输入字符流中读取属性列表(键和元素对)
注意:文件中的数据必须是键值对象形式的。
(2)把集合中的元素存储到文本文件中:
public void store(OutputStream out,String comments)//将此 Properties 表中的属性列表(键和元素对)写入输出流
public void store(Writer writer,String comments)//将此 Properties 表中的属性列表(键和元素对)写入输出字符