流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作
public class IO_01_FileInputStream_01 {
public static void main(String[] args) {
FileInputStream fis = null;
try {
//打开对应文件数据
fis=new FileInputStream("./src/Day19/Test_01.java");
//read:读取文件中一个字节,返回下一个字节对应的ASCLL码值
//到达文件末尾(读完了,没有可读数据)返回-1
System.out.println((char)fis.read());
System.out.println((char)fis.read());
System.out.println((char)fis.read());
System.out.println((char)fis.read());
System.out.println((char)fis.read());
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
//一定要记得关闭资源
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class IO_02_FileInputStream_02 {
public static void main(String[] args) {
// java7 后可自动关闭资源
try (FileInputStream fis=new FileInputStream("./src/Day19/Test_01.java")){
int temp=0;
//只要 read() 不返回-1就一直循环,返回-1说明已读完
while((temp=fis.read())!=-1){
//如果不用char进行强转,输出的就是ASCLL码值
System.out.println((char)temp);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class IO_03_FileInputStream_03 {
public static void main(String[] args) {
// java7 后可自动关闭资源
try (FileInputStream fis=new FileInputStream("./src/Day19/Test_01.java")){
//read方法重载,可以传入byte数组,用来提高读取效率,一次读取一个数组
//available():获取可读取的个数
System.out.println("可读取个数:"+fis.available());
//byte[] bytes=new byte[fis.available()];这样就是一次读取全部字节
byte[] bytes=new byte[1024];
int temp=0;
//只要 read() 不返回-1就一直循环,返回-1说明已读完
while((temp=fis.read(bytes))!=-1){
//0就是开始位置,temp就是读取长度,为了防止多读,
//因为数组并没有重新创建,只是新数据覆盖了旧数据
System.out.println(new String(bytes,0,temp));
//new String(bytes)作用:根据已有的字节(字符)数组bytes进行创建String对象
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class IO_04_FileReader {
public static void main(String[] args) {
// FileReader:字符流,一次读取一个字符
try (FileReader fr=new FileReader("./src/Day19/Test_01.java")){
char[] chars=new char[1024];
int temp=0;
//只要 read() 不返回-1就一直循环,返回-1说明已读完
while((temp=fr.read(chars))!=-1){
System.out.println(new String(chars,0,temp));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
//可以传入两个参数 , ( 文件路径 ,写出方式 ) 写出方式:true 表示追加写出 false 表示覆盖写出
FileOutputStream fos=new FileOutputStream("./src/test.txt",false);
//如果只写文件路径则 默认写出方式 为 false
public class IO_05_FileOutputStream {
public static void main(String[] args) {
try (
//可以传入两个参数 , ( 文件路径 ,写出方式 ) 写出方式:true 表示追加写出 false 表示覆盖写出
FileOutputStream fos=new FileOutputStream("./src/test.txt",false);
//如果只写文件路径则 默认写出方式 为 false
){
byte[] bytes={99,66,55,33,22,11};
//写出自己数组中所有内容
fos.write(bytes);
//写出数组中特定范围内元素
fos.write(bytes, 0, 2);
//写出int类型
fos.write(97);
//不能直接写出字符串,需要转换为字节数组
bytes="你好".getBytes();//String中的方法,很重要
fos.write(bytes);
//刷缓存
fos.flush();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class IO_06_FileWriter {
public static void main(String[] args) {
try ( //字符输出
FileWriter fw=new FileWriter("./src/test.txt");
){
//写出int型
fw.write(97);
char[] chars={'a','b','和'};
fw.write(chars);
fw.write(chars, 0, 2);
//写出字符串
fw.write("嗨嘿哈");
//写出字符串中特定个数
fw.write("嗨嘿哈", 0, 2);
//刷缓存
fw.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
特点:
public class IO_07_BufferedReader {
public static void main(String[] args) {
//节点流的构造方法是传入文件路径
//所有的处理流的构造方法传入的都是节点流对象
//只要处理流关闭,节点流也会关闭
try(
//字节输入,,,,概念神,只要有路径,什么都能输入,和FileOutputStream相对,只要有路径,什么都能输出
FileInputStream fis =new FileInputStream("./src/test.txt");
//字节输入缓冲
BufferedInputStream bis=new BufferedInputStream(fis);
//字符输入
FileReader fr=new FileReader("./src/test.txt");
//字符输入缓冲
BufferedReader br=new BufferedReader(fr);
) {
//读取一行数据 ,返回读到的字符串,到达文件末尾返回null
//readLine()
String temp=null;
while ((temp=br.readLine()) != null) {
System.out.println(temp);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class IO_08_BufferedWriter {
public static void main(String[] args) {
try (
//字节输出
FileOutputStream fos=new FileOutputStream("./src/test.txt",true);
//字节输出缓冲流
BufferedOutputStream bos=new BufferedOutputStream(fos);
//字符输出
FileWriter fw =new FileWriter("./src/test.txt",true);
//字符输出缓冲流
BufferedWriter bw=new BufferedWriter(fw);
){
bw.write("你好");
//新的 换行方法
bw.newLine();
bw.write("你也好");
//刷缓存
bw.flush();
} catch (Exception e) {
// TODO: handle exception
}
}
}
public class IO_09_InputStreamReader {
public static void main(String[] args) {
try (
//字节输入流
FileInputStream fis =new FileInputStream("./src/test.txt");
//转换为字符流
InputStreamReader isr=new InputStreamReader(fis);
//字符输入缓冲流
BufferedReader br =new BufferedReader(isr);
){
System.out.println(br.readLine());
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class IO_10_InputStreamReader {
public static void main(String[] args) {
try (
FileInputStream fis=new FileInputStream("./src/a.txt");
//如果编码不一致会出现乱码问题,此时可以通过构造方法解决
//通过记事本保存的时候,选择另存为,设置编码为ANSI(GBK)格式
//由于我们的开发环境是UTF-8,所以读到的是乱码
//要么把eclipse的开发环境修改为GBK,要么把文件的编码改为UTF-8,要么就是创建流对象的之前指定编码
InputStreamReader isr =new InputStreamReader(fis,"GBK");
BufferedReader br=new BufferedReader(isr);
){
System.out.println(br.readLine());
} catch (Exception e) {
// TODO: handle exception
}
}
}
public class IO_11_PrintStream {
public static void main(String[] args) {
try (
//打印流中提供了很多println方法,可以更加方便的打印各种类型
FileOutputStream fos=new FileOutputStream("./src/test.txt");
PrintStream ps=new PrintStream(fos);
){
ps.println("hahha");
ps.println(true);
ps.println(66.6);
//平常用的打印语句就是这个打印流,只不过System中有三个标准流
//in 是标准输入(控制台)out 是标准输出(控制台) err是错误打印
System.out.println(666);
//可以指定System中的打印流对象,可以让后面的输出语句将内容输出到指定文件而不是控制台
System.setOut(ps);
System.out.println("666666");
System.out.println("哈哈哈");
} catch (Exception e) {
e.printStackTrace();
}
}
}