流(IO)

四个基本流:  

  InputStream(输入字节流)、OutputStream(输出字节流)、writer(输出字符流)、reader(输入字符流)-四个基本流都是抽象类不能实例化,固只能用其子类;
    注意:流结束后一定要关流(close())和将引用设为null;以便被GC回收。

流的一般异常处理:
    1. 流对象要外置定义内置初始化
    2. 判断流对象是否初始化成功---判断流对象是否为空
    3. 关流操作无论成功与否,都需要将流对象值为null

    // 流对象需要外置定义内置初始化
FileWriter writer = null;
try {
writer = new FileWriter("E:\\b.txt");
writer.write("bbb"); } catch (IOException e) {
e.printStackTrace();
} finally {
//需要判断流对象是否为空,以防对象初始化失败出现空指针异常
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
writer = null;
}
}
}

字符流:
    FileWriter(String name):传入文件路径,创建新文件。

// 需要准备一个流对象---布尔值表示是否向文件中追加内容
FileWriter writer = new FileWriter("E:\\a.txt",true); // 利用write方法向文件中写入数据
// 数据不是直接写到文件中而是写到了缓冲区中
// 当缓冲区没有满的时候,数据不会写到文件中
// 程序一旦结束,数据死在了缓冲区中
writer.write("aaa\r\n"); // 冲刷缓冲区
// writer.flush(); // 关闭流
//流在关闭之前会自动冲刷一次缓冲区以防有数据死在缓冲区中
//流在关闭之后并没有被销毁,只是不能再次使用
writer.close();
System.out.println(writer);
writer = null;

  FileReader(String name):传入文件路径,读取文件

 //创建一个输入流对象
FileReader reader = new FileReader("D:\\a.txt");
//定义一个变量来记录读取的数据
int len = -1;
while((len = raeder.read()) != -1){
System.out.println((char)len);
} //需要一个数组来作为盛放读出的数据容器
char[] char = new char[1024];
//定义一个变量来记录读出的数据保存在数组的数
int len = -1;
//将数据读取到char数组中。读到末尾返回的是-1则表示读完了
while((len = rader.read(char))!=-1){
//将char数组中的数据拿出来拼接成一个字符串并打印
System.out.println(new String(char,0,len));
}
reader.close();
reader = null;

  两个缓冲流:BuffReader、BufferedWriter---->主要的作用提供缓冲区

  BuffReader:从字符输入流中来获取数据;Reader对象来指名数据的具体来源.(需要传入字符流);

 //BufferedReader需要一个字符输入流对象---字符输入流指名数据的具体来源,BufferedReader从流中来获取数据,然后提供一个缓冲区
BufferedReader br = new BufferedReader(new FileReader("D:\\a.txt")); //来定义一个变量来记录每一行的数据
String line = null; //读取文件
while((line = br.readLine()) != null){
System.out.println(line);
} br.close();

  BufferWriter:主要是提供了newLine这个方法。方便开发时换行在不同的平台实现相同的换行效果。只有BufferWriter这个对象才有newLine方法。

字节流:  InputStream:输入字节流【如文件不存在时会自动创建,若文件存在则会被新创建的文件所覆盖】
          |--FileInputStream(子类)

 FileInputStream fis = new FileInputStream("D:\\a.txt");
int len = -1;
byte[] by = new byte[1024*1024];
while((len = fis.raeder(by))!=-1){ //将数据读取到字节数组内。
System.out.println(by,0,len);
}

  OutputStream:输出字节流【如文件不存在时会自动创建,若文件存在则会被新创建的文件所覆盖】
          |--FileOutputStream(子类)

 //准备了一个输出流来向文件中写入数据
FileOutputStream fos = new FileOutputStream("E:\\c.txt"); //创建一个Scanner对象
Scanner s = new Scanner(System.in);
String str = s.nextLine();
s.close(); //写出数据---字节流没有缓冲区
fos.write(str.getBytes()); //关流
fos.close();

  转换流:

    OutputStreamWriter:将字节输出流转换成字符输出流。

 //创建了一个流对象---没有指定编码的时候,采用的是系统平台码
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("E:\\d.txt"),"utf-8"); //写出数据
osw.write("达内大数据~~~"); //关流
osw.close();

    InputStreamReader:将字节输入流转换成字符输入流

 //创建一个输入流对象
