[Java基础]——IO流
此博客主要记录Java基础中IO流的基本操作。
一、几种流的结构

二、输入、输出流使用方法举例
说明:
1. read()的理解:返回读入的一个字符。如果达到文件末尾,返回-1
2. 异常的处理:为了保证流资源一定可以执行关闭操作。需要使用try-catch-finally处理
3. 读入的文件一定要存在,否则就会报FileNotFoundException。
主要操作:①创建文件和相应的流 ②读写操作 ③ 关闭资源
注意: 先写主干代码,后使用 “Ctrl + Alt + T ” 调出 try - catch - finally 将主干代码抛出异常
2.1 FileReader 的使用
@Test public void testFileReader1() { FileReader fr = null; try { //1.File类的实例化 File file = new File("hello.txt"); //2.FileReader流的实例化 fr = new FileReader(file); //3.读入的操作 //read(char[] cbuf):返回每次读入cbuf数组中的字符的个数。如果达到文件末尾,返回-1 char[] cbuf = new char[5]; int len; while((len = fr.read(cbuf)) != -1){ //方式一: //错误的写法 // for(int i = 0;i < cbuf.length;i++){ // System.out.print(cbuf[i]); // } //正确的写法 // for(int i = 0;i < len;i++){ // System.out.print(cbuf[i]); // } //方式二: //错误的写法,对应着方式一的错误的写法 // String str = new String(cbuf); // System.out.print(str); //正确的写法 String str = new String(cbuf,0,len); System.out.print(str); } } catch (IOException e) { e.printStackTrace(); } finally { if(fr != null){ //4.资源的关闭 try { fr.close(); } catch (IOException e) { e.printStackTrace(); } } } }
2.2 FileWriter 的使用
/*
从内存中写出数据到硬盘的文件里。
说明:
1. 输出操作,对应的File可以不存在的。并不会报异常
2.
File对应的硬盘中的文件如果不存在,在输出的过程中,会自动创建此文件。
File对应的硬盘中的文件如果存在:
如果流使用的构造器是:FileWriter(file,false) / FileWriter(file):对原文件的覆盖
如果流使用的构造器是:FileWriter(file,true):不会对原文件覆盖,而是在原文件基础上追加内容
*/
@Test public void testFileWriter() { FileWriter fw = null; try { //1.提供File类的对象,指明写出到的文件 File file = new File("hello1.txt"); //2.提供FileWriter的对象,用于数据的写出 fw = new FileWriter(file,false); //3.写出的操作 fw.write("I have a dream!\n"); fw.write("you need to have a dream!"); } catch (IOException e) { e.printStackTrace(); } finally { //4.流资源的关闭 if(fw != null){ try { fw.close(); } catch (IOException e) { e.printStackTrace(); } } } }
三、缓冲流的使用
1.缓冲流涉及到的类:
* BufferedInputStream
* BufferedOutputStream
* BufferedReader
* BufferedWriter
2.作用:
作用:提供流的读取、写入的速度
提高读写速度的原因:内部提供了一个缓冲区。默认情况下是8kb

3.典型代码
3.1 使用BufferedInputStream和BufferedOutputStream:处理非文本文件
//实现文件复制的方法 public void copyFileWithBuffered(String srcPath,String destPath){ BufferedInputStream bis = null; BufferedOutputStream bos = null; try { //1.造文件 File srcFile = new File(srcPath); File destFile = new File(destPath); //2.造流 //2.1 造节点流 FileInputStream fis = new FileInputStream((srcFile)); FileOutputStream fos = new FileOutputStream(destFile); //2.2 造缓冲流 bis = new BufferedInputStream(fis); bos = new BufferedOutputStream(fos); //3.复制的细节:读取、写入 byte[] buffer = new byte[1024]; int len; while((len = bis.read(buffer)) != -1){ bos.write(buffer,0,len); } } catch (IOException e) { e.printStackTrace(); } finally { //4.资源关闭 //要求:先关闭外层的流,再关闭内层的流 if(bos != null){ try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } if(bis != null){ try { bis.close(); } catch (IOException e) { e.printStackTrace(); } } //说明:关闭外层流的同时,内层流也会自动的进行关闭。关于内层流的关闭,我们可以省略. // fos.close(); // fis.close(); } }
3.2 使用BufferedReader和BufferedWriter:处理文本文件
@Test public void testBufferedReaderBufferedWriter(){ BufferedReader br = null; BufferedWriter bw = null; try { //创建文件和相应的流 br = new BufferedReader(new FileReader(new File("dbcp.txt"))); bw = new BufferedWriter(new FileWriter(new File("dbcp1.txt"))); //读写操作 //方式一:使用char[]数组 // char[] cbuf = new char[1024]; // int len; // while((len = br.read(cbuf)) != -1){ // bw.write(cbuf,0,len); // // bw.flush(); // } //方式二:使用String String data; while((data = br.readLine()) != null){ //方法一: // bw.write(data + "\n");//data中不包含换行符 //方法二: bw.write(data);//data中不包含换行符 bw.newLine();//提供换行的操作 } } catch (IOException e) { e.printStackTrace(); } finally { //关闭资源 if(bw != null){ try { bw.close(); } catch (IOException e) { e.printStackTrace(); } } if(br != null){ try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } }
四、标准输入输出流 (键盘输入, 控制台输出)
示例:
从键盘输入字符串,要求将读取到的整行字符串转成大写输出。然后进行输入操作,直至当输入“e” 或者“exit” 时,退出程序。
方法一 :使用Scanner 实现 ,调用next() 返回字符串
方法二: 使用System.in 实现, 返回的是字节流,需要转换流进行操作。 InputStream --> 转换流 --> BufferedReader 的readLine()
import java.util.Scanner; public class ScannerTest { public static void main(String[] args) { while(true){ Scanner inputs = new Scanner(System.in); System.out.println("请输入一组字符串"); String s2 = inputs.nextLine(); if("e".equalsIgnoreCase(s2) || "exit".equalsIgnoreCase(s2)){ System.out.println("程序结束"); break; } System.out.println("输入的大写是: \n" + s2.toUpperCase()); } } }
public static void main(String[] args) { BufferedReader br = null; try { InputStreamReader isr = new InputStreamReader(System.in); br = new BufferedReader(isr); while(true){ System.out.println("请输入字符串"); String data = br.readLine(); if("e".equalsIgnoreCase(data) || "exit".equalsIgnoreCase(data)){ System.out.println("程序结束"); break; } String upperCase = data.toUpperCase(); System.out.println(upperCase); } } catch (IOException e) { e.printStackTrace(); } finally { if(br != null){ try { br.close(); } catch (IOException e) { e.printStackTrace(); } finally { } } } }
五、打印流
打印流,PrintStream 和 PrintWriter ,提供了一系列重载的print() 和printLn()
示例:
public void test(){ PrintStream ps = null; try { FileOutputStream fos = new FileOutputStream(new File("D:\\IO\\text.txt")); //创建打印输出流,设置为自动刷新模式(写入换行符或字节‘\n’时都会刷新输出缓冲区) ps = new PrintStream(fos, true); if(ps != null){ //这里时关键,把标准输出流(控制台输出)改成文件 System.setOut(ps); } for(int i = 0; i <= 255; i++){ System.out.print((char)i); if(i % 50 == 0){ System.out.println(); } } } catch (FileNotFoundException e) { e.printStackTrace(); } finally { if(ps != null){ ps.close(); } } }

浙公网安备 33010602011771号