JavaIO基础学习笔记
JavaIO
JavaIO即Java的输入输出系统。比如我们的程序要读取一个文本文件、一张图片或者要获取控制台输入的内容,就要用到输入流;又或者程序要将生成的一段字符窜以文件的形式保存到系统中就要用到输出等等这些操作。
在Java中与输入和输出相关的类都在Java.io包中。
Java中IO类的组织结构
如下图:

Java IO的类库的框架
Java IO的类库是很庞大的,但是要是理清整体的框架还是可以方便记忆和使用的。
1、从处理的数据类型可以分为:
- 字节流:InputStream和OutputStream
- 字符流:Reader和Writer
字节流直接对文件进行操作;字符流在操作的时候使用了缓冲区(即内存)。
字节流一般用来对媒体文件操作,比如图片;字符流一般可用来操作文本文件,如txt文件。
2、从处理数据的方向(即:是输出文件还是读取文件)可分为:
- 输入流:InputStream和Reader
- 输出流: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会把要输出的数据存到缓存中,在需要的时候才将数据输出。
JavaIO基础学习笔记的更多相关文章
- 【C#编程基础学习笔记】4---Convert类型转换
2013/7/24 技术qq交流群:JavaDream:251572072 教程下载,在线交流:创梦IT社区:www.credream.com [C#编程基础学习笔记]4---Convert类型转换 ...
- 【C#编程基础学习笔记】6---变量的命名
2013/7/24 技术qq交流群:JavaDream:251572072 教程下载,在线交流:创梦IT社区:www.credream.com [C#编程基础学习笔记]6---变量的命名 ----- ...
- 1.C#基础学习笔记3---C#字符串(转义符和内存存储无关)
技术qq交流群:JavaDream:251572072 教程下载,在线交流:创梦IT社区:www.credream.com ------------------------------------- ...
- Java基础学习笔记总结
Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...
- Mysql数据库基础学习笔记
Mysql数据库基础学习笔记 1.mysql查看当前登录的账户名以及数据库 一.单表查询 1.创建数据库yuzly,创建表fruits 创建表 ) ) ,) NOT NULL,PRIMARY KEY( ...
- 0003.5-20180422-自动化第四章-python基础学习笔记--脚本
0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...
- Java基础学习笔记(一)
Java基础学习笔记(一) Hello World 基础代码学习 代码编写基础结构 class :类,一个类即一个java代码,形成一个class文件,写于每个代码的前端(注意无大写字母) XxxYy ...
- C#RabbitMQ基础学习笔记
RabbitMQ基础学习笔记(C#代码示例) 一.定义: MQ是MessageQueue,消息队列的简称(是流行的开源消息队列系统,利用erlang语言开发).MQ是一种应用程序对应用程序的通信方法. ...
- handlebars.js基础学习笔记
最近在帮学校做个课程网站,就有人推荐用jquery+ajax+handlebars做网站前端,刚接触发现挺高大上的,于是就把一些基础学习笔记记录下来啦. 1.引用文件: jquery.js文件下载:h ...
随机推荐
- AtCoder Regular Contest 074 F - Lotus Leaves
题目传送门:https://arc074.contest.atcoder.jp/tasks/arc074_d 题目大意: 给定一个\(H×W\)的网格图,o是可以踩踏的点,.是不可踩踏的点. 现有一人 ...
- 洛谷 P3935 Calculating
虽然对这道题没有什么帮助,但是还是记一下:约数个数也是可以线性筛的 http://www.cnblogs.com/xzz_233/p/8365414.html 测正确性题目:https://www.l ...
- 域名IP主动验证(一)
功能:主动验证给定的域名.IP对是否真正的关联 思路: 1.一开始通过修改hosts文件,把待验证的域名.IP对添加到文件里,然后用wget尝试访问,再恢复hosts文件重新验证下一对 2.后来了解到 ...
- python实战之爬取喜玛拉雅专辑信息
import urllib.request import json from lxml import etree url='http://www.ximalaya.com/dq/8.ajax' hea ...
- 迭代器模式及php实现
迭代器模式: 迭代器模式是遍历集合的成熟模式,迭代器模式的关键是将遍历集合的任务交给一个叫做迭代器的对象,它的工作时遍历并选择序列中的对象,而客户端程序员不必知道或关心该集合序列底层的结构. 角色: ...
- CF989C A Mist of Florescence
思路: 有趣的构造题. 实现: #include <bits/stdc++.h> using namespace std; ][]; void fillin(int x, int y, c ...
- MSDN值得学习的地方
作者:朱金灿 来源:http://blog.csdn.net/clever101 我一直认为:如果你没有乔布斯那样的天才,能够从头脑中原创出好产品,那么最好先学习分析好的产品,它到底好在哪里?哪些地方 ...
- xcode6的项目中虚拟键盘无法弹出
这是因为Xcode6中的模拟器键盘设置跟之前的版本不一样了.之前版本是模拟器的键盘和电脑的键盘都可以使用,但是Xcode6的模拟器键盘只能使用一种,即要么是模拟器键盘,要么是电脑键盘.快捷键切换键盘类 ...
- 如何用sql server数据库恢复.bak数据库备份
@hcy(黄灿奕) 之前有两次都恢复不了,折腾了很长时间,这一次碰到这样的问题,居然又忘了,又捣鼓了很长时间,现在记下来 1.右击SQL Server 2008实例下的“数据库”文件夹.就是与安全性. ...
- ECharts是我接触过的最优秀的可视化工具,也是进步最快的软件,希望它早日成为世界级的开源项目。
ECharts的广泛网址: http://echarts.baidu.com/doc/example.html 零编程玩转图表: http://tushuo.baidu.com/?qq-pf-to=p ...