流是一种抽象概念,他代表了数据的无结构化传递,按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列,从流中取得数据的操作称为提取操作,而从流中添加数据的操作称为插入操作,用来进行输入输出操作的流称为lo流,换句话说,io就是以流的方式经行输入输出
就拿我们生活中的自来水厂举例,我们每个人家里喝的水都是自来水厂来的,自来水厂又是通过水源地来的 水是通过水管来的 那么这个水就可以理解为io流
Java中的IO操作主要是指使用java.io包下的内容进行输入输出操作,输入也叫读取数据,输出也叫写出数据
按照数据的流向分类:输入流与输出流 输出流:把数据从其他设备读取到内存中的流 输出流:把数据从内存中写出到其他设备上的流 格式数据的类型分:字符流和字节流
字节流:以字节为单位,读取数据的流 字符流:以字符为单位,读取数据的流
java.io.OutputStream抽象类是表示字节输出流的所有超类,将指定的字节信息输出到目的地,他定义了字节输出流的基本共性功能方法
public void close :关闭此输出流并释放与此流关联的任何资源系统 public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。 public void write(byte[] b) :将 b.length字节从指定的字节数组写入此输出流。 public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输 出到此输出流。 public abstract void write(int b) :将指定的字节输出流。
当完成流的操作时,必须调用close()方法,释放系统资源
outputStream类有很多子类,我们先来介绍java.io.Fileoutputstream类是文件输出流,用于将数据写到文件 构造方法: public FileoutputStream(File file):创建文件输出流写入指定 的File对象表示的文件 public FileOutputStream(String name) : 创建文件输出流以指定的名称写入文件。 当你创建一个流对象时,必须传入一个文件路径,该路径下,如果没有这个文件,会创建该文件,如果有这个文件,会清空这个文件的数据
public class Main {
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("a.text");
String str="程序员";
//转换为字节数组
byte[] bytes = str.getBytes();
fileOutputStream.write(97);
//以数组方式写入
fileOutputStream.write(bytes);
fileOutputStream.close();
}
}
如果不想覆盖原文件,想在原文件的基础上继续写,则可以用以下方法
public class Main {
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("a.text",true);
String str="这是续写的内容";
//转换为字节数组
byte[] bytes = str.getBytes();
//以数组方式写入
fileOutputStream.write("\r\n".getBytes());
fileOutputStream.write(bytes);
fileOutputStream.close();
}
}
结果
在windows系统中换行是\r\n
fileOutputStream.write("\r\n".getBytes());
回车符 \r 和换行符 \n : 回车符:回到一行的开头(return)。 换行符:下一行(newline)。 系统中的换行: Windows系统里,每行结尾是 回车+换行 ,即 \r\n ; Unix系统里,每行结尾只有 换行 ,即 \n ; Mac系统里,每行结尾是 回车 ,即 \r 。 从 Mac OS X开始与Linux统一。
java.io.InputStream抽象类表示字节输入流是所有类的超类,可以读取字节信息到内存中,他定义了字节输入流的基本共性功能方法
public void close() 关闭此输出流并释放与此输出流相关联的任何资源系统 public abstract int read() : 从输入流读取数据的下一个字节。 public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。
java.io.FileInputStream 类是文件输入流,从文件中读取字节。 构造方法 FileInputStream(File file) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系 统中的 File对象 file命名。 FileInputStream(String name) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件 系统中的路径名 name命名。 当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有该文件,会抛出 FileNotFoundException 。
构造代码举例 读取a.text下的内容
package File;
import java.io.FileInputStream;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("a.text");
byte[] bytes = new byte[1024];
int len;
while((len=fileInputStream.read(bytes))!=-1){
System.out.println(new String(bytes));
}
}
}
结果
使用一个一个字节读取的情况,使用字节流无法读取中文的文件。会出现乱码,所以我用英文演示
package File;
import java.io.FileInputStream;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("a.text");
int len;
int read ;
while((read=fileInputStream.read())!=-1){
System.out.println((char)read);
}
}
}
结果
使用数组读取减少了io操作数,大大提高了读写的效率,建议开发中使用
java.io.Reader 抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入 流的基本共性功能方法。 public void close() :关闭此流并释放与此流相关联的任何系统资源。 public int read() : 从输入流读取一个字符。 public int read(char[] cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。
3.1FileReader类 java.io.FileReader 类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。 小贴士:
构造方法
FileReader(File file) : 创建一个新的 FileReader ,给定要读取的File对象。 FileReader(String fileName) : 创建一个新的 FileReader ,给定要读取的文件的名称。 当你创建一个流对象时,必须传入一个文件路径。类似于FileInputStream
File file = new File("b.text");
//使用file创建流对象
FileReader reader = new FileReader(file);
//使用文件路径创建流对象
FileReader reader1 = new FileReader("b.text");
读取字符,使用read()方法,每次可以读取一个字符的数据,提升为int类型,读取到文件末尾返回-1
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("a.text");
FileReader reader = new FileReader(file);
int length;
while((length=reader.read())!=-1){
System.out.println((char)length);
}
reader.close();
}
}
结果
使用数组读取
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("a.text");
FileReader reader = new FileReader(file);
int length;
char[] bytes = new char[2];
while((length=reader.read(bytes))!=-1){
System.out.println(new String(bytes,0,length));
}
reader.close();
}
}
结果
java.io.Writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。它定义了字节 输出流的基本共性功能方法。 void write(int c) 写入单个字符。 void write(char[] cbuf) 写入字符数组。 abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分,off数组的开始索引,len 写的字符个数。 void write(String str) 写入字符串。 void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个 数。 void flush() 刷新该流的缓冲。 void close() 关闭此流,但要先刷新它
java.io.FileWriter 类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。 构造方法 FileWriter(File file) : 创建一个新的 FileWriter,给定要读取的File对象 FileWriter(String fileName) : 创建一个新的 FileWriter,给定要读取的文件的名称
代码演示
FileWriter writer = new FileWriter("b.text");
File file = new File("b.text");
FileWriter writer1 = new FileWriter(file);
使用字符串写
public class Main {
public static void main(String[] args) throws IOException {
FileWriter writer = new FileWriter("b.text");
String str="这是字符串";
writer.write(str);
writer.close();
}
}
使用字符串数组写
public class Main {
public static void main(String[] args) throws IOException {
FileWriter writer = new FileWriter("b.text");
char[] chars = "这是字符串".toCharArray();
writer.write(chars);
writer.close();
}
}
字符流,只能操作文本文件,不能操作图片,视频等非文本文件。 当我们单纯读或者写文本文件时 使用字符流 其他情况使用字节流
以上就是关于字节流字符流的一些基础知识,如有错误还请各位批评指正,喜欢我的可以关注点赞收藏嘻嘻