其他流
数据输入输出流:
- 数据输入流: DataInputStream
- 数据输出流: DataOutputStream
- 特点: ,可以读写基本数据类型
内存操作流:
构造方法:public ByteArrayOutputStream()
1、操作字节数组
ByteArrayOutputStream
ByteArrayInputStream
此流关闭无效,所以无需关闭
2、操作字符数组
CharArrayWrite
CharArrayReader
3、操作字符串
StringWriter
StringReader
打印流:
特点:
1、打印流只能操作目的地,不能操作数据源(不能进行读取数据)
2、可以操作任意数据类型的数据 调用print() 方法可以写任意数据类型
3、可以直接对文件进行操作
标准输入输出流:
public static final InputStream in: 标准输入流,对应的设备是键盘
public static final PrintStream out: 标准输出流,对应的设备就是显示器
System.in的类型是:InputStream.
System.out的类型是:PrintStream为OutputStream的孙子类
随机访问流:
RandomAccessFile:能读能写
RandomAccessFile类不属于流,是Object类的子类。
它融合了InputStream和OutputStream的功能;
支持对随机访问文件的读取和写入;
可以用来读取数据也可以用来写数据,可以操作任意数据类型的数据;
序列化流和反序列化流:
序列化:把对象通过流的方式存储到文件中(要重写Serializable 接口)
反序列化:把文件中存储的对象以流的方式还原成对象
序列化流: ObjectOutputStream
反序列化流: ObjectInputStream
private transient int age ;// 可以阻止成员变量的序列化使用transient
Properties类:
特点:
1、父类是Hashtable,属于双列集合,这个集合中的键和值都是字符串 Properties不能指定泛型
2、可保存在流中或从流中加载,属性列表中每个键及其对应值都是一个字符串
特殊功能:
public Object setProperty(String key,String value)
public String getProperty(String key)
public Set<String> stringPropertyNames()
public void load(Reader reader): 读取键值对数据把数据存储到Properties中
public void store(Writer writer, String comments)把Properties集合中的键值对数据写入到文件中, comments注释
SequenceInputStream 流:将两个流拼接在一起
从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取。
依次类推,直到到达包含的最后一个输入流的文件末尾为止
构造方法:
1、SequenceInputStream(InputStream s1, InputStream s2)
通过记住这两个参数来初始化新创建的 SequenceInputStream(将按顺序读取这两个参数,先读取 s1,然后读取 s2),
以提供从此 SequenceInputStream 读取的字节。
2、SequenceInputStream(Enumeration<? extends InputStream> e)
通过记住参数来初始化新创建的 SequenceInputStream,该参数必须是生成运行时类型为 InputStream 对象的 Enumeration 型参数。
程序小练习:
1、编写程序,通过打印流完成复制文本文件
public class test5 {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new FileReader("D:\\demo2\\蓝莲花.mp3"));
PrintWriter out = new PrintWriter(new FileWriter("C:\\demo\\蓝莲花.mp3"));
String line;
while ((line=in.readLine())!=null){
out.print(line);
}
in.close();
out.close();
}
}
2、编写程序,通过序列化流与反序列化流完成从file.txt文件存取对象的操作
public class test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
student student1 = new student("虹猫",12);
student student2 = new student("蓝兔",13);
student student3 = new student("大奔",15);
ArrayList<student> list = new ArrayList<student>();
list.add(student1);
list.add(student2);
list.add(student3);
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("c.txt"));
out.writeObject(list);
ObjectInputStream in = new ObjectInputStream(new FileInputStream("c.txt"));
Object object = in.readObject();
ArrayList<student> list1=(ArrayList<student>) object;
for (student s : list1) {
System.out.println(s.getName()+"=="+s.getAge());
}
}
}
class student implements Serializable {
private String name;
private int age;
public student() {
}
public student(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
}
3、需求:我有一个文本文件file.txt,我知道数据是键值对形式的,但是不知道内容是什么。
请写一个程序判断是否有"lisi"这样的键存在,如果有就改变其实为"100"
file.txt文件内容如下:
zhangsan = 90
lisi = 80
wangwu = 85
public class test {
public static void main(String[] args) throws IOException {
// 需求:我有一个文本文件,我知道数据是键值对形式的,但是不知道内容是什么。
// 请写一个程序判断是否有“lisi”这样的键存在,如果有就改变其值为”100”
File file = new File("d.txt");
file.createNewFile();
Properties properties = new Properties();
properties.load(new FileReader("d.txt"));
Set<String> a=properties.stringPropertyNames();
for (String s : a) {
if (s.equals("list")){
properties.setProperty("list","100");
}
}
String k=properties.getProperty("list");
System.out.println(k);
properties.store(new FileWriter("d.txt"),null);
}
}
4、将一个文件复制多份
public class test1 {
public static void main(String[] args) throws IOException {
//作业:将一个文件复制两份
Scanner sc = new Scanner(System.in);
System.out.println("请输入想要复制的音乐名:");
String s=sc.nextLine();
System.out.println("请输入复制的次数:");
int n=sc.nextInt();
for (int i = 1; i <=n ; i++) {
FileInputStream in = new FileInputStream("E:\\yinyue\\"+s+".mp3");
FileOutputStream out = new FileOutputStream("D:\\AAA\\"+s+i+".mp3");
byte[] bytes = new byte[1024*8];
int len=0;
while ((len=in.read(bytes))!=-1){
out.write(bytes,0,len);
}
}
}
}
5、将两首歌拼成一首歌
public class test2 {
public static void main(String[] args) throws IOException {
FileInputStream in1 = new FileInputStream("上海滩.mp3");
FileInputStream in2 = new FileInputStream("蓝莲花.mp3");
FileOutputStream out = new FileOutputStream("歌曲大联唱.mp3");
ArrayList<FileInputStream> list = new ArrayList<>();
list.add(in1);
list.add(in2);
byte[] bytes = new byte[1024 * 8];
int len = 0;
for (FileInputStream in : list) {
while ((len = in.read(bytes)) != -1) {
out.write(bytes, 0, len);
}
in.close();
}
out.close();
}
}