InputStreamReader isr = new InputStreamReader(new FileInputStream("E:\\d.txt"), "utf-8"); //创建一个缓冲流
BufferedReader br = new BufferedReader(isr); //记录每行的数据
String line = null; //读取数据
while((line = br.readLine()) != null){
System.out.println(line);
} //关流
br.close();

  系统流:
          System.out   标准输出流
          System.in     标准输入流
          System.err    标准错误流

  打印流:
          PrinteWriter:是一个输出流

 // 创建打印流对象
PrintWriter pw = new PrintWriter("D:\\a.txt"); // 写出数据
// pw.write("aaa"); // 打印数据
pw.print("aaaa");
pw.println(1.234);
// 打印对象的时候,默认调用了这个对象的toString方法
pw.println(new A()); pw.println("bbbb"); // System.out.println(); // 关流
pw.close();

  合并流:
          关键字:SequenceInputStream

 //创建三个流对象指向三个文件
FileInputStream f1 = new FileInputStream("E:\\a.txt");
FileInputStream f2 = new FileInputStream("E:\\b.txt");
FileInputStream f3 = new FileInputStream("E:\\c.txt"); //创建 一个向量对象
//Vector是List的一个实现类,是最早期的列表,在List之前产生的
Vector<InputStream> vector = new Vector<InputStream>(); //将流添加到集合中
vector.add(f1);
vector.add(f2);
vector.add(f3); //利用集合产生枚举对象
Enumeration<InputStream> e = vector.elements(); //创建合并流对象
SequenceInputStream sis = new SequenceInputStream(e); //读取数据
BufferedReader br = new BufferedReader(new InputStreamReader(sis)); //记录每一行的数据
String line = null; //读取数据
while((line = br.readLine()) != null){
System.out.println(line);
} //关流
br.close();

  序列化和反序列化:
          ObjectOutputStream:是个输出流。----序列化

 //实例化一个对象(对象中自己的基本信息)
Person p = new Person; //创建一个序列化流
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\test.txt")); //序列化对象;writerObject 写入的是一个对象。
oos.writerObject(p); //关流
oos.close();

    ObjectInputStream:是个输入流。 ---反序列化

 //创建反序列化流
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\test.txt")); //反序列化对象;从 ObjectInputStream 读取对象。 返回是个Object
Person person = (Person)ois.readObject; //关流
ois.close(); //测试;输出Person对象中需要的基本信息
System.ou.println(person.name+","+person.age);

  Properties
          Properties本质上是一个映射,继承了Hashtable类。---可持久的映射。---将映射保存到 properties文件中。
          Properties中键值对的类型都是String。
          properties文件中不能直接存储中文,一旦输入中文会将中文转化成对应的编码
        
          HashMap---默认的初始大小是16,加载因子是0.75f---扩容,扩容一倍---是一个异步式线程不安全的映射---允许一个键为null,允许值为null
          Hashtable---默认的初始大小是11,加载因子是0.75f;每次不是一倍---是一个同步式线程安全的映射---不允许键值为空
          ConcurrentHashMap---是一个异步式线程安全的映射

    下面的代码是序列化Properties

 //创建properties对象
Properties prop = new Properties(); //添加键值对---键值的类型只能是String类型
prop.put("name", "wade");
prop.setProperty("age", "15");
prop.setProperty("gender", "Male"); //将prop对象序列化到硬盘上
//第一个参数需要的是一个流对象
//第二个参数需要一个字符串---注释
prop.store(new FileWriter("person.properties"), "This is a person .");

    下面的代码是反序列化Properties

 //创建一个properties对象
Properties p = new Properties(); //需要将对象反序列化回来
p.load(new FileInputStream("person.properties")); //根据键来获取值
System.out.println(p.get("name")); //给了一个默认值,如果这个键不存在或者没有对应的值,那么返回默认值;反之返回对应值
System.out.println(p.getProperty("hobby","打篮球!!!"));

