IO

来源:互联网 发布:c语言文件指针换行 编辑:程序博客网 时间:2024/06/04 23:07
18.1 Java中的文件编程

18.1.1 File类
和文件相关的操作都被封装在java.io.File类中。文件和文件夹都是使用File类来表示的。
File类中重要的属性和方法:
separator:String类型的类变量,其值是文件路径的分隔符。对于Windows操作系统,这个变量就是“\\”。因为Java是跨平台的语言,所以在拼接文件路径的时候,最好使用这个变量作为路径分隔符。
File(String path):构造方法,参数为文件或文件夹(后面统称文件)的全路径。
isFile()和isDirectory():两个方法的返回值都是boolean,用来判断一个File对象是文件还是文件夹。
boolean exists():判断是否已经存在文件路径中的那个文件。
boolean createNewFile():根据文件路径,创建一个文件。如果文件在创建前就存在,会创建失败,返回值代表文件是否创建成功。
boolean mkdirs():根据文件路径,创建一个或多个文件夹。文件路径上不存在的文件夹都将被创建出来。
String getPath():得到全路径。
String getName():得到文件名字。
File[] listFiles():列出目录中的所有文件和文件夹。
boolean delete():删除文件
File类中的方法多牵扯到系统底层操作,很多操作都会有异常抛出。

18.1.2 创建和删除文件
package com.javaeasy.fileoperation;
import java.io.File;
import java.io.IOException;
public class CreateFileAndFolder {
        public static void main(String[] args){
                String folderPath="F:"+File.separator+"javaeasy"+File.separator+"testingfolder";
                String fileName="testingfile.txt";        //文件名
                File folder=new File(folderPath);          //创建一个File对象,对应文件夹
                if(folder.exists()&&folder.isDirectory()){    //如果文件已经存在,且正是文件夹
                        System.out.println("该文件夹已经存在");
                }else{
                        boolean creatFolders=folder.mkdirs();    //如果文件夹不存在,创建需要的文件夹
                        if(creatFolders){
                                System.out.println("文件夹创建成功");
                        }else{
                                System.out.println("文件夹创建失败");
                                return;
                        }
                }
                File file=new File(folder,fileName);     //创建一个File对象,对应文件
                if(file.exists()&&file.isFile()){
                        System.out.println("文件已经存在,将文件删除");
                        boolean deleteFile=file.delete();     //将文件删除
                        if(deleteFile){
                                System.out.println("文件删除成功");
                        }else{
                                System.out.println("文件删除失败");
                                return;
                        }
                }
                try{
                        file.createNewFile();               //创建文件
                        System.out.println("文件创建成功");
                }catch(IOException e){
                        System.out.println("文件创建失败");
                        return;
                }
        }
}

18.1.4 重命名文件
File file=new File(folderPath);
File renameFile=new File(file.getParentFile(),"renameFile"); //创建一个新的File对象,代表命名后的文件
if(renameFile.exists()){
     System.out.println("文件名已被占用");
     return;
}
if(file.renameTo(renameFile)){
     System.out.println("文件重命名成功");
}else{
     System.out.println("文件重命名失败");
}
File类的getParentFile()方法,返回值类型是File,返回值代表的是这个文件所在的文件夹
renameTo()方法完成重命名操作。

18.2 Java中的I/O编程
在Java中,数据的传输多是以Stream的形式进行的。流表现在类库中,其实就是Java类库中的两个类。
Java中有输入流和输出流两个概念,分别对应着输入数据和输出数据。
输入和输出是从程序的观点看的。例如,向控制台输出一行字,数据是从程序到控制台,程序是数据的输出方,所以要使用输出流;将数据从文件中读取到程序里,数据是从外界到程序,程序是数据的接收方,所以要使用输入流。
在Java类库里,InputStream类代表输入流;OutputStream类代表输出流。这两个类都是抽象类。它们的所有子类可以说都是与数据传输有关的。
程序首先将数据都写入到输出流中,然后在“某个时刻”将数据写入到文件中。
数据传输的基本单位是字节
OutputStream类代表输出流,其作用是写入数据。此类有几个方法:
write():此方法用来写入数据,有3个重载形式,最常用的是以byte数组为参数的形式。
flush():强行将已经收集到的数据发送出去。
close():关闭输出流。使用完一个输出流后,必须关闭它以释放资源。一般来说,在close()方法内部都会执行flush()方法,将已经收到的数据传输出去,否则这些数据会丢失。
OutputStream类中的方法很简单,但是其子类中提供了丰富的方法,用于不同的场景,例如有的子类就会接受String类型的参数来进行写入操作,而不是只接受byte。
输出流和输入流在本质上是一样的,都可以看作是“数据缓冲区”。输入流是用来读取数据的。
InputStream类中的主要方法:
read():此方法有多个重载,最常用的是以byte数组为参数的方法。其作用是读取相应长度的数据,并将数据填充到参数byte数组中。输入流会在内部缓存已经接受到的数据,当调用read()方法时,就从缓存中读取相应的数据给外部。read()方法的返回值是一个int值,表示读取到的数据的实际长度。如果没有数据,就返回-1
close():关闭输入流。

