1 IO(Input Output)流概述
IO流用来处理设备之间的数据传输。java对数据的操作是通过流的方式。java用于操作流的对象都在IO包中
流按操作的数据分为两种:字节流和字符流(字符流里面融合了编码表来处理文字,处理图片用字节流,通用字节流)
流按流向分为:输入流和输出流(Input(输入)和Output(输出)都是相对于内存而言的,从硬盘读取数据到内存中就是输入,从内存中往硬盘里写数据,就是输出)
字符流的由来:其实就是字节流读取文字字节数据后,不直接操作而是先查指定的编码表,获取对应的文字,再对这个文字操作,简单说就是字节流+编码表
IO流常用基类:
字节流的抽象基类:InputStream,OutputStream
字符流的抽象基类:Reader,Writer
2 字节流(OutputStream与InputStream)
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStream_FileInputStream {
public static void main(String[] args) throws IOException {
demo_Write();
demo_Read();
}
public static void demo_Read() throws IOException {
//1.创建一个读取流对象,和指定文件相关联
FileInputStream fis = new FileInputStream("F:\\ByteDemo.java");
//System.out.println(fis.available());//返回该文件的字节数
/*
* 这种方法如果文件非常大,不安全容易内存溢出,如果文件小可以使用该方法
byte[] b = new byte[fis.available()];
fis.read(b);
System.out.println(new String(b));
*/
// 建议使用这个方法
byte[] b = new byte[1024];
int len = 0;
while((len = fis.read(b))!= -1){
System.out.println(new String(b,0,len));
}
/*
int ch = 0;
while((ch = fis.read())!= -1){
System.out.println((char)ch);
}
*/
/*
int ch = fis.read();
System.out.println(ch);
*/
fis.close();
}
public static void demo_Write() throws IOException {
//1.创建字节输出流对象,用于操作文件
FileOutputStream fos = new FileOutputStream("F:\\ByteDemo.java");
//2.写数据,直接写入到了目的地中
fos.write("huangjianfeng".getBytes());
//fos.flush();可以不用刷新
fos.close();//关闭资源要做
}
}
3 字符流(Reader)
(1)字符流-FileReader-读取方式一:
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo {
public static void main(String[] args) throws IOException {
//创建一个文件读取流对象,和指定名称的文件相关联
//要保证该文件时已经存在,如果不存在,会发生异常FileNotFoundException
FileReader fr = new FileReader("F:\\demo.txt");
//调用读取流对象的read方法,一次读一个字符,会自动往下读
/*
int ch = fr.read();//当读完全部之后,再往下读会返回-1,表示已经读完了
System.out.println("ch="+(char)ch);
*/
/*
while(true){
int ch = fr.read();
if(ch == -1)
break;
System.out.println("ch="+(char)ch);
}
*/
int ch = 0;
while ((ch = fr.read()) != -1){
System.out.println("ch="+(char)ch);
}
}
}
(2)字符流-FileReader-读取方式二:
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo2 {
public static void main(String[] args) throws IOException {
//创建读取字符数据的流对象,在创建读取流对象时,必须要明确被读取的文件,一定要确定该文件是存在的
FileReader fr = new FileReader("F:\\demo.txt");
//定义一个字符数组,用于存储读到的字符
//该read(char[])返回的是读到字符个数
char[] ch = new char[1024];
int num = 0;
while ((num=fr.read(ch)) !=-1){
System.out.println(num+"....."+new String(ch,0,num));
}
fr.close();
}
}
4 字符流(Writer)
字符流的特点:如果要操作 文字数据,建议优先考虑字符流。
数据的最常见体现形式:文件
需求:在硬盘上,创建一个文件并写入一些文字数据(FileWriter:专门用于操作文件的Writer子类对象)
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo {
public static void main(String[] args)throws IOException {//之所以要抛出异常或try是因为要操作的文件的路径可能错误
//创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件
//而且该文件会被创建到指定目录下,如果该目录下已有同名文件,将被覆盖
//其实该步就是在明确数据要存放的目的地
FileWriter fw = new FileWriter("F:\\demo.txt");
fw.write("zonghadfdasfasd");//只是写到了内存中 也就是写到流中
fw.flush();//刷新该流的数据,就是将流中的数据刷到目的地中
fw.close();//关闭流资源,关闭之前会刷新一次内部的缓冲中的数据,将数据刷到目的地中
//和flush的区别:flush刷新后,流可以继续使用,close刷新后,会将流关闭(其实就是先调用了flush方法再关闭的)
}
}
文件的续写,已有文件的数据续写
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo {
private static final String LINE_SEPARATOR = System.getProperty("line.separator");//获取当前系统的换行符
public static void main(String[] args) throws IOException {
//传递一个true参数,代表不覆盖已有的文件,并在已有文件的末尾处进行数据续写,记得要对异常进行处理,不能抛
FileWriter fw = new FileWriter("F:\\dmeo.txt",true);
fw.write("huang\r\njianfeng");// \r\n能让文件中的内容在windows下换行,
fw.flush();
fw.write("zhonghua"+LINE_SEPARATOR+"renming");
fw.flush();
fw.close();
}
}
5 File类(构造函数)
File类:用来将文件或者文件夹封装成对象方便对文件或或文件夹的属性信息进行操作File对象可以作为参数传递给流的构造函数
import java.io.File;
public class FileDemo {
public static void main(String[] args) {
constructorDemo();
}
public static void constructorDemo() {
//可以将一个已存在或不存在的文件或在目录封装成file对象
File f1= new File("F:\\B.txt");
File f2 = new File("F:\\","B.txt");
File f = new File("F:\\");
File f3 = new File(f,"B.txt");
File f4 = new File("F:"+File.separatorChar+"b.txt");//File.separator获得分隔符
System.out.println(f4);
}
}
6 File类-常见的方法
获取:
1获取文本名称
2获取文件路劲
3获取文件大小
4获取文件修改或创建时间
import java.io.File;
import java.text.DateFormat;
import java.util.Date;
public class FileGetMethodDemo {
public static void main(String[] args) {
getDemo();
}
public static void getDemo() {
File file = new File("F:\\a.txt");
//获取文本名称
String name = file.getName();
//获取文件的绝对路径
String absPath = file.getAbsolutePath();
//获取文件的相对路劲
String path = file.getPath();
//获取文件的大小
long len = file.length();
//获取文件修改时间
long time = file.lastModified();
//格式化时间
Date date = new Date(time);
DateFormat dateformat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
String str_time = dateformat.format(date);
System.out.println("name="+name+"\nabsPath="+absPath+"\npath="+path+"\nlen="+len+"\ntime="+str_time);
}
}
文件的创建与删除:
import java.io.File;
import java.io.IOException;
public class File_CreatAndDeleteDemo {
public static void main(String[] args) throws IOException {
CreateAndDeleteDemo();
}
public static void CreateAndDeleteDemo() throws IOException {
File file = new File("F:\\a.txt");
//如果指定的文件不存在并成功地创建,则返回 true;如果指定的文件已经存在,则不创建,不会覆盖原有的文件返回 false
boolean b = file.createNewFile();
System.out.println(b);
boolean d = file.delete();
System.out.println(d);
}
}
文件夹的创建与删除:
import java.io.File;
import java.io.IOException;
public class File_CreatAndDeleteDemo {
public static void main(String[] args) throws IOException {
CreateAndDeleteDemo();
}
public static void CreateAndDeleteDemo() {
File dir = new File("F:\\abc");
//File dir = new File("F:\\abc\\b\\c\\d\\e\\f\\c");
//boolean b = dir.mkdirs();//创建多级目的,删除的话,只能删掉最里面的那个目录
boolean b = dir.mkdir();//只能创建一级目录
System.out.println(b);
//boolean d = dir.delete();//如果要删除的文件不为空,则删除不成功
//System.out.println(d);
}
}
判断:
import java.io.File;
public class File_isDemo {
public static void main(String[] args) {
isDemo();
}
public static void isDemo(){
File file = new File("F:\\a.txt");
file.mkdir();
//最好先判断文件是否存在,可以用于在删除的时候先判断一下文件是否存在,因为有可能文件正在被操作的时候是删除不了的,因为删除调用的是windows底层的方法
boolean b = file.exists();
System.out.println(b);
//判断是否是文件,如果文件不存在为false
System.out.println(file.isFile());
//判断是否是目录
System.out.println(file.isDirectory());
}
}
重命名:
import java.io.File;
public class File_RenameTo {
public static void main(String[] args) {
RenameTo();
}
//重命名还可以用于剪切文件
private static void RenameTo() {
File file1 = new File("F:\\42-IO流(Proes集合的-基本功能).avi");
File file2 = new File("E:\\huangjianfeng.avi");
boolean b = file1.renameTo(file2);
System.out.println(b);
}
}