Java篇:IO流的更多相关文章

  1. Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream)

    Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在我们学习字 ...

  2. Java 的 IO 流

    接着上一篇的 “Java 的 File 类” 的随笔,在File类的基础上,我们就走进Java的IO流吧. 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在 ...

  3. java的IO流

    java的IO流继承四大抽象类分别是字节流 inputStream outputStream与字符流 read write.怎么理解记忆很重要. 直接连接读写对象的是结点流,例如对文件读取字节类的名字 ...

  4. Java基础——IO流

    今天刚刚看完java的io流操作,把主要的脉络看了一遍,不能保证以后使用时都能得心应手,但是最起码用到时知道有这么一个功能可以实现,下面对学习进行一下简单的总结: IO流主要用于硬板.内存.键盘等处理 ...

  5. 【Java】IO流简单分辨

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827509.html Java的IO流体系十分庞大,并且体系层次稍复杂,很容易记混或记错.在此,我把平时经常用 ...

  6. Java - 文件(IO流)

    Java - 文件 (IO)   流的分类:     > 文件流:FileInputStream | FileOutputStream | FileReader | FileWriter     ...

  7. Java中IO流的总结

    有关Java中IO流总结图 流分类 按方向分 输入流 输出流 按单位分 字节流 字符流 按功能分 节点流 处理流(过滤流) 其他 所有的流继承与这四类流:InputSteam.OutputStream ...

  8. JAVA中IO流总结

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42119261 我想你对JAVA的IO流有所了解,平时使用的 ...

  9. 第15章-输入/输出 --- 理解Java的IO流

    (一)理解Java的IO流 JAVA的IO流是实现输入/输出的基础,它可以方便地实现数据的输入/输出操作,在Java中把不同的输入/输出(键盘.文件.网络连接等)抽象表述为"流"( ...

  10. Java基础IO流(二)字节流小案例

    JAVA基础IO流(一)https://www.cnblogs.com/deepSleeping/p/9693601.html ①读取指定文件内容,按照16进制输出到控制台 其中,Integer.to ...

随机推荐

  1. ACM2112迪克斯特算法

    HDU Today Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区50 ...

  2. Hbase万亿级存储性能优化总结

    背景 hbase主集群在生产环境已稳定运行有1年半时间,最大的单表region数已达7200多个,每天新增入库量就有百亿条,对hbase的认识经历了懵懂到熟的过程.为了应对业务数据的压力,hbase入 ...

  3. jQuery中 $.extend 和 $.fn.extend 作用及区别

    jQuery为开发插件提拱了两个方法,分别是: 1. jQuery.fn.extend(); 2. jQuery.extend(); 虽然 javascript没有明确的类的概念,但是可以构建类似类的 ...

  4. ZooKeeper观察者(十三)

    观察者:扩展ZooKeeper而不影响写性能 尽管ZK运行地很好通过客户端直接连接来投票集群的成员,这个结构使它很难扩展出很多客户端.问题是当我们加入更多的投票成员时,写性能就会下降.这是因为一个写操 ...

  5. 【Tools】Windows下Github的配置和使用

    1.在网址:http://windows.github.com/下载git软件,具体的安装步骤可以参见:Windows 系统下Git安装图解 2.同样根据上面的教程生成SSH key: 3.将publ ...

  6. UVA 11440 Help Tomisu

    https://vjudge.net/problem/UVA-11440 题意: 求2——n! 之间有多少个整数x,满足x的所有素因子都大于m 保证m<=n x的所有素因子都大于m 等价于 x和 ...

  7. [Luogu 2221] HAOI2012 高速公路

    [Luogu 2221] HAOI2012 高速公路 比较容易看出的线段树题目. 由于等概率,期望便转化为 子集元素和/子集个数. 每一段l..r中,子集元素和为: \(\sum w_{i}(i-l+ ...

  8. Asp.Net Web Forms/MVC/Console App中使用Autofac

    本来简单介绍了Autofac在Asp.Net Web Forms中的应用,后来又添加了mvc.控制台应用程序中使用Autofac,详情请看源码. ASP.NET Web Forms使用Autofac, ...

  9. Linux powercli 以及connect-viserver 连接问题

    1. 参考文档 http://fdo-workspace.blogspot.hk/2017/07/powershell-powercli-for-linux-server.html 2. powers ...

  10. Transformation(线段树+HDU4578+多种操作+鬼畜的代码)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578 题目: 题意:n个数初始值为0,进行四种操作:1.将区间内的数字加c:2.将区间内的数字乘c:3 ...