输入/输出(Input/Output)是计算机系统中非常基础的一部分,用于从计算机的外部读取数据或将数据写出到计算机的外部。在Java中,I/O操作被封装在Java IO流中。Java IO流提供了非常灵活的方法来操作各种类型的数据,包括文件、网络连接、内存和其他设备等。
一、Java IO流类型
在Java中,IO流可以分为两种类型:字节流和字符流。字节流主要用于读写二进制文件,如图片和视频等;字符流主要用于读写纯文本文件,如TXT文件等。
1、字节流
字节流是IO操作的基础,在Java中,字节流主要有两个抽象类:InputStream和OutputStream。InputStream是用于读取数据的抽象类,而OutputStream则是用于写出数据的抽象类。
//读取文件并输出文件内容 public void readFile(String fileName) throws IOException{ FileInputStream fis = new FileInputStream(fileName); byte[] buffer = new byte[1024]; int len = 0; while((len = fis.read(buffer)) != -1){ System.out.println(new String(buffer,0,len)); } fis.close(); } //将数据写入到指定文件 public void writeFile(String fileName,String content) throws IOException{ FileOutputStream fos = new FileOutputStream(fileName); fos.write(content.getBytes()); fos.close(); }
2、字符流
字符流是针对纯文本文件进行操作的IO流。在Java中,字符流主要有两个抽象类:Reader和Writer。Reader是用于读取数据的抽象类,而Writer则是用于写出数据的抽象类。
//读取文件并输出文件内容 public void readFile(String fileName) throws IOException{ FileReader fr = new FileReader(fileName); char[] buffer = new char[1024]; int len = 0; while((len = fr.read(buffer)) != -1){ System.out.println(new String(buffer,0,len)); } fr.close(); } //将数据写入到指定文件 public void writeFile(String fileName,String content) throws IOException{ FileWriter fw = new FileWriter(fileName); fw.write(content); fw.close(); }
二、Java IO流的读写方式
Java IO流提供了多种读写方式,我们可以根据需要来选择适合的方式进行读写。下面将介绍Java IO流的常用读写方式。
1、字节流的读写方式
字节流提供了多种读写方式,其中常用的有FileInputStream和FileOutputStream。这两个类可以分别向文件中读写字节流。
//使用FileInputStream读取文件内容并输出 public void readFile(String fileName) throws IOException{ FileInputStream fis = new FileInputStream(fileName); byte[] buffer = new byte[fis.available()]; fis.read(buffer); System.out.println(new String(buffer)); fis.close(); } //使用FileOutputStream写出文件内容到指定文件中 public void writeFile(String fileName,String content) throws IOException{ FileOutputStream fos = new FileOutputStream(fileName); fos.write(content.getBytes()); fos.close(); }
2、字符流的读写方式
字符流提供了多种读写方式,常用的有FileReader和FileWriter。这两个类可以分别向文件中读写字符流。
//使用FileReader读取文件内容并输出 public void readFile(String fileName) throws IOException{ FileReader fr = new FileReader(fileName); char[] buffer = new char[fr.read()]; fr.read(buffer); System.out.println(new String(buffer)); fr.close(); } //使用FileWriter写出文件内容到指定文件中 public void writeFile(String fileName,String content) throws IOException{ FileWriter fw = new FileWriter(fileName); fw.write(content); fw.close(); }
三、Java IO流的性能优化
在Java中,IO操作是非常耗时的一个过程。为了提高IO操作的效率,我们可以使用缓冲区或者NIO来进行优化。
1、缓冲区的使用
使用缓冲区可以大大提高读写效率,在Java中,InputStream和OutputStream都提供了BufferedReader和BufferedWriter用于缓冲读写。
//使用BufferedReader读取文件内容并输出 public void readFile(String fileName) throws IOException{ BufferedReader br = new BufferedReader(new FileReader(fileName)); String line = null; while((line = br.readLine()) != null){ System.out.println(line); } br.close(); } //使用BufferedWriter写出文件内容到指定文件中 public void writeFile(String fileName,String content) throws IOException{ BufferedWriter bw = new BufferedWriter(new FileWriter(fileName)); bw.write(content); bw.close(); }
2、NIO的使用
NIO(Non-blocking IO)是Java 1.4引入的新特性,主要用于对IO操作进行优化。在NIO中,使用通道(Channel)来读写数据。
//使用NIO读取文件内容并输出 public void readFile(String fileName) throws IOException{ RandomAccessFile raf = new RandomAccessFile(fileName,"rw"); FileChannel channel = raf.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(1024); while(channel.read(buffer) > 0){ buffer.flip(); System.out.println(new String(buffer.array())); buffer.clear(); } channel.close(); } //使用NIO写出文件内容到指定文件中 public void writeFile(String fileName,String content) throws IOException{ RandomAccessFile raf = new RandomAccessFile(fileName,"rw"); FileChannel channel = raf.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(1024); buffer.put(content.getBytes()); buffer.flip(); channel.write(buffer); channel.close(); }
四、Java IO流的异常处理
在进行IO操作的时候,可能会出现各种异常,例如文件不存在、没有读写权限等。为了确保程序的稳定性,在进行IO操作的时候一定要进行异常处理。
//读取文件内容并输出 public void readFile(String fileName) throws IOException{ BufferedReader br = null; try{ br = new BufferedReader(new FileReader(fileName)); String line = null; while((line = br.readLine()) != null){ System.out.println(line); } br.close(); }catch(FileNotFoundException e){ System.out.println("文件不存在!"); }catch(IOException e){ System.out.println("读取文件出错!"); }finally{ if(br != null){ br.close(); } } } //将数据写入到指定文件 public void writeFile(String fileName,String content) throws IOException{ BufferedWriter bw = null; try{ bw = new BufferedWriter(new FileWriter(fileName)); bw.write(content); bw.close(); }catch(FileNotFoundException e){ System.out.println("文件不存在!"); }catch(IOException e){ System.out.println("写出文件出错!"); }finally{ if(bw != null){ bw.close(); } } }
总结
Java IO流提供了多种读写方式,并且还有缓冲区和NIO等优化方式来提高IO操作的效率。在进行IO操作的时候一定要进行异常处理,确保程序的稳定性。