io流的概述和分类
概念
- I表示 Intput,输入
-
IO流的作用
输入流:读取文件中已经存在的数据到程序中
-
顶级父类(抽象的)
字节流 字节输入流InputStream 字节输出流OutputStream
字符流 字符输入流Reader 字符输出流Writer
:::字节流写数据API
字节输出流的顶级父类OutputStream是抽象的, 我们可以使用它的子类FileOutputStream操作文件
构造方法
FileOutputStream(String name)通过路径名创建字节输出流,数据将会写到文件中
FileOutputStream(File file)通过File对象创建字节输出流,数据将会写到文件中
常用方法
void write(int b) 一次写一个字节数据
- void write(byte[] b) 一次写一个字节数组数据
void write(byte[] b, int off, int len) 一次写一个字节数组的部分数据
数据追加续写和换行
public FileOutputStream(String name,boolean append) 参数为true, 以追加的形式写数据到文件, 不会覆盖文件
换行符
windows:\r\n
- linux:\n
- mac:\r
String和byte数组转换API
- String转成byte[]
- byte[] getBytes() 将String的内容转成byte[]
byte[]转成String
FileInputStream(String name) 通过文件路径创建字节输入流对象,读取指定文件的内容
- FileInputStream(File file) 通过File对象创建字节输入流对象,读取指定文件的内容
常用方法
int read() 从流中读取一个字节,返回字节内容
int read(byte[] b) 从流中读取多个字节保存参数的数组中,返回读取的自己数量 :::
字符流读数据API
字节流一次读一个字节会出现读取中文乱码问题所以可以使用字符流
字符输入流的顶级父类Reader是抽象的, 我们可以使用它的子类 FileReader 操作文件
构造方法
- FileReader(String fileName) 根据字符串路径,指定读取的文件
FileReader(File file) 根据File对象,指定读取的文件
常用方法
int read() 从流中读取一个字符,返回读取到的字符,读不到返回-1
int read(char[] b) 从流中读取多个字符保存到字符数组中,返回读取的字符个数,读不到返回-1 :::
字符流写数据API
字符输出流的顶级父类Writer是抽象的, 我们可以使用它的子类 FileWriter 操作文件
构造方法
FileWriter(String fileName) 根据字符串路径,写出数据到文件
FileWriter(File file) 根据File对象,写出数据到文件
常用方法
void write(int c) 写一个字符到流中,如果是数字,会转为码表上对应的字符写出
- void write(char[] cbuf) 写入一个字符数组到流中
- void write(char[] cbuf, int off, int len) 写入字符数组的一部分到流中
- void write(String str) 写一个字符串到流中
void write(String str, int off, int len) 写一个字符串的一部分到流中 :::
flush和close的区别
:::tips
flush() 刷新流,还可以继续写数据
close() 关闭流,但是在关闭之前会自动刷新流;一旦关闭,就不能再写数据
注意:
使用FileWrite写完数据后,记得要刷新或者关闭流,否则数据不会进入文件 :::
public static void main(String[] args) throws IOException {
//FileOutputStream(文件地址);
//不管a.txt是否存在,创建流的时候都会覆盖原文件,创建一个新的
//FileOutputStream stream = new FileOutputStream("Day10FileIO\\FileWrite\\a\\b.txt");
//true表示在原来文件基础上追加内容
FileOutputStream stream =
new FileOutputStream("Day10FileIO\\FileWrite\\a\\b.txt", true);
//往a.txt中写入一个字节
/*stream.write(65);
stream.write(66);
stream.write(67);*/
/*byte[] arr1 = {97, 98, 99, 100, 101};
stream.write(arr1);
stream.write(arr1, 1, 3);*/
for (int i = 0; i < 3; i++) {
stream.write("爪哇基础\n".getBytes());
}
//关闭流
stream.close();
}
public static void main(String[] args) throws Exception{
FileInputStream stream = new FileInputStream("Day10FileIO\\FileWrite\\a\\a.txt");
//获取单个字节,读取结束返回-1
/*int read = stream.read();
System.out.println(read);*/
//循环获取字节,到-1时结束
/*while (true) {
int read = stream.read();
if (read != -1) {
System.out.println(read);
}else {
break;
}
}*/
int read;
while ((read = stream.read()) != -1) {
System.out.println(read);
}
stream.close();
}
public static void main(String[] args) throws Exception {
FileInputStream input = new FileInputStream("Day10FileIO\\FileWrite\\a\\a.txt");
//定义一个长度为3的字节数组,每次读取3个字节到数组里
//如果String(arr, 0, len),不加0,跟len,读到最后会保存旧的数组值
//例:"hello" arr[3] = {hel} {lol}
//当读取结束会返回-1
/*byte[] arr = new byte[3];
int len = input.read(arr);
System.out.println(new String(arr, 0, len));*/
byte[] arr = new byte[1024];
int len;
while ((len = input.read(arr)) != -1) {
System.out.println(new String(arr, 0 ,len));
}
input.close();
}
public static void main(String[] args) throws Exception {
FileInputStream input = new FileInputStream("E:\\File\\picture.jpg");
FileOutputStream output = new FileOutputStream("Day10FileIO\\FileWrite\\a\\picture.jpg");
byte[] arr = new byte[1024];
int len;
while ((len = input.read(arr)) != -1) {
output.write(arr, 0, len);
}
input.close();
output.close();
}
public static void main(String[] args) {
//String 转 byte数组
String s1 = "abcde";
byte[] arr1 = s1.getBytes();
System.out.println(Arrays.toString(arr1));
String s2 = "爪哇";
byte[] arr2 = s2.getBytes();
System.out.println(Arrays.toString(arr2));
//byte数组转String
byte[] arr3 = {-25, -120, -86, -27, -109, -121};
String s3 = new String(arr3);
System.out.println(s3);
//byte数组转String,索引从0开始往后取3个
byte[] arr4 = {97, 98, 99, 100, 101};
String s4 = new String(arr4, 0, 3);
System.out.println(s4);
//字符串转字符数组
char[] arr5 = s1.toCharArray();
System.out.println(Arrays.toString(arr5));
}
/* 目标:使用FileWriter写出数据到文件 小结: 1.字符输出流: Writer是字符输出流的抽象父类。 FileWriter继承了Writer,用于从程序写出数据到文件。 2.FileWriter构造方法: FileWriter(String fileName) 3.FileWriter写数据的方法: void write(int c) 写一个字符到流中 void write(char[] cbuf) 写入一个字符数组到流中 void write(char[] cbuf, int off, int len) 写入字符数组的一部分到流中 void write(String str) 写一个字符串到流中 void write(String str, int off, int len) 写一个字符串的一部分到流中 4.close和flush方法的区别 flush(): 刷新缓冲区, flush后可以再写数据。 close(): 关闭文件,关闭文件前会自动flush, close后不能再写数据 */ public class DemoFileWrite { public static void main(String[] args) throws Exception { //FileWriter fWriter = new FileWriter("Day10FileIO\\FileWrite\\a\\a.txt"); FileWriter fWriter = new FileWriter("Day10FileIO\\FileWrite\\a\\a.txt", true); //fWriter.write(65); /*char[] chars = {65, 66, 67}; fWriter.write(chars);*/ /*char[] chars = {65, 66, 67, 68, 69}; fWriter.write(chars, 1, 3);*/ //fWriter.write("abcdedf"); fWriter.write("abcdedf", 0, 1); fWriter.close(); } }
public class DemoReader { public static void main(String[] args) throws Exception { //创建字符输入流 FileReader reader = new FileReader("Day10FileIO\\FileWrite\\a\\b.txt"); /*int read = reader.read(); System.out.println((char) read);*/ //循环一次读取一个字符 /*int ch; while ((ch = reader.read()) != -1) { System.out.println((char)ch); }*/ //重点 //一次读取多个字符,把读到的内容装进字符数组,读取结束返回-1 char[] arr = new char[1024]; int len; while ((len = reader.read(arr)) != -1) { System.out.println(new String(arr, 0, len)); } reader.close(); } }