JavaIO

JavaIO即Java的输入输出系统。比如我们的程序要读取一个文本文件、一张图片或者要获取控制台输入的内容,就要用到输入流;又或者程序要将生成的一段字符窜以文件的形式保存到系统中就要用到输出等等这些操作。

在Java中与输入和输出相关的类都在Java.io包中。


Java中IO类的组织结构

如下图:


Java IO的类库的框架

Java IO的类库是很庞大的,但是要是理清整体的框架还是可以方便记忆和使用的。

1、从处理的数据类型可以分为:

  1. 字节流:InputStream和OutputStream
  2. 字符流:Reader和Writer

   字节流直接对文件进行操作;字符流在操作的时候使用了缓冲区(即内存)。

  字节流一般用来对媒体文件操作,比如图片;字符流一般可用来操作文本文件,如txt文件。

2、从处理数据的方向(即:是输出文件还是读取文件)可分为:

  1. 输入流:InputStream和Reader
  2. 输出流:OutputStream和Writer

  输入流是从目标资源将数据输入到程序,比如:将一段字符串从控制台读取到程序;输出流是将数据从程序输出到目标位置,比如:将一段字符串输出到控制台;如下图:

  

如下表:

  字节流 字符流
输入流 InputStream Reader
输出流 OutputStream Writer

Java IO中的字节流的使用

如上面的类结构图, InputStream / OuputStream是两个抽像类,不能直接使用,所有的字节流的实现类都直接或者间接的继承了这两个类。比如:FileInputStream / FileOutputStream。

FileInputStream实例:

 public class FileInputStreamTest {

     public static void fileInputStreamTest() {
         //声明FileInputStream
         FileInputStream fis=null;
         try {
             //在系统的E盘下面有一个temp.txt文件,文件内容是:Hello。
             String path="E:\\temp.txt";
             //创建FileInputStream对象,将路径作为形参传输入,告诉FileInputStream对象我们要读取哪个文件。
             //当然,这只是一个构造函数,其实还有其他不同的构造函数。
             fis=new FileInputStream(path);
             //使用的是字节流,所以我们使用byte类型的数组来储存读取到的数据。
             byte[] buf=new byte[1024];
             //调用read()方法,将数据读取到的数据保存到buf中。
             //返回值是读取到buf中的byte数量。
             int len=fis.read(buf);
             //将读取的数据输出到控制台
             for(int i=0;i<len;i++) {
                 System.out.print((char)buf[i]);
             }
         }catch(Exception e) {

         }

     }

     public static void main(String[] args) {
         //直接执行fileInputStreamTest()方法
         fileInputStreamTest();
     }
 }

 结果:

hello

FileOutputStream实例:

 public class FileOutputStreamTest {

     public static void fileOutputStreamTest() {
         //要输出的内容,这里是65,但是输出到文件的时候会将65转换成ASCII码表中的65对应的字符'A';
         byte[] b= {65};
         //输出一个文件,在E盘下,文件名为:output.txt
         String path="E:\\output.txt";
         //声明FileOutputStream
         FileOutputStream fos=null;
         try {
             //实例化FileOutputStream对象
             fos=new FileOutputStream(path);
             //使用write()方法,将b中的数据写到E盘下的output.txt文件。
             fos.write(b);
         }catch(Exception e) {

         }
     }
     public static void main(String[] args) {
         //执行
         fileOutputStreamTest();
     }

 }

结果:

在E盘下生成一个ouput.txt文件,文件写入一个‘A’字母。

这里我们会发现,如果想要读写字符的话,使用字节流不是很方便,因为还要将字符与编码表中对应的数字一一对应(Java默认编码表是Unicode)。

所以为了方便读写字符,可以使用字符流。而字节流可以用来读写媒体文件,如图片、视频等等。


Java IO中字符流的使用

字符流专门用来操作String字符窜的流,如上类结构图所示,Reader / Writer跟上面的字节流一样也是两个抽象类,所有的字符流都实现了这两个类。比如:FileReader / FileWriter。

 FileReader实例:

 public class FileReaderTest {

     public static void fileReaderTest() {
         //声明一个Reader
         Reader r=null;
         try {
             //在E盘下面有一个temp.txt文件,文件中有字符:"hello";
             String path="E:\\temp.txt";
             //实例化FileReader对象
             r=new FileReader(path);
             //cbuf数组用来储存读取到的字符数据。
             char[] cbuf=new char[1024];
             //将读取到的temp.txt中的字符保存在cbuf中
             r.read(cbuf);
             //输出
             System.out.print(new String(cbuf));
         }catch(Exception e) {
             e.printStackTrace();
         }finally {
             //一般在开发中使用io流要记得在不使用的时候关闭,要不会一直占用资源。
             if(r != null) {
                 try {
                     r.close();
                 } catch (IOException e) {
                     e.printStackTrace();
                 }
             }
         }
     }

     public static void main(String[] args) {
         //执行
         fileReaderTest();
     }

 }

 结果:

控制台输出:hello

FileWriter类实例:

 public class FileWriterTest {

     public static void fileWriterTest(){
         //声明一个FileWriter
         FileWriter fw=null;
         try{
             //输出内容是output content
             String str="output content";
             //将字符输出到E盘下的output.txt文件下
             String path="E:\\output.txt";
             //实例FileWriter对象,将path作为对象的目标文件。
             fw=new FileWriter(path);
             //使用write方法,把要输出的内容str当作形参传入。
             fw.write(str);
             //执行完write后,这是并没有将字符输出。如果此时在在这里打端点,会发现并没有输出内容。
             //执行flush后,才会将字符串输出。或者在流关闭的时候,也会将字符串输出。
             fw.flush();
         }catch(Exception e) {
             e.printStackTrace();
         }finally {
             //关闭流,否则会占用资源。
             if(fw != null) {
                 try {
                     fw.close();
                 } catch (IOException e) {
                     e.printStackTrace();
                 }
             }
         }
     }

     public static void main(String[] args) {
         //执行
         fileWriterTest();
     }
 }

