输入流
输入流用来读取数据,抽象类有两种,分别是InputStream字节输入流和Reader字符输入流
InputStream类
类中所有方法遇到错误时都会引发IOException异常,该类的常用方法及说明如下:
Reader类
Java中的字符时Unicode编码,双字节的,而InputStream类时用来处理单字节的,并不适合处理字符。Java提供Reader类专门处理字符。
Reader类中的方法与InputStream类的方法相似,read()方法的参数为char类型数组。还提供了一个额外的ready()方法,用来判断是否准备读取流,其返回值为boolean类型。
输出流
OutputStream类
常用方法:
Writer类
常用方法:
创建文件对象
1.File(String pathname) File file = new File("D:/1.txt");
2.File(String parent,String child) File file = new File("D:/doc/","1.txt");
3.File(File f,String child) File folder = new File("D:/doc/"); File file = new File(folder,"1.txt");
文件操作
File类中操作文件常用方法
import java.io.File;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;public class FileTest { public static void main(String[] args) { File file = new File("test.txt");//创建文件对象 if (!file.exists()){//文件不存在,程序第一次运行执行的语句块 System.out.println("未在指定路径下找到文件,正在创建....."); try{ file.createNewFile(); }catch (IOException e){ e.printStackTrace(); } System.out.println("文件创建成功!"); }else{//文件存在 System.out.println("找到文件名为“test”的文本文件!"); if (file.isFile() && file.canRead()){ System.out.println("文件可读!正在读取文件信息...."); String fileName = file.getName();//获取文件名 String filePath = file.getAbsolutePath();//获取文件的绝对路径 boolean hidden = file.isHidden();//获得该文件是否被隐藏 long len = file.length();//获取文件中的字节数 long tempTime = file.lastModified();//获取文件最后的修改时间 //创建SimpleDateFormat对象,指定日期格式 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); Date date = new Date(tempTime);//使用文件最后修改时间创建Date对象 String time = sdf.format(date);//格式化文件最后的修改时间 System.out.println("文件名:" + fileName); System.out.println("文件的绝对路径"+ filePath); System.out.println("文件是否被隐藏:" + hidden); System.out.println("文件的总字节数为:" + len); System.out.println("文件的最后修改日期为: " + time); file.delete();//查完该文件信息后,删除文件 System.out.println("这个文件的使命结束了!已经被删除了。"); }else{//文件不可读 System.out.println("文件不可读!"); } } }}
文件夹操作
常用方法:
import java.io.File;public class FolderTest { public static void main(String[] args) { String path = "D:\Test";//声明文件夹Test所在的目录 for (int i = 1; i <= 10 ; i++) { File folder = new File(path + "\" + i);//根据新的目录创建File对象 if (!folder.exists()){//文件夹不存在 folder.mkdirs();//创建新的文件夹(包括不存在的父文件夹) } } System.out.println("文件夹创建成功,请打开D盘查看!nnD盘文件及文件夹列表如下:"); File file = new File("D:\");//根据路径名创建File对象 File[] files = file.listFiles();//获得D盘的所有文件和文件夹 for(File folder : files){//遍历files数组 if (folder.isFile()){//判断是否为文件 System.out.println(folder.getName() + " 文件");//输出D盘下所有文件的名称 }else if(folder.isDirectory()){//判断是否为文件夹 System.out.println(folder.getName() + " 文件夹");//输出D盘下所有文件夹的名称 } } }}
文件输入/输出流
FileInputStream类与FileOutputStream类
读取内容用FileInputStream类,写入内容用FileOutputStream类
FileInputStream常用构造方法:
FileInputStream(String name):使用给定的文件名name创建一个对象
FileInputStream(File file):使用File对象创建对象,该方法允许在把文件连接输入流之前对文件做进一步分析。
FileOutputStream常用构造方法:
FileOutputStream(File file):创建一个向指定File对象表示的文件中写入数据的文件输出流。
FileOutputStream(File file,boolean append):创建一个向指定File对象表示的文件中写入数据的文件输出流,如果第二个参数为true,则将字节写入文件末尾处。
FileOutputStream(String name):创建一个向具有指定名称的文件中写入数据的文件输出流。
FileOutputStream(String name,boolean append):创建一个向具有指定名称的文件中写入数据的文件输出流。如果第二个参数为true,则将字节写入文件末尾处。
import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;public class FileStreamTest { public static void main(String[] args) { //创建文件对象 File file = new File("word.txt"); try { //创建FileOutputStream对象,用来向文件写入数据 FileOutputStream out = new FileOutputStream(file); //定义字符串,用来存储要写入文件的内容 String content = "你见过洛杉矶四点的样子吗?"; byte buy[]= content.getBytes();//创建byte型数组,将要写入文件的内容转换为字节数组 out.write(buy);//将数组中的信息写入到文件中 out.close();//关闭流 }catch (IOException e){ e.printStackTrace(); } try{ //创建FileInputStream对象,用来读取文件内容 FileInputStream in = new FileInputStream(file); byte byt[] = new byte[1024];//用来存储读取到的内容 int len = in.read(byt);//从文件中读取内容并存储到字节数组中 System.out.println("文件中的信息是:" + new String(byt,0,len)); in.close();//关闭流 file.delete();//删除文件 }catch (IOException e){ e.printStackTrace(); } }}
FileReader类与FileWriter类
FileReader类和FileWriter类分别对应FileInputStream类与FileOutputStream类。
import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.util.InputMismatchException;import java.util.Scanner;public class ReaderAndWriter { public static void main(String[] args) { while (true){//设置无线循环。实现控制台的多次输入 try{ //在当前目录下创建名为”word.txt“的文本文件 File file = new File("word.txt"); if (!file.exists()){//文件不存在 file.createNewFile(); } System.out.println("请输入要执行的操作序号:(0.结束程序;1.写入文件;2.读取文件)"); Scanner sc = new Scanner(System.in); int choice = sc.nextInt(); boolean flag = false;//设置flag控制循环 switch (choice){ case 0: System.out.println("退出成功!"); flag = true; break; case 1: System.out.print("请输入要写入文件的内容:"); String tempStr = sc.next();//获取控制台写入的内容 FileWriter fw = null;//声明字符输出流 try{ //创建可扩展的字符输出流,向文件中写入新数据时不覆盖已存在的数据 fw = new FileWriter(file,true); //把控制台的文本写入到文件中 fw.write(tempStr + "rn"); }catch (IOException e){ e.printStackTrace(); }finally { fw.close();//关闭流 } System.out.println("上述内容已写到文本文件中!"); break; case 2: FileReader fr = null;//声明字符输入流 //"word.txt"中字符数为0时,控制台输出“文本中的字符数为0!!!” if (file.length() == 0){ System.out.println("文本中的字符数为0!!!"); }else{ try{ //创建用来读取“word.txt”中的字符输入流 fr = new FileReader(file); //创建容纳1024个字符的数组,用来存储读取的字符数的缓冲区 char[] cbuf = new char[1024]; int hasread = -1;//初始化已读的字符数 //循环读取“word.txt”中的数据 while ((hasread = fr.read(cbuf)) != -1){ System.out.println("文件“word.txt”中的内容:n" + new String(cbuf,0,hasread)); } }catch (IOException e){ e.printStackTrace(); }finally { fr.close();//关闭字符输入流 } } break; default: System.out.println("请输入符合要求的有效数字!"); break; } if (flag){//结束循环 break; } }catch (InputMismatchException imexc){ imexc.printStackTrace(); }catch (IOException e){ e.printStackTrace(); } } }}
带缓冲的输入/输出流缓冲是I/O的一种性能优化。缓冲流为了I/O流增加了内存缓冲区。
BufferedInputStream类与BufferedOutputStream类
BufferedInputStream(InputStream in):创建一个带有32个字节的缓冲输入流。
BufferedInputStream(InputStream in,int size):按指定大小来创建缓冲输入流。
BufferedOutputStream(OutputStream out):创建一个有32个字节的缓冲输出流
BufferedOutputStream(OutputStream out,int size):以指定大小来创建缓冲输出流
即使在缓冲区没有慢的情况下,使用flush()方法也会将缓冲区的字节强制写入到文件中,这个过程被称为“刷新”.
import java.io.*;public class BufferedStreamTest { public static void main(String[] args) { //定义字符串数组 String content[] = {"你不喜欢我,", "我一点都不介意。", "因为我活下来,", "不是为了取悦你!"}; //创建文件对象 File file = new File("word.txt"); //创建FileOutputStream对象 FileOutputStream fos = null; //创建BufferedOutputStream对象 BufferedOutputStream bos = null; //创建FileInputStream对象 FileInputStream fis = null; //创建BufferedInputStream对象 BufferedInputStream bis = null; try { fos = new FileOutputStream(file); bos = new BufferedOutputStream(fos); byte[] bContent = new byte[1024];//创建可以容纳1024个字节数的缓冲区 for (int i = 0; i < content.length; i++) { bContent = content[i].getBytes();//将遍历到的数组内容转换为字节数组 bos.write(bContent);//将字节数组内容写入到文件 } System.out.println("写入成功!n"); }catch (IOException e){ e.printStackTrace(); }finally { try{ bos.close();//关闭流 fos.close();//关闭流 }catch (IOException e){ e.printStackTrace(); } } try{ fis = new FileInputStream(file); bis = new BufferedInputStream(fis); byte bContent[] = new byte[1024];//创建byte数组,用来存储读取到的内容 int len = bis.read(bContent);//从文件中读取信息,并存入字节数组中 System.out.println("文件中的信息是:" + new String(bContent,0,len)); }catch (IOException e){ e.printStackTrace(); }finally { try{ bis.close(); fis.close(); }catch (IOException e){ e.printStackTrace(); } } }}
BufferedReader类与BufferedWriter类
BufferedReader类的常用方法:
BufferedWriter类的常用方法:
import java.io.*;public class BufferedTest { public static void main(String[] args) { //定义字符串数组 String content[] = {"你不喜欢我,", "我一点都不介意。", "因为我活下来,", "不是为了取悦你!"}; File file = new File("word.txt"); try{ FileWriter fw = new FileWriter(file);//创建FileWriter类对象 BufferedWriter br = new BufferedWriter(fw);//创建BufferedReader对象 for (int i = 0; i < content.length; i++) { br.write(content[i]);//将字符串数组中元素写入到磁盘文件中 br.newline();//将数组中的单个元素以单行的形式写入文件 } br.close(); fw.close(); }catch (IOException e){ e.printStackTrace(); } try{ FileReader fr = new FileReader(file); BufferedReader br2 = new BufferedReader(fr); String s = null; int i = 0; //如果文本行数不为null,则进入循环 while ((s= br2.readLine())!=null){ i++; System.out.println("第" + i + "行数据:"+s); } br2.close(); fr.close(); }catch (IOException e){ e.printStackTrace(); } }}