-
输入输出流
输入输出流 --- 读写文件
输入---读取文件中数据到自己的程序中接受处理
输出---将自己的程序中处理好的数据写入文件中
-
流的分类
按照数据的移动轨迹将流分为:输入流,输出路
按照每一次读/写数据量的大小将流分为:字节流,字符流
字节流:每一次可以读写一个字节的数据量,一个字节就是8位2进制(图片,视频,mp3...)
字符流:每一次可以读写一个字符的数据量,一个字符就是16位2进制,只能处理文本类型的数据。
详细划分:字节输入流,字节输出流 | 字符输入流,字符输出流
-
字节流相关类的使用
字节输出流 --- OutputStream --- 抽象类 --- 不能new --- 子类
-
FileOutputStream类
构造方法:
FileOutputStream(File file) --- 通过File对象创建一个不可追加的字节输出流。
File file = new File("D:" + File.separator + "20220202" + "test.txt") FileOutputStream fos = new FileOutputStream(file);
FileOutputStream(File file,boolean append) --- 通过File对象创建一个是否追加的字节输出流。
File file = new File("D:" + File.separator + "20220202" + "test.txt") FileOutputStream fos = new FileOutputStream(file,true);
FileOutputStream(String name) --- 通过String对象创建一个不可追加的字节输出流。
FileOutputStream fos = new FileOutputStream("D:" + File.separator + "20220202" + "test.txt");
FileOutputStream(String name,boolean append) --- 通过String对象创建一个是否追加的字节输出流。
String str = "D:" + File.separator + "20220202" + "test.txt"; FileOutputStream fos = new FileOutputStream(str,true); public class TestFile { public static void main(String[] args) throws Exception{ //输出 File file =new File("E:" + File.separator + "20220202" +File.separator + "test.txt"); OutputStream fos = new FileOutputStream(file); String info = "Hello,world1"; byte[] bytes = info.getBytes(); fos.write(bytes,0,5); fos.close(); System.out.println("输出成功"); }
注意:append参数如果是true就是追加(不覆盖原有的),创建输入输出流对象的时候,会自动创建出实体文件。
常用方法
void write(byte[] b)将b.length个字节从指定的字节数组写入此文件输出流。
void write(byte[] b,int off,int len)将len字节从位于偏移量offf的指定字节数组写入此文件输出流。
void write(int b)将指定的字节写入此文件输出流。
void close()关闭此文件输出流并释放与此流相关联的任务系统资源。
-
FileInputStream类
构造方法
FileInputStream(File file)通过File对象创建一个字节输入流
FileImputStream(String name)通过String对象创建一个字节输入流
常用方法
int read() --- 从该输入流读取一个字节的数据。
返回值:读取到具体字节数据的int型,如果到达文件末尾返回-1.
int read(byte[] b)从该输入流读取最多b.length个字节的数据为字节数组。
返回值:读取的总字节数,如果到达文件末尾返回-1.
void close()关闭此文件输入流并释放与流相关联的任务系统资源。
public class TestFile { public static void main(String[] args) throws Exception{ //输入流 File file = new File("E:"+ File.separator + "20220202"+ File.separator + "test.txt"); FileInputStream fis = new FileInputStream(file); byte[] bytes = new byte[(int)file.length()]; int temp = 0; int index = 0; while((temp = fis.read()) != -1){ bytes[index] = (byte) temp; index ++; } String str= new String(bytes,0,index); System.out.println(str); fis.close(); } }
-
DataOutputStream类
构造方法
DataOutputStream(OutputStream out)创建一个新的数据输出流,将数据写入指定的底层输出流。
常用方法
void writeBoolean(boolean v)---将boolean写入底层输出流作为1字节值。
void writeByte(int v)---将byte作为1字节值写入底层输出流。
void writeChar(int v)---将char写入底层输出流作为2字节值,高字节优先。
void writeDouble(double v)---双参数传递给转换long使用doubleToLongBits方法Double,然后写入改long值基础输出流作为8字节的数量,高字节。
void writeFioat(float v)---浮点参数的转换int使用floatToIntBits方法在类Float,然后写入改int值基础输出流作为一个4字节的数量,高字节。
void writeInt(int v)---将底层输出流写入int作为 四字节,高位字节。
void writeLong(long v)---将long写入底层输出流,为8字节,高字节为首。
void writeShort(int v)---将short写入底层输出流作为两个字节,高字节优先。
void writeUTF(String str)---使用modified UTF-8编码以机器无关的方式将字符串写入基础输出流。
void flush()---刷新此数据输出流。
void close()---关闭此输出流并释放与此流相关联的任务系统资源。
优点:可以直接写出基本数据类型的数据和String,且不需要转换成字节数组
缺点:保存到文件中的数据是乱码。
-
DataInputStream类
构造方法
DataInputStream(InputStream in)创建使用指定的底层InputStream的DataInputStream
常用方法
同上
-
-
字符流相关的操作类(处理文本数据)
字符输出流 --- Writer类 --- 抽象类 --- 不能new --- 子类
-
FileWriter类
构造方法
FileWriter(File file)给一个File对象构造一个FileWriter对象。
FileWriter(File file,boolean append)给一个File对象构造一个是否允许追加FileWriter对象。
FileWriter(String fileName)给一个String对象构造一个FileWriter对象。
FileWriter(String fileName,boolean append)给一个String对象构造一个是否允许追加FileWriter对象。
常用方法
void write(char[] cbuf)写入一个字符数组。
void write(char[] cbuf,int off,int len)写入字符数组的一部分。
void write(int c)写一个字符。
void write(String str)写一个字符串。
void write(String str,int off,int len)写一个字符串的一部分。
void close()关闭流,先刷新。
void flush()刷新流。
public class FileWriterTest { public static void main(String[] args) throws IOException { String str = "E:" + File.separator + "20220202" + File.separator + "test.txt"; FileWriter fileWriter = new FileWriter(str); String info = "你好,世界"; char[] chars = info.toCharArray(); fileWriter.write(chars); fileWriter.flush(); fileWriter.close(); System.out.println("写入成功"); }
-
字符输入流 --- Reader类 --- 抽象类 --- 不能new --- 子类
FileReader类
构造方法
FileReader(File file)给一个File对象构造一个FileReader对象。
FileReader(String fileName)给一个String对象构造一个FileReader对象。
常用方法
int read()---读一个字符。返回值是读取的真实字符数据的整数值,如果已经大道流的末尾,则为-1。
int read(char[] cbuf)---将字符读入数组。返回总字符数,如果到达文件末尾返回-1;
void close()---关闭流并释放与之相关联的任务系统资源。
public class FileWriterTest { public static void main(String[] args) throws IOException { File file = new File("E:" + File.separator + "20220202" + File.separator + "test.txt"); FileReader fileReader = new FileReader(file); char[] chars = new char[(int)file.length()]; int temp = 0; int index = 0; while((temp =fileReader.read()) != -1){ chars[index] = (char)temp; index ++; } String result = new String(chars, 0, index); System.out.println(result); } }
-
-
BufferedWriter类
构造方法
BufferedWriter(Writer out)---通过字符输出流的对象创建BufferedWriter
常用方法
void newLine()---写一行行分隔符。
void write(char[] cbuf,int off,int len)---写入字符数组的一部分。
void write(int c)---写一个字符。
void write(String s,int off,int len)---写一个字符串的一部分。
void close()--关闭流,先刷新。
void flush()--刷新流。
-
BufferedReader类
构造方法
BufferedReader(Reader in)通过字符输入流对象创建一个BufferedReader
常用方法
int read()---读一个字符,返回值是读取的真实字符数据的整数值,如果已经达到流的末尾,则为-1.
int read(char[] cbuf)---将字符读入数组,返回总字符数,如果到达文件末尾返回-1.
void close()---关闭流并释放与之相关联的任何系统资源。
String readLine()---读一行文字。
BufferedReader ---------Scanner
readLine() nextLine()
从文件中读取 从键盘输入中读取
问:我们能不能通过BuferedReader读取键盘输入的数据?Scanner的nextLine()方法为什么可以读取键盘输入?
答:因为Scanner对象在创建的时候使用过了System.in,System.in默认就是键盘输入,只要在创建BufferedReader对象的时候,使用System.in就可以完成键盘输入,BufferedReader(Reader in)参数是Reader字符输入流,System.in是InputStream类型字节输入流。
解决问的关键就是将InPutStream类型字节输入流转换成Reader字符输入流。下面介绍:
-
InputStreamReader类(字节输入流转换成字符输入流)
构造方法
InputStreamReader(InputStream in)---字节输入流转换成字符流(属于字符流的字符输入流)
public class Buffered { public static void main(String[] args) throws IOException { InputStreamReader inputStreamReader = new InputStreamReader(System.in); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); System.out.println("从键盘输入一些东西吧"); String s = bufferedReader.readLine(); System.out.println(s); } }
-
OutputStreamWriter类(字节输出流转换成字符输出流)
构造方法
OutputStreamWriter(OutputStream out)---将字节输出流转换成字符输出流