鱼C论坛

 找回密码
 立即注册
查看: 2432|回复: 0

[学习笔记] Java-026 IO流之基本输入输出流

[复制链接]
发表于 2018-12-27 18:33:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 moc 于 2019-1-7 20:39 编辑

1、流的概念
与C++类似,流(Stream)是指在计算机的输入输出操作中各部件之间的数据流动。按照数据的传输方向,流可分为输入流与输出流
包: java.io
Java提供了两种类型的输入输出流:
        ① 面向字节的流,数据的处理以字节为基本单位;
        ② 面向字符的流,用于字符数据的处理。
       字节流(Byte Stream)每次读写8位二进制数,也称为二进制字节流或位流。字符流一次读写16位二进制数,并将其做一个字符而不是二进制位来处理。需要注意的是,为满足字符的国际化表示,Java语言的字符编码采用的是16位的Unicode编码
Java流层次图:
iostream2xx.png

2、字节输入流--FileInputStream
1. 构造方法
FileInputStream(File file)  ------------------------>  通过File 对象来创建一个字节输入流
FileInputStream(FileDescriptor fdObj) --------->  通过文件描述符创建一个字节输入流
FileInputStream(String name) ----------------->  通过文件系统中的路径名创建一个字节输入流
2. 读方法
int read()    ------------------>  一次读取一个字节,返回 0 -255 范围内的 int 数,如果到达流末尾,则返回值 -1。
int read(byte[] b) ---------->  从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中,以整数形式返回实际读取的字节数,如果到达流末尾,则返回值 -1。
// int read()
FileInputStream fis = new FileInputStream("fis.txt");   // 创建字节输入流对象 
int by = 0;
while ((by = fis.read()) != -1) {  // 读取,赋值,判断
        System.out.print((char) by);
}

// int read(byte[] b)
fis = new FileInputStream("fis2.txt");  
byte[] bys = new byte[1024];
int len = 0;
while ((len = fis.read(bys)) != -1) {
        System.out.print(new String(bys, 0, len));
}
fis.close();  // 释放资源
3、字节输出流--FileOutputStream
1. 构造方法
FileOutputStream(File file) ----------------------------->  通过File 对象来创建一个字节输出流
FileOutputStream(File file, boolean append) -------->  通过File 对象来创建一个字节输出流,可选择追加模式
FileInputStream(FileDescriptor fdObj) --------------->  通过文件描述符创建一个字节输出流
FileInputStream(String name) ------------------------>  通过文件系统中的路径名创建一个字节输出流
FileInputStream(String name, boolean append) --->  通过文件系统中的路径名创建一个字节输出流,可选择追加模式
2. 写方法
public void write(int b)  -------------------------->  写一个字节, 写的ASCII字符。
void write(byte[] b) ------------------------------>  将 b.length 个字节从指定 byte 数组写入此文件输出流中。
void write(byte[] b, int off, int len) ----------->  将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
带异常处理的字节输出流操作:
FileOutputStream fos = null;
try {
        fos = new FileOutputStream("fos4.txt");
        fos.write("java".getBytes());
        fos.write("\r\n".getBytes());    // 写换行符
        fos.write(97);      //97 -- 底层二进制数据  -- 通过记事本打开 -- a(97对应的字符值 )
} catch (FileNotFoundException e) {
        e.printStackTrace();
} catch (IOException e) {
        e.printStackTrace();
} finally {
        if (fos != null) {    // 如果fos不是null,才需要close()
                try {
                        fos.close();    // 为了保证close()一定会执行,就放到这里了
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }
}
换行符:
windows ---> \r\n
linux  -------> \n
Mac   -------> \r


4、高效字节输入、输出流BufferedInputStream、BufferedOutputStream
也称缓冲输入、输出字符流。
1. 高效字节输入流 BufferedInputStream
构造方法:
BufferedInputStream(InputStream in)  ------------------> 通过输入流 in创建一个 高效字节输入流,缓存区大小使用默认值。
BufferedInputStream(InputStream in, int size)  --------> 通过输入流 in创建一个 高效字节输入流,缓存区大小指定为size。
读方法:
与FileInputStream的读方法一致。
2. 高效字节输出流 BufferedOutputStream
构造方法:
BufferedOutputStream(OutputStream out) ---------------> 通过输入流 out创建一个 高效字节输出流,缓存区大小使用默认值。
BufferedOutputStream(OutputStream out, int size) -----> 通过输入流 out创建一个 高效字节输出流,缓存区大小指定为size。
写方法:
与FileInputStream的写方法一致。

5、输入、输出转换流--InputStreamReader、OutputStreamWriter
1. 编码:
String(byte[] bytes, String charsetName)  ----------> 通过指定的字符集解码字节数组, String ==> byte[]
byte[] getBytes(String charsetName)  ---------------> 使用指定的字符集合把字符串编码为字节数组, String ==> byte[]
String s = "你好";
byte[] bys = s.getBytes(); // [-60, -29, -70, -61]
String ss = new String(bys, "GBK");  // GBK编码
2. 构造函数
InputStreamReader(InputStream is)  ---------------------------------->  用默认的编码读取数据
InputStreamReader(InputStream is,String charsetName)  --------->  用指定的编码读取数据
OutputStreamWriter(OutputStream out)  ----------------------------->  根据默认编码把字节流的数据转换为字符流
OutputStreamWriter(OutputStream out,String charsetName)  ---->  根据指定编码把字节流数据转换为字符流
InputStreamReader isr = new InputStreamReader(new FileInputStream("osw.txt"), "UTF-8");
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("osw.txt"), "UTF-8"); 
char[] chs = new char[1024];
int len = 0;
while ((len = isr.read(chs)) != -1) {
        System.out.print(new String(chs, 0, len));
}
osw.write("中国");
osw.flush();   // 刷新缓冲区
InputStreamReader的读方法与FileFileInputStream一致;
OutputStreamWriter 的写方法与FileFileOutputStream一致,还可以直接写String类型。

6、字符输入、输出流--FileReader、FileWriter
FileWriter = FileOutputStream + 编码表(本地默认编码)
FileReader = FileInputStream + 编码表(本地默认编码)

FileReader、FileWriter的构造、读写方法与字节流的方式是一样的。
字符缓冲流
字符流为了高效读写,也提供了对应的字符缓冲流。
BufferedWriter  ----------> 字符缓冲输出流
BufferedReader ----------> 字符缓冲输入流
其用法与缓冲输入、输出字符流一致。
字符缓冲流的特殊方法:
BufferedWriter:
        public void newLine()  ----------> 根据系统来决定换行符
BufferedReader:
        public String readLine() --------> 一次读取一行数据
注意:
        缓冲流都提供了flush方法,用于刷新数据到磁盘。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 21:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表