【Java】 认识I/O(代码示例,超详解释)
文章目录
前言
在计算机中,通常使用各种各样的文件来保存数据,如何在Java程序中操作这些文件呢?java.io包提供了一些接口和类,对文件进行基本的操作,包括对文件和目录属性的操作、对文件读写的操作等。首先学习使用File类操作文件和目录。
File
-
File对象可以表示文件或目录,程序中一个File对象可以代表一个文件或目录。可以利用他对文件或目录进行基本操作。如查看名称、最后修改日期、文件大小等。
-
File类构造方法:
方法 | 说明 |
---|---|
File(String pathname) | 用指定文件路径构造文件 |
File(String dir,String subpath) | 指定文件路径下创建指定文件名的文件 |
File(File parent,String subpath) | 指定文件对象中创建指定文件名文件 |
-
File类常见方法
方法 说明 boolean exists() 文件是否存在,存在返回true String getAbsolutePath() 返回此对象表示的文件的绝对路径名 String getName() 返回吃对象表示的文件的名称 String getParent() 返回此File对象的路径名的上一级,没有则返回null boolean delete() 删除此对象指定的文件 boolean isDirectory() 是否是目录 boolean mkdir() 创建目录,路径由当前File对象指定 boolean mkdirs() 创建包括父目录的目录
代码示例:
public static void main(String[] args) throws IOException { //构造文件对象 File file=new File("C:/Users/29616/desktop/1.txt"); //判断是否存在 if(file.exists()){ //存在,判断是否是文件 if(file.isFile()){ System.out.println("文件存在"); //定义str字符串 String str="好好学习,天天向上\t"; //字符流 写入 true表示向文件追加内容 false表示覆盖 FileWriter fw=new FileWriter("C:/Users/29616/desktop/1.txt",true); //写入 fw.write(str); //关比字符流,不关闭会导致长期占用资源,并且安全性低 fw.close(); //字符流 读取 FileReader fr=new FileReader("C:/Users/29616/desktop/1.txt"); //定义一个字符数组,用于存储读到字符 char[] datas=new char[1024]; //把读取的内容存到数组里,读到的是字符个数 fr.read(datas); System.out.println(datas); fr.close(); //文件大小 long length=file.length(); System.out.println(length); //文件路径 String path=file.getPath(); System.out.println(path); //文件绝对路径 String abspath=file.getAbsolutePath(); System.out.println(abspath); //最后修改时间 long time=file.lastModified(); //System.out.println(time); //格式化时间 Date date=new Date(time); SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(simpleDateFormat.format(date)); //删除文件 if(file.delete()){ System.out.println("删除成功"); } //不是文件 }else{ System.out.println("文件夹"); } }else{ //文件不存在 System.out.println("不存在,创建"); //创建新文件 file.createNewFile(); System.out.println("创建成功" ); } }
Java流
前面讲解的java.io包中的File类对文件或目录的属性进行操作,但File类不能访问文件的内容,即不能从文件中读取数据或往文件里写数据。下面介绍文件的读写操作。
读文件是指把文件中的数据读取到内容中,反之,写文件是指把内存中的数据写入到文件中。通过“流”可以实现读写文件的操作。
流的分类
数据流是 Java 进行 I/O 操作的对象,它按照不同的标准可以分为不同的类别。
- 按照流的方向主要分为输入流和输出流两大类。
- 数据流按照数据单位的不同分为字节流和字符流。
- 按照功能可以划分为节点流和处理流。
1.输入流和输出流
输入/输出流是相对于计算机内存来说的,输入流表示数据输入到内存,输出流表示从内存中输出。Java的输出流主要由OutputStream和Write作为基类,输入流由InputStream和Reader作为基类。
2.字节流和字符流
输入/输出流又按照处理数据单元的不同分为字节流和字符流。
字节流是8位通用字节流,其基本单位是字节,字节流的基类是InputStream类(常用子类FileInputStream)和OutPutStream类(常用子类FileOutputStream),他们是抽象类。
字符流是16位Unicode字符流,基本单位是Unicode字符。字符流最适合用来处理字符串和文本,支持国际上大多数的字符集和语言。字符流的基类是Reader类(常用子类BufferedReader)和Writee(常用子类BufferedWriter)类,也是抽象类。
注:所有方法再出现错误时,都会抛出IOExcpetion。
读写文本文件
1.使用字节流读写文本文件
- 使用字节流FileInputStream读文本文件
package exam;import java.io.File;import java.io.FileInputStream;import java.io.IOException;public class FileInputStreamTest { /** * 字节流读文件 * @param args * @throws IOException */ public static void main(String[] args) throws IOException { File file=new File("C:/Users/29616/desktop/1.txt"); //创建流对象 FileInputStream fis=new FileInputStream(file); int data; System.out.println("可读取的字节数:"+fis.available()); System.out.println("文件内容为:"); //循环读数据 while ((data=fis.read())!=-1){ System.out.println(data+""); } fis.close(); }}
- 使用字字节流FileOutputStream写文本文件
package exam;import java.io.FileOutputStream;import java.io.IOException;/** * 字节流写文件 */public class FileOutputStreamTest { public static void main(String[] args) throws IOException { try{ String str="java"; byte[] b=str.getBytes();//字节数组 FileOutputStream fos=new FileOutputStream("C:/Users/29616/desktop/1.txt",true); fos.write(b,0,b.length); System.out.println("文件已更新"); fos.flush(); fos.close(); }catch (IOException obj){ System.out.println("创建文件时出错"); } }}
2.使用字符流读写文本文件
- 使用字符流BufferedReander和FileReader读文本文件
package exam;import java.io.*;/** * 字符流读文件 */public class BufferedReaderTest { public static void main(String[] args) throws IOException { File file=new File("C:/Users/29616/desktop/1.txt"); FileReader fr=new FileReader(file); BufferedReader br=new BufferedReader(fr); String line=br.readLine(); while(line!=null){ System.out.println(line); line=br.readLine(); } br.close(); fr.close(); }}
- 使用字符流BufferedWriter和FileWriter写文本文件
package exam;import java.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;/** * 字符流写文件 */public class BufferedWriterTest { public static void main(String[] args) throws IOException { BufferedWriter bw=new BufferedWriter(new FileWriter("C:/Users/29616/desktop/1.txt",true)); bw.write("java"); bw.newLine(); System.out.println("写入成功!"); bw.flush(); bw.close(); }}
读写二进制文件
读写二进制文件常用的类有DataInputStream和DataOutputStream。
代码示例:
package exam;import java.io.*;/** * 读取二进制文件1.class中数据,复制到另一个二进制文件2.class文件中 */public class ReadAndWriteClass { public static void main(String[] args) throws IOException { File file=new File("C:/Users/29616/desktop/1.class"); File copyfile=new File("C:/Users/29616/desktop/2.class"); file.createNewFile(); copyfile.createNewFile(); //字节流读文件 FileInputStream fis=new FileInputStream(file);//字节流读二进制文件 DataInputStream dis=new DataInputStream(fis); //字节流写文件 FileOutputStream fos=new FileOutputStream(copyfile,true); //字节流写二进制文件 DataOutputStream dos=new DataOutputStream(fos); int temp; while ((temp=dis.read())!=-1){ //读数据 dos.write(temp); //把读取数据写入到2.clss中 } System.out.println("读写成功"); fis.close(); fos.close(); dis.close(); dos.close(); }}
重定向标准I/O
Java提供了两个标准输入/输出流:System.in和System.out,主要用于从键盘接受数据以及向屏幕输出数据。
使用重定向标准I/O可以使用System.in读取文件中的数据以及使用System.out向文件中写入数据。
System类提供3个重定向标准I/O的方法:
方法 | 说明 |
---|---|
static void setErr(PrintStream err) | 重定向标准错误输出流 |
static void setIn(InputStream in) | 重定向标准输入流 |
static void setOut(PrintStream out) | 重定向标准输出流 |
代码示例:
package demo1;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.PrintStream;public class Test3 { public static void main(String[] args) { //创建PrintStream输入流 try { PrintStream ps=new PrintStream(new FileOutputStream("C:/Users/29616/desktop/1.txt")); //将标准输出流重定向到文件 System.setOut(ps); //向文件中输出内容 System.out.print("重定向测试"); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { } }}