【Java】I/O流—字节流与字符流的基础入门


个人主页:Dawn黎明开始
系列专栏:Java
每日一句:所谓万丈深渊,走下去也是前程万里

欢迎大家关注点赞收藏⭐️留言


【Java】I/O流—字节流与字符流的基础入门_第1张图片


文章目录

一.字节流

1.1定义

1.1.1说明

1.2输出流

1.2.1构造方法

1.2.2成员方法

1.2.3实例练习

1.3输入流

1.3.1构造方法

1.3.2成员方法

1.3.3实例练习

二.字符流

2.1定义

2.1.1说明

2.2输出流

2.2.1构造方法

2.2.2成员方法

2.2.3实例练习

2.3输入流

2.3.1构造方法

2.3.2成员方法

2.3.3实例练习


前言

Java中的I/O流主要定义在java.io包中,该包下定义了很多类,其中有4个类为流的顶级类,所有流类型的父类,分别为InputStreamOutputStreamReaderWriter

【Java】I/O流—字节流与字符流的基础入门_第2张图片

一.字节流

1.1定义

在计算机中,无论是文本、图片、音频还是视频,所有文件都是以二进制(字节)形式存在的,I/O流中针对字节的输入/输出提供了一系列的流,统称为字节流

【Java】I/O流—字节流与字符流的基础入门_第3张图片

1.1.1说明

(1)针对文件的读写操作,JDK专门提供了两个类,分别是FileInputStreamFileOutputStream

(2)FileOutputStreamOutputStream子类,它是操作文件的字节输出流,专门用于输出文件中的数据。

(3)FileInputStreamInputStream子类,它是操作文件的字节输入流,专门用于读取文件中的数据。

(3)从文件读取数据是重复的操作,因此需要通过循环语句来实现数据的持续读取。

1.2输出流

1.2.1构造方法

【Java】I/O流—字节流与字符流的基础入门_第4张图片

1.2.2成员方法

继承OutputStream类的方法

【Java】I/O流—字节流与字符流的基础入门_第5张图片

注意

(1)前三个write()方法都是用来写数据的,分按字节读取和按字节数组写入

(2)flush()方法用来将当前输出流缓冲区(通常是字节数组)中的数据强制写入目标设备,此过程称为刷新

(3)close()方法是用来关闭流并释放与当前IO流相关的系统资源。

1.2.3实例练习

FileOutputStream操作步骤

1.创建字节输出流对象

2.调用write()方法写数据

3.释放资源

实例练习1

代码如下

package StreamDemo;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamDemo1 {
  public static void main(String[] args) throws IOException {
		// 创建字节输出流对象
     FileOutputStream fos = new FileOutputStream("fos.txt");
	   /*
	    * 创建字节输出流对象了做了几件事情:
		* A:调用系统功能去创建文件
		* B:创建fos对象
		* C:把fos对象指向这个文件
		*/
	    //写数据
      fos.write("hello,IO\n".getBytes());
	    //关闭流,释放资源
	  fos.close();
	}
}

运行结果

【Java】I/O流—字节流与字符流的基础入门_第6张图片

思考

如果文件不存在,会报错吗?

      不会,会新建一个文件写入

为什么一定要close()呢?
      1:让流对象变成垃圾,这样就可以被垃圾回收器回收了
      2:通知系统去释放跟该文件相关的资源

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

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

实例练习2

代码如下

package StreamDemo;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamDemo2 {
   public static void main(String[] args) throws IOException {
      FileOutputStream fos=new FileOutputStream("a.txt");
		//public void write(byte[] b):写一个字节数组
		byte[] bys={97,98,99,100,101};
		  //public void write(byte[] b,int off,int len):写一个字节数组的一部分
	    fos.write(bys,1,3);
	      //释放资源
		fos.close();
	}
}

运行结果

思考

为什么是bcd而不是98,99,100?
        字符编码问题

1.3输入流

1.3.1构造方法

【Java】I/O流—字节流与字符流的基础入门_第7张图片

1.3.2成员方法

【Java】I/O流—字节流与字符流的基础入门_第8张图片

(1).前三个read()方法都是用来读数据的,分按字节读取和按字节数组读取

(2).进行I/O流操作时,应该调用close()方法关闭流,从而释放当前I/O流所占的系统资源

