【Java】IO流的混乱关系,看得我直呼绝绝子

x33g5p2x  于2021-12-17 转载在 Java  
字(3.9k)|赞(0)|评价(0)|浏览(365)

一、前言

二、IO流概述

三、字节流写数据

字节流写数据的三种方式:

字节流数据据

1.一次读一个字节

2.一次读一个数组

四、字符缓冲流

字符缓冲流写文件

字符缓冲流读数据

一、前言

这些奇奇怪怪的流在理解起来也是其奇怪怪的,用起来却真香┗|`O′|┛ 嗷~~

二、IO流概述

I表示input、O表示output表示输入输出流。

我们都知道,程序运行会加载到内存上。

  • IO流就是用来处理设备间数据传输的问题的

IO流的分类大致可以分为两种:

**①按数据流向 **

  •       输入流:读数据
  •       输出流:写数据

②按数据类型分

  •       字节输入流;字节输出流
  •       字符输入流;字符输出流

一般来说IO流是按照数据类型分的

文本文件一般用字符流,其他用字节流

字节流是万能流,可以用于任意类型的文件。

三、字节流写数据

①InputStream:

  • 这个抽象类是表示输入字节流的所有类的超类。

②OutputStream:

  • 这个抽象类是表示字节输出流的所有类的超类。

他们的子类都是以其父类作为子类名的后缀:

因为他是一个抽象类,所以我们写、读数据一般都用他们的直接子类。

FileOutputStream和FileInputStream,前者用于写数据,后者用于读数据。

FileOutputStream(String name):创建文件输入流以指定的名称写入文件

  1. public class FileOutputDemo {
  2. public static void main(String[] args) throws IOException {
  3. //创建字节输出流对象,这个子类都会抛出异常FileNotFoundException
  4. FileOutputStream fos=new FileOutputStream("E:\\MyTest\\kong.txt");
  5. File f1=new File("E:\\MyTest\\kong.txt");
  6. System.out.println(f1.createNewFile());
  7. //write会抛出IOException异常,所以他所在得方法中得抛出异常throws也可以try..catch处理
  8. fos.write(49);//1
  9. fos.write(48); //0
  10. fos.write(48);//0
  11. byte arr[]=new byte[10];
  12. fos.write(arr);
  13. //释放资源
  14. fos.close();
  15. }
  16. }

创建对象做了三件事情:

  •         调用系统功能创建文件。
  •         创建字节输出流对象。
  •         让字节输出流指向创建好的文件。

凡是涉及到IO操做创建的对象都得释放资源。

 字节流写数据的三种方式:

  1. import java.io.*;
  2. public class FileOutputStreamDemo02 {
  3. public static void main(String[] args) throws IOException {
  4. //创建输入流对象
  5. FileOutputStream fos=new FileOutputStream("E:\\MyTest\\kong03.txt");
  6. FileOutputStream fos1=new FileOutputStream(new File("E:\\MyTest\\kong03.txt"));
  7. //上面两种方式等价
  8. //第一种方式写
  9. fos.write(97); fos.write(98); fos.write(99);
  10. //第二种方式写
  11. byte[]bys={97,98,99,100};//abcd
  12. fos.write(bys);
  13. //第三种方式写
  14. byte[]bys1="abcd".getBytes();
  15. fos.write(bys1, 1, 3);//bcd写在文件
  16. //释放资源
  17. fos.close();
  18. }
  19. }

字节流写数据的两个小问题:

有上面的操作可知,我们不难发现这写入的数据没有换行,这看着十分不舒服。

①字节流输入数据换行问题:

  • windows操作系统下:\r\n
  • Linux:\n
  • mac:\r

只需在写数据时加入对应的即可实现换行 

②字节流写数据如何追加的问题

只需要在创建指定路径后加true即可。

  1. public FileOutputSteam(String name,boolean append)
  1. import java.io.FileOutputStream;
  2. import java.io.IOException;
  3. public class FileTextZJ {
  4. public static void main(String[] args) throws IOException {
  5. FileOutputStream fos =new FileOutputStream("E:\\MyTest\\kong04.txt",true);
  6. for (int i=0;i<5;i++){
  7. fos.write("hello\r\n".getBytes());
  8. }
  9. fos.close();
  10. }
  11. }

下面时运行两次的结果:,达到了我们像要的追加效果。

 字节流数据据

1.一次读一个字节

  1. FileInputStream(String name)//写出从哪里读取

没数据到达文件末尾时,返回-1,所以只需根据返回值即可

  1. public class FileInputStreamDemo{
  2. public static void main(String [] args) throw IoException{
  3. FileInputStream fis=new FileInputStream("E:MyByte\\kong02.txt");
  4. int by;
  5. while(by=fis.read()!=-1){
  6. System.out.println((char)by);
  7. }
  8. fis.close();
  9. }
  10. }

2.一次读一个数组

  1. import java.io.FileInputStream;
  2. import java.io.IOException;
  3. public class FileInputStreamDemo01 {
  4. public static void main(String[] args) throws IOException {
  5. FileInputStream fis=new FileInputStream("E:\\MyTest\\kong1.txt");
  6. byte[]bys=new byte[1024];
  7. int len;
  8. while((len=fis.read())!=-1){
  9. System.out.println(new String(bys,0,len));
  10. }
  11. fis.close();
  12. }
  13. }

四、字符缓冲流

  • BufferedWriter
  • BufferedReader

缓冲流的参数需要一个FileWriter或FileReader对象

 字符缓冲流写文件

  1. import java.io.BufferedWriter;
  2. import java.io.FileWriter;
  3. import java.io.IOException;
  4. public class BufferedWriterDemo1 {
  5. public static void main(String[] args) throws IOException {
  6. BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\MyText\\KongChao.txt"));
  7. bw.write("hello\r\n");
  8. bw.write("world\r\n");
  9. bw.close();
  10. }
  11. }

字符缓冲流读数据

  1. public class BufferedWriterDemo {
  2. public static void main(String[] args) throws IOException {
  3. BufferedReader br=new BufferedReader(new FileReader("E:\\MyTest\\kong.txt"));
  4. int ch;
  5. while((ch=br.read())!=-1){
  6. System.out.print((char)ch);
  7. }
  8. br.close();
  9. }
  10. }

字符缓冲流特有功能

  • BufferedWriter:
  1. void newLine();//相当于换行
  • BufferedReader:
  1. public String readLine():读一行文件,不包括换行符、和终止符,若流已经到文件尾部,则为null

** 将使用特有方法,输存结合**

  1. import java.io.*;
  2. public class BufferedWriterDemo1 {
  3. public static void main(String[] args) throws IOException {
  4. //创建字符输入流
  5. BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\MyTest\\KongChao.txt"));
  6. //创建字符输出流
  7. BufferedReader br= new BufferedReader(new FileReader("E:\\MyTest\\copy.txt"));
  8. String line;
  9. while((line=br.readLine())!=null){
  10. bw.write(line);bw.newLine();
  11. bw.flush();//刷新到文件上
  12. }
  13. //关闭资源
  14. bw.close();
  15. br.close();
  16. } }

相关文章

最新文章

更多