专栏名称: 武哥聊编程
这里有技术,有段子,有生活,也有资源,要不然怎么叫 “私房菜” 呢?
目录
相关文章推荐
西安头条  ·  陕西一学校拟晋升 ·  18 小时前  
西安头条  ·  陕西一学校拟晋升 ·  18 小时前  
中国航务周刊  ·  【年报】国际原油海运市场2025年展望 ·  昨天  
中国航务周刊  ·  【年报】中国对外贸易2024年回顾与2025年展望 ·  昨天  
896汽车调频  ·  陕西今年将建成1条高铁线! ·  昨天  
51好读  ›  专栏  ›  武哥聊编程

Java IO详解那点事

武哥聊编程  · 公众号  ·  · 2020-02-11 09:20

正文

0x01: 字节流

字节流基类

1. InputStream

InputStream: 字节输入流基类,抽象类是表示字节输入流的所有类的超类。

 常用方法:
  1. // 从输入流中读取数据的下一个字节

  2. abstract int read ()

  3. // 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b中

  4. int read ( byte [] b )

  5. // 将输入流中最多 len 个数据字节读入 byte 数组

  6. int read ( byte [] b , int off , int len )



  7. // 跳过和丢弃此输入流中数据的 n个字节

  8. long skip ( long n )


  9. // 关闭此输入流并释放与该流关联的所有系统资源

  10. void close ()

    

2. OutputStream

OutputStream: 字节输出流基类,抽象类是表示输出字节流的所有类的超类。

 常用方法:
  1. // 将 b.length 个字节从指定的 byte 数组写入此输出流

  2. void write ( byte [] b )

  3. // 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流

  4. void write ( byte [] b , int off , int len )

  5. // 将指定的字节写入此输出流

  6. abstract void write ( int b )


  7. // 关闭此输出流并释放与此流有关的所有系统资源

  8. void close ()


  9. // 刷新此输出流并强制写出所有缓冲的输出字节

  10. void flush ()

字节文件操作流

1. FileInputStream

FileInputStream: 字节文件输入流,从文件系统中的某个文件中获得输入字节,用于读取诸如图像数据之类的原始字节流。

 构造方法:
// 通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的File对象file指定
FileInputStream(File file)
// 通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的路径name指定
FileInputStream(String name)

常用方法:覆盖和重写了父类的的常用方法。

  1. // 读取f盘下该文件f://hell/test.txt

  2. //构造方法1

  3. InputStream inputStream = new FileInputStream(new File("f://hello//test.txt"));

  4. int i = 0;

  5. //一次读取一个字节

  6. while ((i = inputStream.read()) != -1) {


  7. // System.out.print(i + " ");// 65 66 67 68

  8. //为什么会输出65 66 67 68?因为字符在底层存储的时候就是存储的数值。即字符对应的ASCII码。

  9. System.out.print((char) i + " ");// A B C D

  10. }

  11. //关闭IO流

  12. inputStream.close();


  1. // 读取f盘下该文件f://hell/test.txt

  2. //构造方法2

  3. InputStream inputStream2 = new FileInputStream("f://hello/test.txt");

  4. // 字节数组

  5. byte[] b = new byte[2];

  6. int i2 = 0;

  7. // 一次读取一个字节数组

  8. while (( i2 = inputStream2.read(b)) != -1) {


  9. System.out.print(new String(b, 0, i2) + " ");// AB CD

  10. }

  11. //关闭IO流

  12. inputStream2.close();

注: 一次读取一个字节数组,提高了操作效率, IO 流使用完毕一定要关闭。

2. FileOutputStream

FileOutputStream: 字节文件输出流是用于将数据写入到File,从程序中写入到其他位置。

 构造方法:
  1. // 创建一个向指定File对象表示的文件中写入数据的文件输出流

  2. FileOutputStream ( File file )

  3. // 创建一个向指定File对象表示的文件中写入数据的文件输出流

  4. FileOutputStream ( File file , boolean append )

  5. // 创建一个向具有指定名称的文件中写入数据的输出文件流

  6. FileOutputStream ( String name )

  7. // 创建一个向具有指定name的文件中写入数据的输出文件流

  8. FileOutputStream ( String name , boolean append )

