IO流(三)

Properties集合:是Map集合

Properties 类表示了一个持久的属性集

Properties 可保存在流中或从流中加载

特点:

1,该集合中的键和值都是字符串类型。

2,集合中的数据可以保存到流中,或者从流获取。

通常该集合用于操作以键值对形式存在的配置文件。

方法:

setProperty(key,value);修改

propertyNames():返回所有键的枚举

stringPropertyName():返回此属性列表中的键集

Properties集合和流对象相关联

list(PrintWriter out); 将属性列表输出到指定的输出流。

将集合中的字符串键值信息持久化存储到文件中。

void store(OutputStream out, String comments)

void store(Writer writer, String comments)

参数String comments对信息进行描述,是注释信息,不能写中文

将硬盘中已有的键值对信息放到集合中进行操作

void load(Reader reader)

void load(InputStream inStream)

package properties;import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
import java.util.Set;public class PropertiesDemo {public static void main(String[] args) throws IOException {//演示Properties集合中的方法methodDemo_1()methodDemo_2()methodDemo_3()methodDemo_4();myLoad();test();}// Properties集合的存和取。public static void methodDemo_1(){//创建一个Properties集合。Properties prop  = new Properties();//存储元素。 prop.setProperty("zhangsan","30");prop.setProperty("lisi","31");prop.setProperty("wangwu","36");prop.setProperty("zhaoliu","20");//修改元素。(就是键相同,值覆盖) prop.setProperty("wangwu","26");//取出所有元素。//Enumeration<?> propertyNames()返回的是所有键的枚举(类似于keySet),现在一般不用了,//所以用stringPropertyName()方法    返回此属性列表中的键集Set<String> names = prop.stringPropertyNames();for(String name : names){String value = prop.getProperty(name);System.out.println(name+":"+value);}}/*** 演示Properties集合和流对象相结合的功能。* list作为了解,他的参数是输出流(字节)* 一般是调试* list(PrintStream out)*/public static void methodDemo_2(){Properties prop  = new Properties();//存储元素。 prop.setProperty("zhangsan","30");prop.setProperty("lisi","31");prop.setProperty("wangwu","36");prop.setProperty("zhaoliu","20");prop = System.getProperties();prop.list(System.out);//将存储的元素打印出来了}/*** 将集合中的字符串键值信息持久化存储到文件中。*  String comments对信息进行描述,不能写中文*  存到文档里以井号打头的都是注释信息* @throws IOException*/public static void methodDemo_3() throws IOException {Properties prop  = new Properties();//存储元素。 prop.setProperty("zhangsan","30");prop.setProperty("lisi","31");prop.setProperty("wangwu","36");prop.setProperty("zhaoliu","20");//想要将这些集合中的字符串键值信息持久化存储到文件中。//需要关联输出流。这用的是字节FileOutputStream fos = new FileOutputStream("info.txt");//这用的是字符流
//      FileWriter fw=new FileWriter("info.txt");//将集合中数据存储到文件中,使用store方法。prop.store(fos, "info");fos.close();}/*** 将硬盘中已有的键值对信息放到集合中进行操作* @throws IOException*/public static void methodDemo_4() throws IOException { Properties prop  = new Properties();//集合中的数据来自于一个文件。 //注意;必须要保证该文件中的数据是键值对。//需要使用到读取流。 FileInputStream fis = new FileInputStream("info.txt");//使用load方法。 prop.load(fis);prop.list(System.out);}//模拟一下load方法。(作为了解掌握)public static void myLoad() throws IOException{Properties prop  = new Properties();BufferedReader bufr = new BufferedReader(new FileReader("info.txt"));String line = null;while((line=bufr.readLine())!=null){//不是所有的信息都是我想要的,井号开头的都是注释信息if(line.startsWith("#"))continue;String[] arr = line.split("=");//         System.out.println(arr[0]+"::"+arr[1]);prop.setProperty(arr[0], arr[1]);}prop.list(System.out);bufr.close();}//对已有的配置文件中的信息进行修改。 /** 读取这个文件。* 并将这个文件中的键值数据存储到集合中。* 在通过集合对数据进行修改。* 在通过流将修改后的数据存储到文件中。 */public static void test() throws IOException{//读取这个文件。File file = new File("info.txt");if(!file.exists()){//如果文件不存在,建一个file.createNewFile();}//这个是读取已关联的file文件FileReader fr = new FileReader(file);//创建集合存储配置信息。Properties prop = new Properties();//将流中信息存储到集合中。prop.load(fr);prop.setProperty("wangwu", "16");//新建了一个file文件FileWriter fw = new FileWriter(file);//将文件存储到集合中prop.store(fw,"");fw.close();fr.close();}}

打印流

PrintWriter和PrintStream

PrintStream:

1,提供了打印方法可以对多种数据类型值进行打印。并保持数据的表示形式。

2,它不抛IOException.

构造函数,接收三种类型的值:

1,字符串路径。

2,File对象。

3,字节输出流。

4.可带自动刷新,当自动刷新时,可以指定字符编码。

特点:

1,当操作的数据是字符时,可以选择PrintWriter,比PrintStream要方便。

2,它的构造函数可以接收 File对象,字符串路径,字节输出流,字符输出流。

3,构造函数中,如果参数是输出流,那么可以通过指定另一个参数true完成自动刷新,该true对println方法有效。

PrintStream:

1,提供了打印方法可以对多种数据类型值进行打印。并保持数据的表示形式。

2,它不抛IOException.

构造函数,接收三种类型的值:

1,字符串路径。

2,File对象。

3,字节输出流。

4.可带自动刷新

特点:

1,构造函数接收File对象,字符串路径,字节输出流。意味着打印目的可以有很多。

2,该对象具备特有的方法 打印方法 print println,可以打印任何类型的数据。

3,特有的print方法可以保持任意类型数据表现形式的原样性,将数据输出到目的地。

对于OutputStream父类中的write,是将数据的最低字节写出去。

什么时候用?

当需要保证数据表现的原样性时,就可以使用打印流的打印方法来完成,这样更为方便。

PrintWriter和PrintStream的区别:

PrintWriter当启动了自动刷新,只用在调用println,printf或者format方法时,才可以完成刷新动作

PrintWriter不可以指定字符编码

package IO;import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;public class PrintDemo {public static void main(String[] args) throws IOException {PrintWriter();PrintStream();}private static void PrintStream() throws IOException {//写入指定文件中PrintStream out = new PrintStream("print.txt");out.write(610);//只写最低8位,out.print(97);//将97先变成字符保持原样将数据打印到目的地。 out.close();}private static void PrintWriter() throws IOException {//获取键盘录入BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));//写入指定文件中PrintWriter out = new PrintWriter(new FileWriter("out.txt"),true);//自动刷新String line =  null;while((line=bufr.readLine())!=null){if("over".equals(line))break;out.println(line.toUpperCase());}out.close();bufr.close();}}

序列流:

SequenceInputStream,将多个字节读取流和并成一个读取流,将多个源合并成一个源,操作起来方便。

构造方法:

SequenceInputStream(InputStream s1,InputStream s2);

SequenceInputStream(Enumeration<? extends InputStream> e);

将1.txt 2.txt 3.txt文件中的数据合并到一个文件中。

package IO;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Vector;public class SequenceInputStreamDemo {public static void main(String[] args) throws IOException {// TODO Auto-generated method stub/*方式一Vector<FileInputStream> v = new Vector<FileInputStream>();     v.add(new FileInputStream("1.txt"));v.add(new FileInputStream("2.txt"));v.add(new FileInputStream("3.txt"));Enumeration<FileInputStream> en = v.elements();*///方式二ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();for(int x=1; x<=3; x++){al.add(new FileInputStream(x+".txt"));}//枚举Enumeration<FileInputStream> en = Collections.enumeration(al);//序列流SequenceInputStream sis = new SequenceInputStream(en);FileOutputStream fos = new FileOutputStream("1234.txt");byte[] buf = new byte[1024];int len = 0;while((len=sis.read(buf))!=-1){fos.write(buf,0,len);}fos.close();sis.close();}}

对象的序列化和反序列化。

ObjectInputStream反序列化 和 ObjectOutputStream:序列化

被操作的对象要实现Serializable接口,Serializable:用于给被序列化的类加入ID号。用于判断类和对象是否是同一个版本。

静态数据不会被序列化

非静态数据不想被序列化,可以使用transient关键字修饰

ObjectInputStream对使用ObjectOutputStream写入的基本数据和对象进行反序列化

package bean;import java.io.Serializable;public class Person implements Serializable/*标记接口*/ {static final long serialVersionUID = 9527l;//添加一个IDprivate transient String name;//不被序列化public static int age;public Person(String name, int age) {super();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;}}
package IO;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;import cn.itcast.io.p2.bean.Person;public class ObjectStreamDemo {public static void main(String[] args) throws IOException, ClassNotFoundException {//       writeObj();readObj();}public static void readObj() throws IOException, ClassNotFoundException {ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.object"));//对象的反序列化。 Person p = (Person)ois.readObject();System.out.println(p.getName()+":"+p.getAge());ois.close();}public static void writeObj() throws IOException, IOException {ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.object"));//对象序列化。  被序列化的对象必须实现Serializable接口。 oos.writeObject(new Person("小强",30));oos.close();}}

RandomAccessFile:

特点:

1,即可读取,又可以写入。

2,内部维护了一个大型的byte数组,通过对数组的操作完成读取和写入。

3,通过getFilePointer方法获取指针的位置,还可以通过seek方法设置指针的位置。

4,该对象的内容应该封装了字节输入流和字节输出流。

5,该对象只能操作文件。

通过seek方法操作指针,可以从这个数组中的任意位置上进行读和写,可以完成对数据的修改。

但是要注意:数据必须有规律。

package IO;import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;public class RandomAccessFileDemo {public static void main(String[] args) throws IOException {//        writeFile();
//      readFile();randomWrite();}public static void randomWrite() throws IOException{RandomAccessFile raf = new RandomAccessFile("ranacc.txt", "rw");//往指定位置写入数据。raf.seek(3*8);raf.write("哈哈".getBytes());raf.writeInt(108);raf.close();}public static void readFile() throws IOException {RandomAccessFile raf = new RandomAccessFile("ranacc.txt", "r");//通过seek设置指针的位置。raf.seek(1*8);//随机的读取。只要指定指针的位置即可。 byte[] buf = new byte[4];raf.read(buf);String name = new String(buf);int age = raf.readInt();System.out.println("name="+name);System.out.println("age="+age);System.out.println("pos:"+raf.getFilePointer());raf.close();}//使用RandomAccessFile对象写入一些人员信息,比如姓名和年龄。public static void writeFile() throws IOException{//如果文件不存在,则创建,如果文件存在,不创建 RandomAccessFile raf = new RandomAccessFile("ranacc.txt","rw");raf.write("张三".getBytes());raf.writeInt(97);raf.write("小强".getBytes());raf.writeInt(99);
//      raf.close();}}

管道流:需要和多线程技术相结合的流对象。

管道流连接的两种方式:

一、通过构造函数连接

二、通过connect方法连接

package IO;import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;public class PipedStream {public static void main(String[] args) throws IOException {//通过构造方法连接
//      PipedInputStream input = new PipedInputStream();
//      PipedOutputStream output = new PipedOutputStream(input);//通过connect方法连接PipedInputStream input = new PipedInputStream();PipedOutputStream output = new PipedOutputStream();input.connect(output);new Thread(new Input(input)).start();new Thread(new Output(output)).start();}}class Input implements Runnable{private PipedInputStream in;Input(PipedInputStream in){this.in = in;}public void run(){try {byte[] buf = new byte[1024];int len = in.read(buf);String s = new String(buf,0,len);System.out.println("s="+s);in.close();} catch (Exception e) {}}
}class Output implements Runnable{private PipedOutputStream out;Output(PipedOutputStream out){this.out = out;}public void run(){try {Thread.sleep(500);out.write("hi,管道来了!".getBytes());} catch (Exception e) {}}
}

用操作基本数据类型值的对象。

DataInputStream

DataOutputStream

注意的方法:

writeUTF(String s):将数据用UTF-8修改版写入目的地

package IO;import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;import java.io.FileOutputStream;
import java.io.IOException;public class DataSteamDemo {public static void main(String[] args) throws IOException {//        writeData();readData();}public static void readData() throws IOException {DataInputStream dis = new DataInputStream(new FileInputStream("data.txt"));String str = dis.readUTF();System.out.println(str);}public static void writeData() throws IOException {DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.txt"));dos.writeUTF("你好");dos.close();}}

设备是内存的流对象。

操作字节数组的流 ByteArrayInputStream ByteArrayOutputStream

操作字符数组的流 CharArrayReader  CharArrayWriter

操作字符串数组的流 StringReaderStringWriter

编码与解码:

字符串 --> 字节数组:编码。

字节数组 --> 字符串:解码。

如果编错了,解不出来。如果编对了,解错了,有可能有救。

package IO;import java.io.UnsupportedEncodingException;public class EncodeDemo {public static void main(String[] args) throws UnsupportedEncodingException {// TODO Auto-generated method stubString str = "你好";//编码;byte[] buf = str.getBytes("UTF-8");//解码:String s1 = new String(buf,"UTF-8");System.out.println("s1="+s1);}}

Java基础之IO流(三)相关推荐

  1. 【Java基础】· IO流习题详解

    写在前面 Hello大家好, 我是[麟-小白],一位软件工程专业的学生,喜好计算机知识.希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正!谢谢大家!!! ...

  2. Java基础学习—— IO流

    Java基础学习-- IO流 1 文件 1.1 文件的创建 1.2 文件常用的方法 2 IO流 2.1 FileInputStream 2.2 FileOutputStream 2.3 文件的拷贝 2 ...

  3. Java基础进阶IO流概述

    1.IO流,什么是IO? I : Input O : Output 通过IO可以完成硬盘文件的读和写. 2.IO流的分类? 有多种分类方式: 一种方式是按照流的方向进行分类: 以内存作为参照物 往内存 ...

  4. 【Java基础】IO流概述分类、字节流写数据、字节流写数据的三种方式及写数据的两个小问题

    目录 一.IO流概述和分类 二.字节流写数据 三.字节流写数据的三种方式 四.字节流写数据的两个小问题 一.IO流概述和分类 IO流介绍: ● IO:输入/输出(Input/Output) ● 流:是 ...

  5. Java基础之IO流(一)

    IO流(一) IO流:输入输出的流动 IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的对象都在IO包中 流按操作数据分为两种:字节流与字符流 . 流按流向分为 ...

  6. java基础之 IO流

    javaIO流 IO流 : (input  output) 输入输出流 :输入 :将文件读到内存中 输出:将文件从内存输出到其他地方. IO技术的作用:主要就是解决设备和设备之间的数据传输问题.比如: ...

  7. Java基础之IO流操作

    第14章 File类与IO流 主要内容 File类 字节流 字符流 文件流 缓冲流 转换流 数据流 对象流 打印流 Scanner与System与IO流 教学目标 使用File类对象表示文件或目录 能 ...

  8. JAVA基础学习day21--IO流三-File、Properties、PrintWriter与合并、分割流

    一.File 1.1.File概述 文件和目录路径名的抽象表示形式. 用户界面和操作系统使用与系统相关的路径名字符串 来命名文件和目录.此类呈现分层路径名的一个抽象的.与系统无关的视图.抽象路径名 有 ...

  9. java io流操作_【Java基础】IO流操作

    一.IO流概念: 输入输出流,也就是可以用来读写数据,以及上传下载数据. 二.分类: 1.从流的对象来分:   1)高端流:所有程序或者内存中的流都称为高端流. 2)低端流:所有外界设备中的流都是低端 ...

最新文章

  1. 简单的Java SSH客户端
  2. mybatis萌新基础
  3. DWR实现服务器端向客户端推送消息
  4. 基于上下文的访问控制与基于区域策略的防火墙
  5. [转]ETL模型设计
  6. Angular服务器端渲染
  7. promise的理解和使用-尚硅谷教程笔记
  8. 后台管理系统PRD该怎么写?
  9. 【渝粤教育】广东开放大学 经济法基础 形成性考核 (38)
  10. 爬虫【11】易班刷网薪系统
  11. js 判断移动终端浏览器版本信息
  12. 给俺的女神翠花发邮件告白,我学会了这些网络基础知识
  13. B2C 和 C2C 你们是怎么区别的?
  14. 金融风控-贷款违约预测项目记录
  15. 1-丁基-3-甲基咪唑醋酸盐[Bmim][Ac]|离子液体1,1,3,3,-四甲基胍乳酸盐TMGL
  16. 写给初学者的6条网页设计安全配色指南
  17. 自己封装的1200,1500PLC通过工艺轴方式控制伺服电机的FB块
  18. OpenCV开发笔记(五十七):红胖子8分钟带你深入了解直方图反向投影(图文并茂+浅显易懂+程序源码)
  19. Kubernetes(K8S)各种错误及解决方法
  20. 【Vue】- created()方法

热门文章

  1. 报错解决——RuntimeError: The size of tensor a (4) must match the size of tensor b (3) at non-singleton
  2. SQL count详细用法
  3. 计算机二级office高级应用试题,2016年计算机二级office高级应用练习题
  4. AD中怎样修改原理图图纸大小
  5. 数二第一章函数、极限、连续做题总结
  6. 用html做祝福语朋友,朋友祝福语大全简短
  7. EXCEL操作视频集1-10
  8. 水果分割论文、代码和数据集汇总
  9. OmniPeek tools install and setting
  10. CSC7715 同步整流