IO流

Posted 要死要活的程序猿啊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO流相关的知识,希望对你有一定的参考价值。

1:递归(理解)
(1)方法定义中调用方法本身的现象
举例:老和尚给小和尚讲故事,我们学编程。
(2)递归的注意事项;

  • 1:递归一定要有出口,否则就是死递归;
  • 2:递归的次数不能太多,否则就内存溢出;
  • 3:构造方法不能递归使用.

(3)递归的案例:
A:递归求阶乘;
B:兔子问题(斐波那契数列);
C:递归输出指定目录下所有指定后缀名的文件绝对路径;
D:递归删除带内容的目录(小心使用).

2:IO流(掌握)
(1)IO用于在设备间进行数据传输的操作
(2)分类:
 A:流向
  输入流 读取数据
  输出流 写出数据

 B:数据类型:
 字节流
   字节输入流 读取数据 InputStream
   字节输出流 写出数据 OutputStream
 字符流
   字符输入流 读取数据 Reader
   字符输出流 写出数据 Writer


  注意:

  • 1:如果我们没有明确说明按照什么分,默认按照数据类型分。
  • 2:除非文件用windows自带的记事本打开我们能够读懂,才采用字符流,否则建议使用字节流。

每种基类的子类都是以父类名作为后缀名

   XxxOutputStream
   XxxInputStream
   XxxReader
   XxxWriter

(3)FileOutputStream写出数据
A:操作步骤
  1:创建字节输出流对象
  2:调用write()方法写数据
  3:释放资源

B:代码体现:

FileOutputStream fos = new FileOutputStream("fos.txt");

fos.write("hello".getBytes());

fos.close();

C:要注意的问题?
 1:创建字节输出流对象做了几件事情?

  • 1:调用系统功能去创建文件;
  • 2:创建fos对象;
  • 3:把fos对象指向这个文件.

 2:为什么一定要close()?

  • 1:让流对象变成垃圾,这样就可以被垃圾回收器回收;
  • 2:通知系统去释放跟该文件相关的资源.

 3:如何实现数据的换行?

  因为你值写了字节数据,并没有写入换行符号。
 如何实现呢?写入换行符号即可。
 因为不同的系统针对不同的换行符号识别是不一样的?
   windows:\r\n
   linux:\n
   Mac:\r
 而一些常见的个高级记事本,是可以识别任意换行符号的。

d:如何实现数据的追加写入?

用构造方法带第二个参数是true的情况即可。

 

FileOutputStream fos = new FileOutputStream("a.txt", true);

(4)FileInputStream读取数据
A:操作步骤
  a:创建字节输入流对象;
  b:调用read()方法;
  c:释放资源.

B:代码体现:

FileInputStream fis = new FileInputStream("fos.txt");

//方式1
    int by = 0;
    while((by=fis.read())!=-1) {
        System.out.print((char)by);
    }

//方式2
    byte[] bys = new byte[1024];
    int len = 0;
    while((len=fis.read(bys))!=-1) {
        System.out.print(new String(bys,0,len));
}

    fis.close();

(5)案例:2种实现
A:复制文本文件
B:复制图片
C:复制视频

数据源:
 c:\\a.txt -- 读取数据-- FileInputStream
目的地:
 d:\\b.txt -- 写出数据 -- FileOutputStream

(6)字节缓冲区流

  通过定义数组的方式确实比以前一次读取一个字节的方式快很多,所以,看来有一个缓冲区还是非常好的。
 既然是这样的话,那么,java开始在设计的时候,它也考虑到了这个问题,就专门提供了带缓冲区的字节类。
 这种类被称为:缓冲区类(高效类,高级流)
   写数据:BufferedOutputStream
   读数据:BufferedInputStream

 构造方法可以指定缓冲区的大小,但是我们一般用不上,因为默认缓冲区大小就足够了。
 为什么不传递一个具体的文件或者文件路径,而是传递一个OutputStream对象呢?
 原因很简单,字节缓冲区流仅仅提供缓冲区,为高效而设计的。但是呢,真正的读写操作还得靠基本的流对象实现。

 

(7)案例:4种实现
A:复制文本文件
B:复制图片
C:复制视频

3:字节流和字符流
IO流分类
 字节流:
  InputStream
  FileInputStream
  BufferedInputStream
  OutputStream
  FileOutputStream
  BufferedOutputStream

 字符流:
  Reader
  FileReader
  BufferedReader
  Writer
  FileWriter
  BufferedWriter

以上是关于IO流的主要内容,如果未能解决你的问题,请参考以下文章

在 .net 中处理 pcm wav 流

此应用小部件片段中所有意图 (PendingIntents) 的逻辑流

JavaSE 一些技巧 04——IO流各种流常用代码整理

猜数小游戏升级版(IO流实现,对IO流进行加强理解运用)

利用IO(文件字符流)打印代码本身

JAVA IO流相关代码(Serializable接口,管道流PipedInputStream类,RandomAccessFile类相关代码)