常用的文件操作:
目录的操作和文件删除:
mkdir创建一级目录:D:\demo
mkdirs创建多级目录:D:\demo\a\b\c
delete删除空目录或文件
public class Directory{
public static void main(String[] args) {
//判断 d:\\news1.txt是否存在,如果存在就删除
public void m1(){
String filePath = "d:\\news1.txt";
File file = new File(filePath);
if (file.exists()) {
if (file.delete()) {
System.out.print("删除成功!!");
}
}
else{
System.out.print("该文件不存在~~");
}
}
//判断 D:\\demo02是否存在,存在就删除,否则提示不存在
//在Java编程中,目录也被当成文件
public void m2(){
String filePath = "D:\\demo02";
File file = new File(filePath);
if (file.exists()) {
if (file.delete()) {
System.out.print("删除成功!!");
}
}
else{
System.out.print("该目录不存在~~");
}
}
//判断 D:\\demo\\a\\b\\c 目录是否存在,如果存在就提示已经存在,否则就创建
public void m3(){
String directoryPath = "D:\\demo\\a\\b\\c";
File file = new File(directoryPath);
if (file.exists()) {
System.out.print("该目录已存在~~");
}else{
if(file.mkdirs()){
System.out.print(directoryPath + "创建成功");
}else{
System.out.print("创建失败~~");
}
}
}
}
}
IO流原理及流的分类:
JavaIO流原理:
- I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理数据传输。如读/写文件,网络通讯等
- Java程序中,对于数据的输入/输出操作以”流(stream)”的方式进行
- java.io包下提供了各种”流”类和接口,用以获取不同种类的数据,并通过方法输入或输出数据
- 输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(中)
- 输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中
流的分类:
按操作数据单位不同分为:字节流(8bit)对二进制文件友好,字符流(按字符)对文本文件友好
按操作流的流向不同分为:输入流,输出流
按流的角色的不同分为:节点流,处理流/包装流
(抽象基类) | 字节流 | 字符流 |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
- Java的IO流共涉及40多个类,实际上非常规则,都是从如上4个抽象基类派生的
- 由这4个类派生出来的子类名称都是以其父名作为子类名后缀
InputStream:字节输入流
InputStream抽象类是所有类字节输入流的超类
InputStream常用的子类:
- FileInputStream:文件输入流
- BufferedInputStream:缓冲字节输入流
- ObjectInputStream:对象字节输入流
例1
使用FileInputStream读取hello.txt文件,并将文件内容显示到控制台
read()方法单个字节读取,效率较低
public void readFile01(){
int readData = 0;
String filePath = "e:\\hello.txt";
FileInputStream fileInputStream = null;
//read()方法单个字节读取,效率较低
try{
//创建FileInputStream对象,用于读取文件
fileInputStream = new FileInputStream(filePath);
//从该输入流读取一个字节的数据。如果没有输入可用,此方法将阻止
//如果返回-1,表示读取完毕
while((readData = fileInputStream.read()) != -1){
System.out.print((char)readData); //转成char显示
//如果有汉字,会出现乱码
}
}catch(IOException e){
e.printStackTrace();
}finally{
try{
fileInputStream.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
使用read(byte[] b)方法读取文件,提高效率
public void readFile02(){
//字节数组
byte[] buf = new byte[8];//一次读取8个字节
int readLen = 0;
String filePath = "e:\\hello.txt";
FileInputStream fileInputStream = null;
//read()方法单个字节读取,效率较低
try{
//创建FileInputStream对象,用于读取文件
fileInputStream = new FileInputStream(filePath);
//从该输入流读取最多b.length字节的数据。此方法将阻塞,直到某些输入可用
//如果返回-1,表示读取完毕
//如果读取正常,返回实际读取的字节数
while((readLen = fileInputStream.read(buf)) != -1){
System.out.print(new String(buf,0,readLen)); //转成char显示
//如果有汉字,会出现乱码
}
}catch(IOException e){
e.printStackTrace();
}finally{
try{
fileInputStream.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
例2
使用FileOutputStream将数据写到文件中,如果该文件不存在,则创建该文件
public void writerFile(){
//创建FileOutputStream对象
String filePath = "e:\\a.txt";
FileOutputStream fileOutputStream = null;
try{
/*
1、new FileOutputStream(filePath)创建方式,当写入内容时,会覆盖原来的内容
2、new FileOutputStream(filePath,true)创建方式,当写入内容时,是追加到文件后面
*/
//得到FileOutputStream对象
fileOutputStream = new FileOutputStream(filePath);
//写入一个字节
fileOutputStream.writer("H");
//写入字符串
String str = "hello,world!"
//str.getBytes() 可以把 字符串->字节数组
fileOutputStream.writer(str.getBytes());
//或者witle(byte[] b,int off, int len)
}catch(IOException e){
e.printStackTrace
}finally{
try{
fileInputStream.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
完成文件拷贝:将e:\Koala.jpg 拷贝到c:\
/*
1、创建文件的输入流,将文件读入到程序
2、创建文件的输出流,将读取到的文件数据,写入到指定的文件
*/
String srcFilePath = "e\\Koala.jpg"
String destFilePath = "e\\Koala2.jpg"
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
//try-catch
fileInputStream = new FileInputStream(srcFilePath);
fileOutputStream = new FileOutputStream(destFilePath);
//定义一个字节数组,提高读取效果
byte[] buf = new byte[1024];
int readLen = 0;
while ((readLen = fileInputStream.read(buf)) != -1 ) {
//读取到后,就写入到文件,通过fileOutputStream
//即是一边读一边写
fileOutputStream.writer(buf,0,readLen);
}
System.out.print("拷贝成功~~");
//try-catch
finally{
//try-catch
//关闭输入流和输出流
if(fileInputStream != null){
fileInputStream.close();
}
if (fileOutputStream != null) {
fileOutputStream.close();
}
//try-catch
}
FileReader 和 FileWriter:
FileReader 和 FileWriter 是字符流,即按照字符来操作IO
FileReader相关方法:
- new FileReader(File/String)
- read:每次读单个字符,返回该字符,如果到文件末尾返回-1
- read(char[]):批量读取多个字符到数组,返回读取到的字符数,如果到文件末尾返回-1
相关API:
- new String(char[]):将char[]转换成String
- new String(char[],off,len):将char[]的指定部分转换成String
FileWriter常用方法:
- new FileWriter(File/String):覆盖模式,相当于流的指针在首段
- new FileWriter(File/String,true):追加模式,相当于流的指针在尾端
- write(int):写入单个字符
- write(char[]):写入指定数组
- write(char[],off,len):写入指定数组的指定部分
- write(string):写入整个字符串
- write(string,off,len):写入字符串的指定部分
相关API:
String类:toCharArray:将String转换成char[]
例1使用FileReader从story.txt读取内容,并显示
按单个字符读取文件
String filePath = "e:\\stroy.txt";
FileReader fileReader = null;
char data = 0;
//1、创建FileReader对象
//try-carch
fileReader = new FileReader(filePath);
//循环读取 使用read方法,单个字符读取
while ((data = fileReader.read()) != -1) {
System.out.print(char() data);
}
//try-catch
finally{
//try-catch
if (fileReader != null) {
fileReader.close();
}
//try-catch
}
使用字符数组读取文件
String filePath = "e:\\stroy.txt";
FileReader fileReader = null;
int readLen = 0;
char[] buf = new char[8];
//1、创建FileReader对象
//try-carch
fileReader = new FileReader(filePath);
//循环读取 使用read(buf)方法,返回的是实际读取到的字符数
//如果返回-1,说明到文件结束
while ((readLen = fileReader.read(buf)) != -1) {
System.out.print(new String(buf), 0, readLen);
}
//try-catch
finally{
//try-catch
if (fileReader != null) {
fileReader.close();
}
//try-catch
}
例2使用FileWriter将”风雨之后,定见彩虹”写入到note.txt文件中
public static void main(String[] args) {
String filePath = "e:\\note.txt";
//创建FileWriter对象
FileWriter fileWriter = null;
char[] chars = {'a','b','c'};
//try-catch
fileWriter = new FileWriter(filePath);
/*
write(int):写入单个字符
write(char[]):写入指定数组
write(char[],off,len):写入指定数组的指定部分
write(string):写入整个字符串
write(string,off,len):写入字符串的指定部分
*/
//write(int):写入单个字符
fileWriter.write("H");
//write(char[]):写入指定数组
fileWriter.write(chars);
//write(char[],off,len):写入指定数组的指定部分
fileWriter.write("ABCDEF".toCharArray(), 0, 3);
//write(string):写入整个字符串
fileWriter.write(" 你好北京~~");
//write(string,off,len):写入字符串的指定部分
fileWriter.write("上海天津", 0, 2); //写入 上海 ,天津没写进去
fileWriter.write("风雨之后,定见彩虹");
//在数据量大的情况下,可以使用循环操作
//try-catch
finally{
//对于FileWriter,一定要关闭流,或者flush才能真正的把数据写入到文件
//try-catch
//fileWriter.flush();
//关闭文件流,等价于flush() + 关闭
fileWriter.close();
//try-catch
}
System.out.print("程序结束~~");
}