IO流
IO
流就是数据的传递
数据在两设备件的传输称为流,流的本质是数据传输
分类
抽象类
文件流:InputStream 字节输入流`
package Day18;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
*
*
*/
public class FileInputStream1 {
public static void main(String[] args) throws IOException {
//输入/读取:必须先找到这个文件
//绝对位置:当前文件系统的根目录为准
//相对位置:当前文件所在目录为准
//当前目录./ 上级目录../ 再上级../../ 以此类推
//ecplise当前目录是D:\workspace20210322\JavaSE(src所在目录)
//创建字节输入流对象
//相对位置
//导包,有异常抛出异常
FileInputStream file=new FileInputStream("./src/Day18/leetcode.java");
//绝对位置
//从D盘C盘等开始
FileInputStream file1=new FileInputStream("D:\\workspace20210322\\JavaSE\\src\\Day18\\leetcode.java");
//read读取的是下一个字节,如果到达文件末尾,返回-1,默认光标在顶端,读一下
//然后向下移动一位,并返回下一位的值
int i1=file.read();
int i2=file.read();
int i3=file.read();
int i4=file.read();
int i5=file.read();
//强制类型转换到char类型
System.out.println((char)i1);
System.out.println((char)i2);
System.out.println((char)i3);
System.out.println((char)i4);
System.out.println((char)i5);
//代码重复太多,可以循环读取
int a=0;
//while循环读取,因为到最后输出-1,所以条件是-1
while ((a=file.read())!=-1) {
//转换成char输出
//文字是乱码因为是char
System.out.print((char)a);
}
}
}
解决异常
package Day18;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
*
*/
public class FileInputStream2 {
public static void main(String[] args) {
//提升变量到main方法里,否则finally访问不到
//局部变量没有默认值,并且try有不执行情况,到不了finally,所以赋值null
FileInputStream file=null;
try {
file=new FileInputStream("./src/Day18/leetcode.java");
//循环读取,直到不等于-1时输出
int a=0;
while((a=file.read())!=-1) {
//强制类型转换为char
System.out.print((char)a);
}
}catch (IOException e) {
e.printStackTrace();
} finally {
//关闭资源
try {
//防止因为未找到文件导致空指针异常
if(file!=null) {
//null是自己设置的,所以为空的时候关闭
file.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
}
package Day18;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* 方法重载
* read():读取下一个字节的值并返回,如果到达文件末尾返回-1
* read(byte[] bytes):可以传入一个字节数组,返回当前读取到的字节个数,如果到文件末尾,返回-1
*
*
*/
public class FileInputStream3 {
public static void main(String[] args) throws IOException {
//放到try括号里,代码简洁
try(FileInputStream file=new FileInputStream("./src/Day18/leetcode.java");)
{
//循环读取
//传入字节数组
byte[] bytes=new byte[1000];
int a=0;
while((a=file.read(bytes))!=-1) {
//不能直接把数组转换为字符串,否则多种情况会导致数据不准确
//数组太长,长过文件中字节数的话,多出的部分会变成一堆小方格
//数组太短的话第二次读不完,会导致数据冗余
//最好读多少转换多少,方法返回值就是当前次读取个数
//转换成String后读取bytes从0位到最后一位刚刚好
System.out.println(new String(bytes,0,a));
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
OutputStream 字节输出流
package Day18;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 输出流,如果目标文件不存在,会自动创造该文件,但是不会创建目录,目录不存在会报错
*
* 1.打开流 2.写出(追加写入/覆盖写入) 3.刷缓存 4.关闭
*
* 构造方法:
* FileOutputStream(String):只需要传递需要写出的文件路径,默认覆盖写出
*
* FileOutputStream(String,boolean):只需要传递写出的文件路径
* boolean如果是true,追加写出,如果是false,覆盖写出
*
*写出方法:
* write(int b)写出一个字节
* write(byte[] bytes):写出一个数组内容
* write(byte[] bytes ,int off ,int length):写出数组中一部分,起始值和个数
*
* API
* getBytes()
*
*/
public class FileOutputStream01 {
public static void main(String[] args) throws IOException {
//创建对象,默认覆盖写出
//FileOutputStream file=new FileOutputStream("./src/Day18/leetcode.java");
//追加写出,后面写true
FileOutputStream file=new FileOutputStream("D:/天亮教育/day_18_IO/123.txt");
//写出单个内容
//A
file.write(65);
//创建一个数组
byte[] bytes= {12,23,34,45};
//输出整个数组
file.write(bytes);
//写出一部分
file.write(bytes, 0, 2);
//写出字符串
String str="李未琦";
//转换并写入
bytes=str.getBytes();
file.write(bytes);
//刷缓存
file.flush();
//关闭
file.close();
}
}
**Reader **
package Day18;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
/**
* FileReader:字符输入流,可以解决输入数据汉字的乱码问题
*
* 一般用于纯文本文件
*
*/
public class FileReader1 {
public static void main(String[] args) {
try (FileReader file=new FileReader("./src/Day18/leetcode.java");)
{
//读数据
char[] chars = new char[100];
int temp = 0;
while ( (temp = file.read(chars)) != -1 ) {
System.out.print(new String(chars,0,temp));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Writer
package Day18;
import java.io.FileWriter;
import java.io.IOException;
/**
* 字符输出流,和字节输出流一样
* 写出方法是字符数组 和 字符串
*
*/
public class FileWriter1 {
public static void main(String[] args) {
try (FileWriter file=new FileWriter("D:/天亮教育/day_18_IO/123.txt");)
{
//字符数组和字符串
file.write("李未琦");
//换行符
file.write("\n");
file.write("又一个李未琦");
//刷缓存
file.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}