常用方法:覆盖和重写了父类的的常用方法。

  1. OutputStream outputStream = new FileOutputStream(new File("test.txt"));

  2. // 写出数据

  3. outputStream.write("ABCD".getBytes());

  4. // 关闭IO流

  5. outputStream.close();


  6. // 内容追加写入

  7. OutputStream outputStream2 = new FileOutputStream("test.txt", true);

  8. // 输出换行符

  9. outputStream2.write("\r\n".getBytes());

  10. // 输出追加内容

  11. outputStream2.write("hello".getBytes());

  12. // 关闭IO流

  13. outputStream2.close();


注;输出的目的地文件不存在,则会自动创建,不指定盘符的话,默认创建在项目目录下;输出换行符时一定要写\r\n不能只写\n,因为不同文本编辑器对换行符的识别存在差异性。


字节缓冲流(高效流)

1. BufferedInputStream

BufferedInputStream: 字节缓冲输入流,提高了读取效率。

     构造方法:
// 创建一个 BufferedInputStream并保存其参数,即输入流in,以便将来使用。
BufferedInputStream(InputStream in)
// 创建具有指定缓冲区大小的 BufferedInputStream并保存其参数,即输入流in以便将来使用

BufferedInputStream(InputStream in, int size)

  1. InputStream in = new FileInputStream("test.txt");

  2. // 字节缓存流

  3. BufferedInputStream bis = new BufferedInputStream(in);

  4. byte[] bs = new byte[20];

  5. int len = 0;

  6. while ((len = bis.read(bs)) != -1) {


  7. System.out.print(new String(bs, 0, len));

  8. // ABCD

  9. // hello

  10. }

  11. // 关闭流

  12. bis.close();

2. BufferedOutputStream

BufferedOutputStream: 字节缓冲输出流,提高了写出效率。

     构造方法:
  1. // 创建一个新的缓冲输出流,以将数据写入指定的底层输出流

  2. BufferedOutputStream ( OutputStream out )

  3. // 创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流

  4. BufferedOutputStream ( OutputStream out , int size )


  5. 常用方法:

  6. // 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流

  7. void write ( byte [] b , int off , int len )

  8. // 将指定的字节写入此缓冲的输出流

  9. void write ( int b )

  10. // 刷新此缓冲的输出流

  11. void flush ()

  1. BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("test.txt", true));

  2. // 输出换行符

  3. bos.write("\r\n".getBytes());

  4. // 输出内容

  5. bos.write("Hello Android".getBytes());

  6. // 刷新此缓冲的输出流

  7. bos.flush();

  8. // 关闭流

  9. bos.close();


0x02: 字符流


字符流基类

1. Reader

Reader:读取字符流的抽象类.

  常用方法:
  1. // 读取单个字符

  2. int read ()

  3. // 将字符读入数组

  4. int read ( char [] cbuf )

  5. // 将字符读入数组的某一部分

  6. abstract int read ( char [] cbuf , int off , int len )

  7. // 跳过字符

  8. long skip ( long n )


  9. // 关闭该流并释放与之关联的所有资源

  10. abstract void close ()


2. Writer

Writer:写入字符流的抽象类.

 常用方法:
  1. // 写入字符数组

  2. void write ( char [] cbuf )

  3. // 写入字符数组的某一部分

  4. abstract void write ( char [] cbuf , int off , int len )

  5. // 写入单个字符

  6. void write ( int c )

  7. // 写入字符串

  8. void write ( String str )

  9. // 写入字符串的某一部分

  10. void write ( String str , int off , int len )


  11. // 将指定字符添加到此 writer

  12. Writer append ( char c )

  13. // 将指定字符序列添加到此 writer

  14. Writer append ( CharSequence csq )

  15. // 将指定字符序列的子序列添加到此 writer.Appendable

  16. Writer append ( CharSequence csq , int start , int end )


  17. // 关闭此流,但要先刷新它

  18. abstract void close ()

  19. // 刷新该流的缓冲

  20. abstract void flush ()

