IO流(高级)

释放资源的标准代码

主要考虑的是在什么时候释放资源比较合适.而且在jdk1.7之前和之后是不同的.

package com.wzlove.demo;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; /**
* 标准的IO格式处理
*
* @author WZLOVE
* @create 2018-07-23 9:54
*/
public class StandardIO { // jdk7之前
public static void main(String[] args) { // 初始赋值为null
FileReader fr = null;
FileWriter fw = null; try {
// 创建字符流对象
fr = new FileReader("student.txt");
fw = new FileWriter("student.txt"); // 操作资源(边读编写,耗资源,仅作为示例)
int len;
while((len = fr.read()) != -1){
fw.write((char) len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 判断输入流是否为null
if(fr != null){
// 关闭资源
fr.close();
}
} catch (IOException e) {
e.printStackTrace();
} finally { try {
// 判断输入流是否为null
if(fw != null) {
// 关闭资源
fw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
} }
} // jdk7之后 /**
* try(创建IO流对象的代码){
* 其他代码
* }catch(可能出现的异常){
* 打印异常信息
* }
* 上面的代码会自动调用close方法(也就是IO流对象都实现了Closeable接口(Closeable实现了AutoCloseable接口),
* 重写close方法).有兴趣的可以查看源码
*/
public static void main(String[] args) {
try (
// 创建字符流对象
FileReader fr = new FileReader("student.txt");
FileWriter fw = new FileWriter("student.txt");
){ // 操作资源(边读编写,耗资源,仅作为示例)
int len;
while((len = fr.read()) != -1){
fw.write((char) len);
} } catch (IOException e) {
e.printStackTrace();
}
}
}

Properties

是Map下的一个子类(意味着map有的它都有).该类的key和value的类型都是String类型,

开发中Properties使用会结合IO流对文件进行操作,

特殊的方法:

  • String getProperties(String key): 根据键获取对应的值
  • Object setProperties(String key,String value): 给集合中添加键值对映射关系,返回值是被替换的值.

将Properties对象中的数据进行持久化保存(写数据到文件中):

  • void store(OutputStream out, String comments):使用字节流将Properties对象中的内容写入到指定文件,

    comments的意思是对文件的数据进行说明
  • void store(Writer writer, String comments):使用字符流将Properties对象中的内容写入到指定文件,

    comments的意思是对文件的数据进行说明

从文件中获取数据到Properties集合中

  • void load(InputStream inStream) : 将文件中的内容以字节流的方式写入到Properties的对象中.

  • void load(Reader reader) : 将文件中的内容以字符流的方式写入到Properties的对象中.

    public static void main(String[] args) throws IOException {

          // 创建属性集对象
    Properties p = new Properties();
    // 添加数据
    /*p.put("001","迪丽热巴");
    p.put("002","郑爽");
    p.put("003","杨紫");*/
    // 调用方法,写入文件
    // p.store(new FileWriter("a.properties"),"测试文件"); // p.store(new FileWriter("a.txt"),"测试文件");
    //p.store(new FileOutputStream("b.properties"),"测试文件"); // 调用方法,读取文件
    /*p.load(new FileReader("a.properties"));
    // map的子类,遍历的方法和map一样
    Set<Map.Entry<Object, Object>> entries = p.entrySet();
    for (Map.Entry<Object, Object> entry : entries) {
    System.out.println(entry.getKey() + "=" + entry.getValue());
    }*/ p.load(new FileInputStream("b.properties"));
    // map的子类,遍历的方法和map一样
    Set<Map.Entry<Object, Object>> entries = p.entrySet();
    Iterator<Map.Entry<Object, Object>> iterator = entries.iterator();
    while(iterator.hasNext()){
    Map.Entry<Object, Object> map = iterator.next();
    System.out.println(map.getKey() + "=" + map.getValue()); } }

高效流

  • 高效字节流:

    1. 高效字节输入流(BufferedInputStream)
    2. 高效字节输出流(BufferedOutStream)
  • 高效字符流:
    1. 高效字符输入流(BufferedReader)
    2. 高效字符输出流(BufferedWriter)

高效字节流

构造方法:

  • public BufferedInputStream(InputStream in) :创建一个 新的缓冲输入流。
  • public BufferedOutputStream(OutputStream out) : 创建一个新的缓冲输出流。

常用方法:

方法与普通字节流的方法没有区别.下面用个例子测试一下两个的效率,文件大小是七十几兆

public static void main(String[] args) throws IOException {

    // bufferedCopy();

    byteCopy();
} public static void bufferedCopy() throws IOException { long startTime = System.currentTimeMillis(); BufferedInputStream bis = new BufferedInputStream(new FileInputStream("F:\\desktop\\Desktop\day09\\day09\\avi\\01-今日内容.itcast"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("abc.avi")); int len;
while((len = bis.read()) != -1){
bos.write(len);
} bos.close();
bis.close();
System.out.println(System.currentTimeMillis() - startTime); // 3171 } public static void byteCopy() throws IOException { long startTime = System.currentTimeMillis(); FileInputStream fis = new FileInputStream("F:\\desktop\\Desktop\\day09\\day09\\avi\\01-今日内容.itcast");
FileOutputStream fos = new FileOutputStream("bcd.avi"); int len;
while((len = fis.read()) != -1){
fos.write(len);
} fis.close();
fos.close(); System.out.println(System.currentTimeMillis() - startTime); // 297409 }

字符高效流

构造方法:

  • public BufferedReader(Reader in) :创建一个 新的缓冲输入流。
  • public BufferedWriter(Writer out) : 创建一个新的缓冲输出流。

常用方法(父类有的它都有):

  • void newLine() : (高效输出字符流的方法)写出一个换行符,跨平台.

  • String readLine() : 读取一行数据(结束标志为null)

    package com.wzlove.buffered;

    import java.io.*;

    import java.util.Scanner;

    /**

    • 测试高效字符流

    • @author WZLOVE

    • @create 2018-07-23 15:32

      */

      public class Demo1 {

      public static void main(String[] args) throws IOException {

      BufferedWriter bw = new BufferedWriter(new FileWriter("c.txt"));

      Scanner in = new Scanner(System.in);

      String str;

      while(true){

      System.out.println("请输入您想要的内容:");

      str = in.nextLine();

      if(str.equals("ends")){

      break;

      }

      bw.write(str);

      bw.newLine();

      }

      bw.flush();

      bw.close();

       System.out.println("您输入的内容是:");
      BufferedReader br = new BufferedReader(new FileReader("c.txt"));
      String str2;
      while((str2 = br.readLine()) != null){
      System.out.println(str2);
      }
      br.close();

      }

      }

转换流(字符流)

  • InputStreamReader

    1. 构造方法

      1. InputStreamReader(InputStream in) : 创建一个使用默认字符集的字符流。
      2. InputStreamReader(InputStream in, String charsetName) : 创建一个指定字符集的字符流。
    2. 常用方法
      1. int read() 读一个字符
      2. void close() 关闭流并释放与之相关联的任何系统资源。
  • OutputStreamWriter
    1. 构造方法

      1. OutputStreamWriter(OutputStream in) : 创建一个使用默认字符集的字符流。
      2. OutputStreamWriter(OutputStream in, String charsetName) : 创建一个指定字符集的字符流。
    2. 常用方法:
      1. void close() 关闭流,先刷新。
      2. void flush() 刷新流。
      3. void write(int c) 写一个字符
      4. void write(String str) 写一个字符串

什么时候使用?如果需要以指定的字符集进行数据的读写操作.

    package com.wzlove.demo1;

    import java.io.*;
import java.util.Scanner; /**
* 测试转换流
* @author WZLOVE
* @create 2018-07-23 18:20
*/
public class Demo { public static void main(String[] args) throws IOException {
// 创建高效输出流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d.txt"),"GBK")); // 写入数据
Scanner in = new Scanner(System.in);
while(true){
System.out.println("请输出内容");
String str = in.nextLine();
if(str.equals("ends")){
break;
}
bw.write(str);
bw.newLine();
}
in.close();
// 关闭流
bw.flush();
bw.close(); // 创建高效输入流
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("d.txt"),"GBK"));
String str;
while((str = br.readLine()) != null){
System.out.println(str);
}
br.close();
}
}

回忆学过的IO流:

字节:
InputStream
|-- FileInputStream : 输入字节流
|-- FilterInputStream (不用管,没学)
|-- BufferedInputStream : 高效缓冲输入字节流
|-- ObjectInputStream : 对象输入字节流(反序列化流)
OutputStream
|-- FileOutputStream : 输出字符流
|-- FilterOutputStream (不用管,没学)
|-- BufferedOutputStream : 高效缓冲输出字节流
|-- ObjectOutputStream : 对象输出字节流(序列化流)
|-- PrintStream : 打印字节流
字符:
Reader
|-- BufferedReader : 高效缓冲字符输入流(读取字符串的时候使用,注意readLine读取一行数据,但不会读取换行符)
|-- InputStreamReader : 转换流,将字节流转化为字符流
|-- FileReader : 字符输入流
Writer
|-- BufferedWriter : 高效缓冲字符输出流(newLine方法是换行)
|-- OutputStreamWriter : 转换流,将字符流转化为字节流
|-- FileWriter : 字符输出流
|-- PrintWriter : 打印字符流(方便使用,自动刷新和自动换行)

转换流的使用场景:

  1. 读取数据需要指定字符编码集或者就是本身的意义,将字节流转化为字符流
  2. 写出数据需要指定字符编码集

    注意字节流和字符流的使用场景
  3. 对于文件的拷贝使用字节流
  4. 文本文件的数据的读取的话,使用字符流
  5. 文本文件的数据的写出的话,字符流和字节流都可以

Java之高级IO,Properties的更多相关文章

  1. Java IO(Properties/对象序列化/打印流/commons-io)

    Java IO(Properties/对象序列化/打印流/commons-io) Properties Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载. ...

  2. java学习一目了然——IO

    java学习一目了然--IO IO是java学习当中很重要的一部分.IO流实现数据的上传下载,即读写数据,包括输入和输出流,输入流指的是将数据以字符或字节形式从外部媒介比如文件.数据库等读取到内存中所 ...

  3. Java中的IO流(五)

    上一篇<Java中的IO流(四)>记录了一下Properties类,此类不属于IO流,它属于集合框架.接下来说一下IO流中的其它流 一,打印流PrintStream PrintStream ...

  4. Java中的IO流(四)

    上一篇<Java中的IO流(三)>把IO流中的文件及目录操作的对象File类记录了一下,本篇把本不属性IO流但又和IO流有关系的一个对象作一下记录,此对象本属于集合框架里的一个子集,即Pr ...

  5. Java基础之IO和NIO补完

    Java Stream,File,IO 关于NIO和IO的比较,参考:Java NIO系列教程(十二) Java NIO与IO java包之java.io 参考材料:菜鸟教材 NIO 由于下面的系列教 ...

  6. Java学习之==>IO文件操作体系

    一.概述 在整个 Java.io 中最重要的就是5个类和一个接口.5个类指的是 File.InputStream.OutputStream.Reader.Writer,一个接口指的是Serializa ...

  7. Day14_85_通过反射机制修改Class的属性值(IO+Properties)动态修改

    通过反射机制修改Class的属性值(IO+Properties)动态修改 import java.io.FileInputStream; import java.io.FileNotFoundExce ...

  8. src/main/Java路径下的properties文件丢失

    在pom中加入代码: <build> <resources> <resource> <directory>src/main/java</direc ...

  9. java nio 与io区别

    转自:http://blog.csdn.net/keda8997110/article/details/19549493 当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使 ...

随机推荐

  1. CHAPTER 40 Science in Our Digital Age 第40章 我们数字时代的科学

    CHAPTER 40 Science in Our Digital Age 第40章 我们数字时代的科学 The next time you switch on your computer, you ...

  2. Netty源码分析第4章(pipeline)---->第6节: 传播异常事件

    Netty源码分析第四章: pipeline 第6节: 传播异常事件 讲完了inbound事件和outbound事件的传输流程, 这一小节剖析异常事件的传输流程 首先我们看一个最最简单的异常处理的场景 ...

  3. Windows10子系统安装ubuntu+kali渗透环境

    Windows10安装子系统ubuntu,安装完ubuntu后再安装katoolin才能使用kali. (katoolin渗透测试的Linux发行版,它可以让你在其他Linux发行版上使用Kali的全 ...

  4. 基于Promise规范的fetch API的使用

    基于Promise规范的fetch API的使用 fetch的使用 作用:fetch 这个API,是专门用来发起Ajax请求的: fetch 是由原生 JS 提供的 API ,专门用来取代 XHR 这 ...

  5. Scrum立会报告+燃尽图(Final阶段第二次)

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2481 项目地址:https://coding.net/u/wuyy694 ...

  6. Microsoft Visual Studio 2013 的安装及单元测试

    题目:练习教科书第22~25页单元测试练习,要求自行安装Visual Studio开发平台,版本至少在2010以上,要求把程序安装过程和练习过程写到博客上,越详细越好,要图文并茂. 安装过程: 1.下 ...

  7. BugPhobia回顾篇章:团队Alpha阶段工作分析

    0x00:序言 1 universe, 9 planets, 204 countries,809 islands, 7 seas, and i had the privilege to meet yo ...

  8. 暑假作业app博客

    一.光照传感器 界面 简介 运用了传感器类,通过手机的感应区根据当时的光照强度显示出数据. 核心代码 protected void onCreate(Bundle savedInstanceState ...

  9. C51学习笔记

    转自:http://blog.csdn.net/gongyuan073/article/details/7856878 单片机C51学习笔记 一,   C51内存结构深度剖析 二,   reg51.头 ...

  10. sqlserver trigger(触发器)-更新某几列数据时触发【转】

    CREATE TRIGGER [dbo].[updataAlarmLevel]ON [dbo].[Alarm_Alarm_Info]AFTER INSERT, UPDATE – 在更新和插入之后ASB ...