字节流与字符流

1. IO分类

根据数据的流向分为:输入流和输出流。

  • 输入流:把数据从其他设备上读取到内存中的流。
  • 输出流:把数据从内存J中写出到其他设备上的流。

格局数据的类型分为:字节流和字符流。

  • 字节流:以字节为单位,读写数据的流。
  • 字符流:以字符为单位,读写数据的流。

1.1 io流说明图解

注意:
字节流:适合读取音频。视频。图片等二进制文件
字符流:适合读取纯文本文件

io流说明图解

2. 字节流

2.1 一切皆为字节

一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都-一个-一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。

2.2 outputstream

java. io. OutputStream抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。它定义了字节输出流的基本共性功能方法。
public void close() ] : 关闭此输出流并释放与此流相关联的任何系统资源。
public void flush()」: 刷新此输出流并强制任何缓冲的输出字节被写出。
| public void write(byte[] b) :将b.length字节从指定的字节数组写入此输出流。
public void write(byte[] b, int off, int len)] : 从指定的字节数组写入len字节,从偏移量off开始输
出到此输出流。
public abstract void write(int b) ] : 将指定的字节输出流。
小贴士:
close方法,当完成流的操作时,必须调用此方法,释放系统资源。
演示一:换行输出abcdef

import java.io.*;
/*追加写/续写:
public FileOutputStream(String name, boolean append)throws FiLeNotFoundException
public FileOutputStream(File file, boolean append) throws FiLeNotFoundException
boolean append:
true:创建对象不会覆盖源文件,继续在文件末尾追加写入数据
false:创建一 个新文件,覆盖源文件
换行:写换行符号
windows \r\n
Linux /n
mac /r
*/
/**
 * @author Administrator
 */
public class Test01 {
    public static void main(String[] args) throws IOException {
        OutputStream ops = new FileOutputStream("a.txt");
        byte[] wo = {97,98,99,100,101,102};
        for (int i = 0; i < wo.length; i++) {
            ops.write(wo[i]);
            //把换行字符转换为数组
            ops.write("\r\n".getBytes());

        }
        ops.close();

    }
}
   /* 输出
       * a
       * b
       * c
       * d
       * e
       * f*/      

演示二:创建文本输出轩成笔记

public class Test02 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fops = new FileOutputStream("b.txt");
        byte[]  bytes = "轩成笔记".getBytes();
        fops.write(bytes);
        fops.close();
//输出:轩成笔记

    }
}

关于换行

  • 回车符\r和换行符[\n] :
  • 回车符:回到一-行的开头( return).
  • 换行符:下一行(newline)。

●系统中的换行:

  • Windows系统里,每行结尾是回车+换行」,即\r\n);
  • Unix系统里,每行结尾只有换行」,即\n];
  • Mac系统里,每行结尾是回车,即\r。从Mac OS X开始与Linux统- 。

2.3 InputStream

FileInputStream(File file) :通过打开与实际文件的连接来创建一个FileInputStream , 该文件由文件系
统中的File对象file命名。

FileInputStream(String name) ]:通过打开与实际文件的连接来创建一个FilenputStream , 该文件由文件
系统中的路径名name命名。
当你创建一个流对象时,必须传入-个文件路径。该路径下, 如果没有该文件,会抛出F ileNotF oundException }。


import java.io.FileInputStream;
import java.io.IOException;

public class Test03 {
    public static void main(String[] args) throws IOException {
        FileInputStream fips = new FileInputStream("a.txt");
        int num=0;
        while ((num=fips.read())!=-1){
            System.out.println((char) num);
        }
        fips.close();
    }
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;

public class Test04 {
    public static void main(String[] args) throws IOException {
        FileInputStream fips = new FileInputStream("a.txt");
        int len;
        byte[] bytes= new byte[1024];
        while ((len=fips.read(bytes))!=-1){
            System.out.println(new String(bytes,0,len));
        }
        fips.close();
    }
}

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test05 {
    public static void main(String[] args) throws IOException {
        FileInputStream fip = new FileInputStream("D:\\美女壁纸\\美女壁纸\\1.jpg");
        FileOutputStream fos = new FileOutputStream("E:\\1.jpg");
        byte[] bytes = new byte[1024];
        int len;
        while ((len=fip.read(bytes))!=-1){
            fos.write(bytes,0,len);
        }
        fip.close();
        fos.close();

    }

2.4 FileReader

| java. io. Reader抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入
流的基本共性功能方法。

public void close() : 关闭此流并释放与此流相关联的任何系统资源。
●public int read()]:从输入流读取-一个字符。
public int read(char[] cbuf) ]: 从输入流中读取-些字符,并将它们存储到字符数组cbuf中。

FileReader(File file)」 :
创建一个新的FileReader , 给定要读取的File对象。
FileReader(String fileName): 创建一个新的FileReader , 给定要读取的文件的名称。

import java.io.FileReader;
import java.io.IOException;

public class Test06 {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("b.txt");
        int len;
        while ((len=fr.read())!=-1){
            System.out.println((char) len);
        }
        fr.close();
    }
}

2.5 FileWriter

●Filewriter(File file)]: 创建一个新的FileWriter ,给定要读取的File对象。
●Filelriter(string fileName)」:创建一个新的FileWriter ,给定要读取的文件的名称。
当你创建一个流对象时,必须传入-一个文件路径,类似于FileOutputStream.

因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要flush方法了。
flush : 刷新缓冲区,流对象可以继续使用。
●Close :先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。
注意:字符流输出流写的时候需要刷新,字节流可以不用

参数: boolean append-
true:创建对象不会覆盖源文件,继续在文件末尾追加写入数据
false:创建一 个新文件,覆盖源文件
所以这个与字节输出流恰恰相反
换行: 写换行符号
vindows \r\n .
_inux /n
nac /r

/*java. io. Writer
java. io. OutputStreamWriter
java. io. FileWriter
public void write(int c) throws IOException写一 个字符
public void write(char[] cbuf, int off, int len) throws IOException写入字符数组的- 一部分。
public void write(char[] cbuf) throws IOException写入一 个字符数组。
public abstract void fLush() throws IOException刷新流。
public abstract void close() throws IOException关闭流,先刷新
注意:字符流输出流写的时候需要刷新,字节流可以不用
*/
public class Test07 {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("c.txt");
//        fw.write("我是你爸爸");
       char[] chars = "今天太勤快".toCharArray();
       fw.write(chars);
        fw.flush();
        fw.close();
    }
}