字符转换流

1. InputStreamReader

InputStreamReader: 字节流转字符流,它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。

 构造方法:
  1. // 创建一个使用默认字符集的 InputStreamReader

  2. InputStreamReader ( InputStream in )

  3. // 创建使用给定字符集的 InputStreamReader

  4. InputStreamReader ( InputStream in , Charset cs )

  5. // 创建使用给定字符集解码器的 InputStreamReader

  6. InputStreamReader ( InputStream in , CharsetDecoder dec )

  7. // 创建使用指定字符集的 InputStreamReader

  8. InputStreamReader ( InputStream in , String charsetName )

 特有方法:


  1.     //返回此流使用的字符编码的名称

    String getEncoding()

  2. //使用默认编码

  3. InputStreamReader reader = new InputStreamReader(new FileInputStream("test.txt"));

  4. int len;

  5. while ((len = reader.read()) != -1) {

  6. System.out.print((char) len); //爱生活,爱Android


  7. }

  8. reader.close();


  9. //指定编码

  10. InputStreamReader reader = new InputStreamReader(new FileInputStream("test.txt"),"utf-8");

  11. int len;

  12. while ((len = reader.read()) != -1) {

  13. System.out.print((char) len);//????????Android

  14. }

  15. reader.close();


注:Eclipse默认使用GBK编码,test.txt文件所以是GBK编码,当指定utf-8编码时所以会乱码。


2. OutputStreamWriter

OutputStreamWriter: 字节流转字符流。

 构造方法:
  1. // 创建使用默认字符编码的 OutputStreamWriter

  2. OutputStreamWriter ( OutputStream out )

  3. // 创建使用给定字符集的 OutputStreamWriter

  4. OutputStreamWriter ( OutputStream out , Charset cs )

  5. // 创建使用给定字符集编码器的 OutputStreamWriter

  6. OutputStreamWriter ( OutputStream out , CharsetEncoder enc )

  7. // 创建使用指定字符集的 OutputStreamWriter

  8. OutputStreamWriter ( OutputStream out , String charsetName )

  9. 特有方法:

  10. //返回此流使用的字符编码的名称

  11. String getEncoding ()

字符缓冲流(高效流)

1. BufferedReader

BufferedReader: 字符缓冲流,从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

 构造方法:
  1. // 创建一个使用默认大小输入缓冲区的缓冲字符输入流

  2. BufferedReader ( Reader in )

  3. // 创建一个使用指定大小输入缓冲区的缓冲字符输入流

  4. BufferedReader ( Reader in , int sz )

 特有方法:
// 读取一个文本行

String readLine()


  1. //生成字符缓冲流对象

  2. BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("test.txt")));

  3. String str;

  4. //一次性读取一行

  5. while ((str = reader.readLine()) != null) {

  6. System.out.println(str);// 爱生活,爱Android

  7. }


  8. //关闭流

  9. reader.close();


2. BufferedWriter

BufferedWriter: 字符缓冲流,将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

 构造方法:






请到「今天看啥」查看全文


推荐文章
西安头条  ·  陕西一学校拟晋升
18 小时前
西安头条  ·  陕西一学校拟晋升
18 小时前
中国航务周刊  ·  【年报】国际原油海运市场2025年展望
昨天
896汽车调频  ·  陕西今年将建成1条高铁线!
昨天
奔波儿灞与灞波儿奔  ·  嘿嘿嘿,你那里有秘密!
8 年前
实验万事屋  ·  加快论文发表的12个要点
7 年前
IT时代网  ·  理工男要统治地球了吗?
7 年前