IO流
本质就是数据传输的一种机制 InputStream OutputStream 输入流输出流
根据数据传输的方向:往内存传输数据----输入流 往内存外传输数据----输出流
根据数据传输的方式:字符流、字节流
javaIO流的四大基本流
字符流 | 字节流 | |
---|---|---|
输出流 | 字符输出流(Writer) | 字节输出流 (OutputStream) |
输入流 | 字符输入流 (Reader) | 字节输入流(InputStream) |
四大基本流对应的类都是抽象类
数据存储/获取的位置(数据传输的场景):硬盘、内存、网络、外设设备
硬盘
字符:
往硬盘上一个txt文件写入数据 字符输出流 文件----FileWriter
从一个硬盘的txt文件读取数据 字符输入流 文件----FileReader
字节:
往硬盘上一个txt文件写入数据 字节输出流文件-----FileOutputStream
从一个硬盘的txt文件读取数据 字节输入流文件------FileInputStream
缓冲流(用于提供缓冲区)
BufferReader:给字符输入流提供缓冲区
BufferWriter:给字符输出流提供一个更大的缓冲区,newLine换行
转换流
OutputStreamWriter------字符流转成字节流
InputStreamReader------字节流转成字符流
系统流:
System.out System.err System.in
系统流都是静态的不能关流
模式:遇到同类问题,提供统一的解决方法
设计模式:在软件开发中,遇到一类问题,提供统一的解决方案
装饰者设计模式:通过同类对象给本类对象增强功能或者完善功能
异常的处理:
1、在try块外进行声明对象,在try块里进行对象的初始化
2、保证对象已经进行正常的初始化才能进行关流操作
3、不管是关流成功还是失败都要对对象进行置为无用对象的操作,然后垃圾回收
4、流关闭失败可能是在自动冲刷缓冲区之前,保证数据不会滞留在缓冲区中,自己进行手动冲刷缓冲区
往硬盘上一个txt文件写入数据 字符输出流 文件----FileWriter
public class WriterDemo1 {
public static void main(String[] args) throws IOException {
//创建FileWriter对象
//检测路径正确与否
//如果路径正确但是没有具体的文件就会创建一个空文件
//如果文件已经存在就会再创建一个空文件覆盖之前的文件
//保证在写数据之前有一个空文件
FileWriter writer=new FileWriter("D:\\1.txt");
//写数据
//底层基于缓存区进行数据传输
//默认要求缓存区数据装满才能进行传输
//下面的数据没有装满,缓存区就没有进行传输
writer.write("您好...");
//冲刷缓存区
//不管缓存区数据有没有存满都要进行传输
//防止数据滞留在缓存区产生数据丢失
writer.flush();
//关闭连接通道----关流
//在关闭通道之前会自动进行冲刷缓存区
writer.close();
//强制对象值为null
//把对象置为无用对象,在某个时间进行垃圾回收
writer=null;
}
}
public class FileWriterDemo2 {
public static void main(String[] args) {
//创建FileWriter对象
//1、声明FileWriter对象
FileWriter writer=null;
try {
//对象真实赋值
writer=new FileWriter("D:\\a.txt");
//写出数据
writer.write("123");
//4、手动冲刷缓冲区
writer.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {//不管try块里的代码正确与否都要关流
//2、保证对象初始化成功有值才能正确调用关流方法
//为null的对象不用处理
if(writer!=null) {
try {
writer.close();//关流可能失败
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//3、对象置为无用对象----垃圾回收
writer=null;
}
}
}
}
}
jdk1.7新特性
public class FileWriterDemo3 {
public static void main(String[] args) {
//jdk1.7提供了try-with-resources
//自动冲刷缓冲区、关流
try(FileWriter writer=new FileWriter("D:\\3.txt")) {
writer.write("555");
} catch (Exception e) {
// TODO: handle exception
}
}
}
从一个硬盘的txt文件读取数据 字符输入流 文件----FileReader
public class FileReaderDemo1 {
public static void main(String[] args) throws IOException {
//创建FileReader对象
FileReader reader=new FileReader("D:\\3.txt");
//读取数据
//返回的是读取到字符的编码值
//读取结束的标志就是返回-1
/*System.out.println((char)reader.read());
System.out.println((char)reader.read());
System.out.println((char)reader.read());
System.out.println(reader.read());*/
int len=-1;//提供变量供给读取数据覆盖
while((len=reader.read())!=-1) {//避免读取两次情况高永杰
System.out.println(len);
}
//关流---输入流没有缓存区
reader.close();
}
}
public class FileReaderDemo2 {
public static void main(String[] args) throws IOException {
//创建FileReader对象
FileReader reader=new FileReader("D:\\a.txt");
//读取数据
//自建缓冲区---数组----字符流---字符数组
char[] cs=new char[3];
int len=-1;
//reader.read(字符数组)---返回的值就是每次读取到的字符的个数
while ((len=reader.read(cs))!=-1) {//读取到的数据存放到数组
//System.out.println(new String(cs));
System.out.println(new String(cs,0,len));
}
//关流
reader.close();
}
}
实现文件的复制
package cn.tedu.io.reader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
*@author 作者:
*@version 创建时间:2020年10月28日下午9:26:06
*@description 描述:实现文件的复制
*/
public class FileCopyText1 {
public static void main(String[] args) {
//声明IO流
FileReader reader=null;
FileWriter writer=null;
//对象的初始化---指明两个文件的路径
try {
reader=new FileReader("D:\\1.txt");
writer=new FileWriter("D:\\a\\1.txt");
//获取数据
//自建数组缓冲区
char[] cs=new char[1024*1024*10];//读取1M
int len=-1;//接受每次返回的字符的个数
while ((len=reader.read())!=-1) {
//写出数据
writer.write(cs,0,len);
//writer.write(new String(cs,0,len));
//冲刷缓冲区
writer.flush();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(reader!=null) {
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
reader=null;
}
}
if(writer!=null) {
try {
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
writer=null;
}
}
}
}
}
缓冲流buffer
public class BufferReaderDemo1 {
public static void main(String[] args) throws IOException {
//创建缓冲对象
//真正读取内容的流对象是FileReader,字符输入流
//缓冲流对象只是给字符输入流提供了一个缓冲区
BufferedReader br=new BufferedReader(new FileReader("D:\\3.txt"));
//读一行---结束标志位null
//System.out.println(br.readLine());
//System.out.println(br.readLine());
String str="";
while((str=br.readLine())!=null) {
System.out.println(str);
}
}
}
输出.Java文件有多少行代码
package cn.tedu.javacounttext;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
/**
*@author 作者:
*@version 创建时间:2020年10月26日下午9:46:24
*@description 描述:统计工作空间下所有.java文件里代码的总行数
*/
public class CountJavaLine {
//
static int count;
public static void main(String[] args) throws IOException {
//
File file=new File("D:\\yy2");
countJavaLine(file);
System.out.println(count);
}
public static void countJavaLine(File file) throws IOException {
if(file.isDirectory()) {
File[] fs=file.listFiles();
for (File f : fs) {
countJavaLine(f);
}
}else if(file.getName().endsWith(".java")) {
BufferedReader br=new BufferedReader(new FileReader(file));
while (br.readLine()!=null) {
count++;
}
}
}
}
public class BufferWriterDemo1 {
public static void main(String[] args) throws IOException {
//
BufferedWriter bw=new BufferedWriter(new FileWriter("D:\\b.txt"));
//写出数据
bw.write("abc");
//换行
//不同操作系统下的换行符不一样
//window-----\r\n linux----\n
bw.newLine();
bw.write("123");
//关流---冲刷缓冲区
bw.close();
}
}
public class FileOutPutStreamDemo1 {
public static void main(String[] args) throws IOException {
//创建字节输出流对象----没有缓冲区 true表明文件可追加
FileOutputStream os=new FileOutputStream("D:\\c.txt",true);
//写出数据
//os.write("abc中".getBytes());//获取字节数组
os.write("中".getBytes("utf-8"));
//关流
os.close();
}
}
public class FileInputStreamDemo1 {
public static void main(String[] args) throws IOException {
//字节输入流对象
FileInputStream is=new FileInputStream("D:\\c.txt");
//读取数据 结束标志是-1
//System.out.println((char)is.read());
//自建缓冲区
byte[] bs=new byte[10];
int len=-1;
while ((len=is.read(bs))!=-1) {
System.out.println(new String(bs,0,len));
}
//关流
is.close();
}
}
针对内存的IO流
public class StringReaderDemo1 {
public static void main(String[] args) throws IOException {
//字符串----内存中
String str="abc";
//创建IO流对象
StringReader sr=new StringReader(str);
//读取数据
char[] cs=new char[10];
int len=-1;
while ((len=sr.read(cs))!=-1) {
System.out.println(new String(cs,0,len));
}
}
}
字符流与字节流的转换
public class OutputStreamWriterDemo1 {
public static void main(String[] args) throws IOException {
//底层真正做传输的是字节输出流
//要写出的数是字符
//字符输出流----字节输出流
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("D:\\c.txt"));
//写出数据----字符串----字符
osw.write("abc玉如推荐");
//关流
osw.close();
}
}
public class InputStreamReaderDemo1 {
public static void main(String[] args) throws IOException {
//底层从文件读取的是字节输入流
//展示的时候使用字符输入流
//字节流----字符流
InputStreamReader isr=new InputStreamReader(new FileInputStream("D:\\c.txt"));
//读取数据----字符数组----字符----字符流
char[] cs=new char[10];
int len=-1;
while ((len=isr.read(cs))!=-1) {
System.out.println(new String(cs,0,len));
}
isr.close();
}
}
系统流
public class SystemDemo {
public static void main(String[] args) {
/*//out----字节输出流的对象
//黑色---表明输出结果
System.out.println("good");
//err-----字节输出流的对象
//红色--表明输出的错误/异常
System.err.println("err");
//in---字节输入流
//new Scanner(System.in);
*/
//
Scanner sc1=new Scanner(System.in);
String str1=sc1.nextLine();
//关流----NotSuchElementException
//sc1.close();
Scanner sc2=new Scanner(System.in);
String str2=sc2.nextLine();
sc1.close();//可以
System.out.println(str1);
System.out.println(str2);
}
}
根据字节流实现硬盘上文件的复制
public class CopyFileText {
public static void main(String[] args) throws IOException {
//创建字节流对象
FileInputStream fis=new FileInputStream("D:\\c.jpg");
FileOutputStream fos=new FileOutputStream("D:\\a\\c.jpg");
//缓冲区
byte[] cs=new byte[1024*1024];
int len=-1;
while ((len=fis.read(cs))!=-1) {
//写出数据
fos.write(cs, 0, len);
}
//关流
fis.close();
fos.close();
}
}