1.3.3实例练习

FileInputStream操作步骤

1.创建字节输入流对象

2.调用write()方法

3.关闭流,释放资源

实例练习1(一次读取一个字节)

【Java】I/O流—字节流与字符流的基础入门_第9张图片

代码如下

package StreamDemo;

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

public class FileInputStreamDemo1 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		FileInputStream fin1 = new FileInputStream("fin1.txt");
		int b=0;
		while((b=fin1.read())!=-1) {  
			System.out.print((char)b);
		}
		fin1.close();
	}
}

运行结果

【Java】I/O流—字节流与字符流的基础入门_第10张图片

实例练习2(一次读取一个数组)

【Java】I/O流—字节流与字符流的基础入门_第11张图片

代码如下

package StreamDemo;

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

public class FileInputStreamDemo2 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		FileInputStream fin2 = new FileInputStream("fin2.txt");
		byte []bys =new byte[1024];
		int len=0;
		while((len=fin2.read(bys))!=-1) {
			String string = new String(bys,0,len);
			System.out.println(string);
		}
	}
}

运行结果

【Java】I/O流—字节流与字符流的基础入门_第12张图片

二.字符流

2.1定义

2.1.1说明

除了字节流,JDK还提供了用于实现字符操作的字符流,同字节流一样,字符流也有两个抽象的顶级父类,分别是ReaderWriter

【Java】I/O流—字节流与字符流的基础入门_第13张图片

2.2输出流

2.2.1构造方法

【Java】I/O流—字节流与字符流的基础入门_第14张图片

2.2.2成员方法

继承OutputStreamReader类的方法

public void write(int c):写一个字符

public void write(char[] cbuf):写一个字符数组

public void write(char[] cbuf,int off,int len):写一个字符数组的一部分

public void write(String str):写一个字符串

public void write(String str,int off,int len):写一个字符串的一部分

2.2.3实例练习

实例练习1

代码如下

package FileWrite;
import java.io.FileWriter;
import java.io.IOException;
public class FileReaderDemo {
	public static void main(String[] args) throws IOException {
		FileWriter fw = new FileWriter("fw.txt");
		fw.write('a');
		fw.write(97);
		fw.close();
	}
}

运行结果

【Java】I/O流—字节流与字符流的基础入门_第15张图片

实例练习2

代码如下

package FileWrite;
import java.io.FileWriter;
import java.io.IOException;
public class FileReaderDemo1 {
	public static void main(String[] args) throws IOException {
		FileWriter fw = new FileWriter("fw.txt");
		fw.write('a');
		fw.write(97);
		fw.flush();
		fw.write("\nhello");
		fw.close();
	}
}

运行结果

【Java】I/O流—字节流与字符流的基础入门_第16张图片

思考:close()和flush()的区别?

 A:close()关闭流对象,但是先刷新一次缓冲区。关闭之后,流对象不可以继续再使用了。

 B:flush()仅仅刷新缓冲区,刷新之后,流对象还可以继续使用。

2.3输入流

2.3.1构造方法

【Java】I/O流—字节流与字符流的基础入门_第17张图片

2.3.2成员方法

继承InputStreamReader类的方法

int read():一次读取一个字符

int read(char[] chs):一次读取一个字符数组

2.3.3实例练习

实例练习1(一次读取一个字符)

代码如下

package FileReader;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo {
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		FileReader fr = new FileReader("a.txt");
		 int ch = 0;
		 while ((ch = fr.read()) != -1) {
		 System.out.print((char) ch);
		 }
	}
}

实例练习2(一次读取一个字符数组)

代码如下

package FileReader;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo1 {
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		FileReader fr = new FileReader("b.txt");
		char[] chs = new char[1024];
		int len = 0;
		while ((len = fr.read(chs)) != -1) {
			System.out.print(new String(chs, 0, len));
		}
		fr.close();
	}
}

学习编程需要勤加练习,勇于实践,建议大家亲自动手实践练习,这样才能不断进步,掌握编程技巧,欢迎大家在评论区进行讨论。

【Java】I/O流—字节流与字符流的基础入门_第18张图片


你可能感兴趣的:(Java,java,eclipse,java-ee,I/O流)