在JDK1.7之前使用try… catch…finally处理流中的异常和释放流资源
格式:
try{
可能出现异常的代码
}catch(异常类型变量名){
异常的处理逻辑
}finally{
资源释放

import java.io.FileWriter;
import java.io.IOException;

/*续写和换行
续写,追加写:使用两个参数的构造方法
- -public FileWriter(String fileName, boolean append) throws IOException
构造一个Filewriter对象,给出一个带有布尔值的文件名,表示是否附加写入的数据。
- -public FileWriter(File file, boolean append)throws IOException
给一个File对象构造一个FileWriter对象。 如果第 二个参数是true,则字节将写入文件的末尾而不
参数: boolean append--
true:创建对象不会覆盖源文件,继续在文件末尾追加写入数据
false:创建一一个新文件,覆盖源文件
换行:写换行符号
windows \r\n .
Linux /n
mac /r
*/
public class Test08 {
    public static void main(String[] args)  {
        FileWriter fw= null;
        try {
             fw = new FileWriter("d.txt");
            for (int i = 0; i <10 ; i++) {
                fw.write("你是什么人啊"+"\r\n");
            }
            fw.flush();
        }catch (Exception e){
            System.out.println(e);
        }finally {
            if (fw!=null){
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

JDK7新特性:
在try.的后面可以增加一个小括号 (),在括号中定义流对象
,那么这个流对象的作用域就在try中有效
try中的代码执行完毕,会自动把流对象释放,就不用再写finnaly了
格式:
try(定义流对象;定义流对象…){
可能会出现异常的代码
}catch(异常类型变量名){
异常的处理逻辑

/*JDK7新特性:
在try.的后面可以增加一个小括号 (),在括号中定义流对象
,那么这个流对象的作用域就在try中有效
try中的代码执行完毕,会自动把流对象释放,就不用再写finnaly了
格式:
try(定义流对象;定义流对象...){
可能会出现异常的代码
}catch(异常类型变量名){
异常的处理逻辑
}
*/
public class Test09 {
    public static void main(String[] args) {
        try (FileInputStream fip = new FileInputStream("D:\\美女壁纸\\美女壁纸\\1.jpg");
             FileOutputStream fos = new FileOutputStream("E:\\1.jpg")){
            byte[] bytes = new byte[1024];
            int len;
            while ((len=fip.read(bytes))!=-1){
                fos.write(bytes,0,len);
            }
        }catch (Exception e){
            System.out.println(e);
        }
    }
}

Properties

java. util. Properties
Properties表示一个持 久的属性集,Properties 可以保存在流中或从流中加载
Properties.集合是唯一一个 和I0流相结合的集合
Properties集合中的store.方法,把集合中临时数据,持久化写入到硬盘存储
Properties.集合中的Load方法,把硬盘中保存的文件(键值对),读取到集合中使
注意:是- -个双列集合,key 和alue都是String类型
*/
/*注意1:是一 个双列集合,key和ivalue都是String类型
注意2:
1.存储键值对的文件中,键与值默认的连接符号可以使用,空格(其他符号
2.存储键值对的文件中可以使用#进行注释,被注释的键值对不会再被读取
3.存储键值对的文件中,键与值默认都是字符串,不用再加引号

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
import java.util.Set;

/*java. util. Hashtable<object, object>
java. util. Properties
Properties表示一个持 久的属性集,Properties 可以保存在流中或从流中加载
Properties.集合是唯一一个 和I0流相结合的集合
Properties集合中的store.方法,把集合中临时数据,持久化写入到硬盘存储
Properties.集合中的Load方法,把硬盘中保存的文件(键值对),读取到集合中使
注意:是- -个双列集合,key 和alue都是String类型
*/
/*注意1:是一 个双列集合,key和ivalue都是String类型
注意2:
1.存储键值对的文件中,键与值默认的连接符号可以使用,空格(其他符号
2.存储键值对的文件中可以使用#进行注释,被注释的键值对不会再被读取
3.存储键值对的文件中,键与值默认都是字符串,不用再加引号
*/
public class Test10 {
    public static void main(String[] args) throws IOException {
        show03();

    }
/*Properties集合中的Load方法,把硬盘中保存的文件(键值对),读取到集合中使用
public void Load(Reader reader)
throws IOException 以简单的线性格式从输入字符流读取属性列表
*/
    private static void show03() throws IOException {
        Properties pro = new Properties();
        pro.load(new FileReader("e"));
        Set<String> set = pro.stringPropertyNames();
        for (String s : set) {
            System.out.println(pro.getProperty(s)+"="+s);
        }

    }

    /*Properties集合中的store方法,把集合中临时数据,持久化写入到硬盘存储
    public void store(OutputStream out, String comments ) throws IOException
    将此属性列表(键和元素对)写入此Properties表中,以适合于使用Load(InputStream)方法加载到Properties表中的格式输出流。
    public void store (Writer writer, String comments)throws IOException
    将此Properties.表中的此属性列表(键和元素对)以适合使用Load(Reader)方法的格式写入输出字符流。
    */
    private static void show02() throws IOException {
        Properties pro = new Properties();
        pro.setProperty("1","今");
        pro.setProperty("2","天");
        pro.setProperty("3","天");
        pro.setProperty("4","气");
        pro.setProperty("5","晴");
        pro.store(new FileWriter("e"),"注释");
    }

    private static void show01() {
        Properties pro = new Properties();
        pro.setProperty("1","今");
        pro.setProperty("2","天");
        pro.setProperty("3","天");
        pro.setProperty("4","气");
        pro.setProperty("5","晴");
       /* System.out.println(pro.getProperty("1"));
        System.out.println(pro.getProperty("2"));
        System.out.println(pro.getProperty("3"));
        System.out.println(pro.getProperty("4"));
        System.out.println(pro.getProperty("5"));*/
        Set<String> set = pro.stringPropertyNames();
        for (String s : set) {
            System.out.println(pro.getProperty(s));
        }

    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轩成笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值