在实际编程中,一般的输入输出流(或者说字符流和字节流)都应该在不再使用的时候执行close()方法关闭。

但在java7只有,可以在try()的括号中实例化流,这样,即使不使用close(),程序也会在最后自动的关闭流对象。


其他的实现类

  • 转换流:InputStreamReader / OutputStreamReader。

这两个类实现了Reader抽象类,这两个类是字符流和字节流之间的转换桥梁。这两个类可以将字节流转换成字符流。用法与上面相似

  • 缓冲流:BufferedReader / BufferedWriter , BufferedInputStream /BufferedOuputStream。

这些类是会将数据首先缓存起来然后再执行操作。比如:BufferedInputStream会将读取的的数据保存在缓存(内存)中,然后从缓存中读取,就不需要每次一点点的执行读取操作,这样如果读取很多数据的话,效率就会更高,因为从内存中读取数据要比从硬盘中读取数据快很多。;

BufferedOuputStream会把要输出的数据存到缓存中,在需要的时候才将数据输出。


参考链接:链接1链接2链接3


JavaIO基础学习笔记的更多相关文章

  1. 【C#编程基础学习笔记】4---Convert类型转换

    2013/7/24 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com [C#编程基础学习笔记]4---Convert类型转换 ...

  2. 【C#编程基础学习笔记】6---变量的命名

    2013/7/24 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com [C#编程基础学习笔记]6---变量的命名 ----- ...

  3. 1.C#基础学习笔记3---C#字符串(转义符和内存存储无关)

    技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com ------------------------------------- ...

  4. Java基础学习笔记总结

    Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...

  5. Mysql数据库基础学习笔记

    Mysql数据库基础学习笔记 1.mysql查看当前登录的账户名以及数据库 一.单表查询 1.创建数据库yuzly,创建表fruits 创建表 ) ) ,) NOT NULL,PRIMARY KEY( ...

  6. 0003.5-20180422-自动化第四章-python基础学习笔记--脚本

    0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...

  7. Java基础学习笔记(一)

    Java基础学习笔记(一) Hello World 基础代码学习 代码编写基础结构 class :类,一个类即一个java代码,形成一个class文件,写于每个代码的前端(注意无大写字母) XxxYy ...

  8. C#RabbitMQ基础学习笔记

    RabbitMQ基础学习笔记(C#代码示例) 一.定义: MQ是MessageQueue,消息队列的简称(是流行的开源消息队列系统,利用erlang语言开发).MQ是一种应用程序对应用程序的通信方法. ...

  9. handlebars.js基础学习笔记

    最近在帮学校做个课程网站,就有人推荐用jquery+ajax+handlebars做网站前端,刚接触发现挺高大上的,于是就把一些基础学习笔记记录下来啦. 1.引用文件: jquery.js文件下载:h ...

随机推荐

  1. iOS UITableView reloadData 刷新结束后执行后续操作

    如果在reloadData后需要立即获取tableview的cell.高度,或者需要滚动tableview. 如果直接在reloadData后执行代码是有可能出问题的,比如indexPath为nil等 ...

  2. Robot Framework操作mongodb数据库

    RF对mongodb操作需要安装以下两个库: 1.pymongo 可以采用pip install pymongo: (如果下载过慢,可指定下载源,如:http:pypi.douban.com/simp ...

  3. Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)

    考场上只做出了ABDE C都挂了... 题解: A 题解: 模拟 判断前面一段是否相同,后面一段是否相同,长度是否够(不能有重叠) Code: #include<stdio.h> #inc ...

  4. (024)[工具软件]截屏录屏软件FSCapture(转)

    该软件比 Snipaste 增加的功能有滚动截图和屏幕录制. 原文地址:https://www.appcgn.com/faststone-capture.html FastStoneCapture,简 ...

  5. poj3252Round Numbers

    链接 也算是组合 以前按组合做过一次 忘记怎么做的了 这次按dp写的 dp[i][j][g][k] 表示第i位为k(0|1)而且有j个1,g个0的情况数 貌似写的麻烦了...这一类的题,进行逐位计算就 ...

  6. Excel数据直接到DataTable--->DB

    1) Excel数据直接导入到临时生成的DataTable using (OleDbConnection selectConnection = new OleDbConnection("Pr ...

  7. AJPFX关于对集合中的元素删除操作和注意点

    import java.util.ArrayList;import java.util.Iterator;import java.util.List; public class ForeTest2 { ...

  8. 洛谷P2774 方格取数问题(最小割)

    题意 $n \times m$的矩阵,不能取相邻的元素,问最大能取多少 Sol 首先补集转化一下:最大权值 = sum - 使图不连通的最小权值 进行黑白染色 从S向黑点连权值为点权的边 从白点向T连 ...

  9. Android利用Socket与硬件通信之智能家居APP

    前几天做一个智能家居APP,硬件段使用的是ESP8266WIFI模块,其实不管是WIFI模块还是蓝牙,通信都是同样一个道理,获取IP和端口来进行通信. 我是通过XCOM v2.0 发送信息,移动端接收 ...

  10. FPGA内部RAM的初始化

    Altera的RAM初始化文件格式是mif和hex. QuartusII自带的RAM初始化工具很方便产生初始化文件. Xilinx的RAM初始化文件格式是coe, 在vivado中软件会将coe文件变 ...