18.2.2 向文件中写入数据
使用PrintWriter类,更方便地写入数据。
package com.javaeasy.writeandread;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;

public class WriteDataToFile {
        public static void main(String[] args){
                File dataFile=new File("D:\\datafile.txt");
                if(dataFile.exists()&&dataFile.isFile()){
                        System.out.println("使用已经存在的datafile.txt文件");
                }else{
                        try{
                                dataFile.createNewFile();
                                System.out.println("创建datafile.txt文件");
                        }catch(IOException e){
                                System.out.println("创建datafile.txt文件失败");
                                return;
                        }
                }
                try{
                        PrintWriter pw=new PrintWriter(dataFile);// 创建一个PrintWriter类的实例
                        pw.write("向文件中写入数据");             // 构造方法的参数是一个File对象
                        pw.close();
                }catch(FileNotFoundException e){
                        System.out.println("找不到文件!");
                }
        }
}

18.2.3 从文件中读取数据
package com.javaeasy.writeandread;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class ReadDataFromFile {
        public static void main(String[] args){
                File dataFile=new File("D:\\datafile.txt");
                if(dataFile.exists()&&dataFile.isFile()){
                        System.out.println("从datafile.txt中读取数据");
                }else{
                        System.out.println("datafile.txt文件不存在");
                        return;
                }
                System.out.println("文件中的内容为:");
                try{
                        FileReader fr=new FileReader(dataFile);
                        BufferedReader br=new BufferedReader(fr);
                        String content=null;
                        while((content=br.readLine())!=null){
                                System.out.println(content);
                        }
                        fr.close();
                        br.close();
                }catch(FileNotFoundException e){
                        System.out.println("找不到文件");
                }catch(IOException e){
                        e.printStackTrace();
                }
        }
}
BufferedReader类的readLine()方法会从文件中读取一行字符串,返回值就是这个字符串。如果已经到了文件末尾,则返回null
PrintWriter类和BufferedReader类,不是输入输出流类。PrintWriter类是抽象类Writer的子类,BufferedReader类是抽象类Reader的子类。Writer类和Reader类是与输入输出有关的另外两个重要的类,它们的子类基本都是通过使用输入输出流,完成相应的输入输出功能。它们本身提供了很多方法,让输入输出操作更便捷。
在程序中看不到输入输出流,但输入输出流在整个输入输出过程中的作用不可忽视,它们 与输入输出直接相关。

18.2.5 使用输出流写入数据
package com.javaeasy.writeandread;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class WriteDataUsingStream {
        public static void main(String[] args){
                File dataFile=new File("F:\\DataFileForOutputStream.txt");
                if(dataFile.exists()&&dataFile.isFile()){
                        System.out.println("使用已经存在的文件");
                }else{
                        try{
                                dataFile.createNewFile();
                                System.out.println("创建文件");
                        }catch(IOException e){
                                System.out.println("创建文件失败");
                                return;
                        }
                }
                try{
                        String content="通过输出流向文件写入数据";
                        FileOutputStream fos=new FileOutputStream(dataFile);  // 输出流
                        byte[] contentBytes=content.getBytes();     //将数据转换为byte数组
                        fos.write(contentBytes);                    //写入数据
                        fos.close();
                        System.out.println("数据写入成功");
                }catch(FileNotFoundException e){
                        System.out.println("找不到文件");
                }catch(IOException e){
                        System.out.println("输出内容出错");
                }
        }
}
如果要使用输出流输出数据,需要自己准备数据,也就是byte数组。如果使用Writer类,可以省去这一步,PrintWriter会负责将字符串转换为byte数组。

18.2.6 使用输入流读取数据
很多情况下,文件的大小会超过数组大小,这时需要根据read()方法的返回值来循环读取文件中的数据。如果返回值不是-1,说明没读到末尾,就继续循环;如果返回值是-1,循环结束。











































0 0
原创粉丝点击