Java进阶篇(五)——Java的I/O技术
程序中,为了永久的保存创建的数据,需要将其保存在磁盘文件中,以便在其它程序中使用它们。Java的I/O技术可以将数据保存到文本文件、二进制文件甚至是ZIP压缩文件中,以达到永久性保存数据的要求。
本篇我们要介绍的内容就是Java的I/O技术,即输入/输出。
一、输入/输出流
流是一组有序的数据序列,根据操作的类型,可分为输入流和输出流。
而专门负责各种方式的输入、输出的类,都被放在java.io包中。所有输入流都是抽象类InputStream(字节输入流)或抽象类Reader(字符输入流)的子类;所有输出流都是抽象类OutputStream(字节输出流)或抽象类Writer(字符输出流)的子类。
1. 字节输入/输出流
下面是一个字节输入/输出流的实例。其中,第14行为从输入流中读取字节并存入buffer数组中,最长读取2500个字节,返回值b为实际读取的长度。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream; public class IOExample {
public static void main(String[] args) {
try {
int b;
File file = new File("E:\\test.txt"); // 创建一个文件 FileInputStream readfile = new FileInputStream(file); // 创建输入流 byte buffer[] = new byte[2500]; // 创建字节数组
b = readfile.read(buffer, 1, 2000); // 1为buffer数组中的起始偏移量
String str = new String(buffer, 0, b, "Default");
System.out.println(str);
readfile.close(); // 关闭流 FileOutputStream writefile = new FileOutputStream(file, true); // 创建一个输出流,true为保留原有数据,新数据追加至结尾
writefile.write(buffer, 0, b);
writefile.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
上述代码中的FileInputStream类和FileOutputStream类属于文件输入输出流,该类分别继承自InputStream类和OutputStream类。
InputStream类常用方法需了解read()、close()、reset()等方法;OutputStream类常用方法需了解write()、flush()、close()等方法。具体可参照API。
2. 字符输入/输出流
下面是一个字符输入/输出流的实例。
import java.io.FileReader;
import java.io.FileWriter; public class IOExample {
public static void main(String[] args) {
try {
FileReader fileread = new FileReader("E:\\test.txt"); // 字符输入流,读取文件信息 char[] cbuf = new char[500];
int b = fileread.read(cbuf, 0, 500);
System.out.println(String.valueOf(cbuf));
fileread.close(); FileWriter filewriter = new FileWriter("E:\\test.txt", true); // 字符输出流,向输出流中写入信息,并且保留原有数据,追加数据值末尾处
filewriter.write(cbuf);
filewriter.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
上述代码中的FileReader类和FileWriter类也属于文件输入输出流。
3. 文件输入/输出流
上面的代码中出现了一个新的名词叫文件输入/输出流,也就是FileInputStream、FileOutputStream和FileReader、FileWriter。它们的作用是与指定的文件建立连接,将需要的数据永久保存到文件中。
FileInputStream类和FileOutputStream类都是用来操作磁盘文件的,如果用户的文件读取比较简单,则可使用该类。但由于汉字在文件中占用两个字节,读取不好可能出现乱码现象。
FileReader类和FileWriter类可避免乱码现象,分别对应了FileInputStream类和FileOutputStream类。
二、File类
File类是io包中唯一代表磁盘文件本身的对象,可以通过调用File类中的方法,实现创建、删除、重命名文件等。
1. 文件的创建与删除
可以使用File类创建一个文件对象,三种构造方法的语法格式如下:
new File(String pathname)
new File(String parent, String child)
new File(File f, String child)
pathname是路径名称,parent是父路径字符串,child是子路径字符串,f是父路径对象。如下例:
File file = new File("E:/test.txt");
File file = new File("E:/myword","word.txt");
如果E:/myword目录下没有名称为word的文件,File类对象可通过createNewFile()方法创建一个名称为word.txt的文件;如果存在,可通过delete()方法将其删除。
2. 获取文件信息
File类提供了许多方法用于获取文件本身的一些信息,下表是一些常用方法。
| 方法 | 说明 |
| getName() | 获取文件的名称 |
| canRead() | 判断文件是否可读 |
| canWrite() | 判断文件是否可以被写入 |
| exist() | 判断文件是否存在 |
| length() | 获取文件的长度 |
| getAbsolutePath() | 获取文件的绝对路径 |
| getParent() | 获取文件的父路径 |
| isFile() | 判断文件是否存在 |
| isDirectory() | 判断文件是否是一个目录 |
| isHidden() | 判断文件是否是隐藏文件 |
| lastModifed() | 获取文件最后修改时间 |
如我们创建一个文件,获取文件长度等信息如下:
import java.io.File;
public class FileTest {
public static void main(String[] args) {
File file = new File("E:/myword", "word.txt"); // 创建文件对象
if(file.exists()) { // 判断文件是否存在
String name = file.getName(); // 获取文件名称
long length = file.length(); // 获取文件长度
boolean hidden = file.isHidden(); // 判断文件是否是隐藏文件
System.out.println("文件名称:" + name);
System.out.println("文件长度是:" + length);
System.out.println("是否是隐藏文件:" + hidden);
} else {
System.out.println("文件不存在");
}
}
}
三、带缓存的输入/输出流
缓存是I/O的一种性能优化。缓存流为I/O流增加了内存缓存区。
1. BufferedInputStream类与BufferedOutputStream类
构造函数如下:
BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in, int size)
BufferedOutputStream(OutputStream in)
BufferedOutputStream(OutputStream in, int size)
2. BufferedReader类与BufferedWriter类
常用方法如下:
| 方法 | 说明 |
| read() | 读取单个字符 |
| readLine() | 读取一个文本行,返回为字符串;若无数据则返回为null |
| write(String s, int off, int len) | 写入字符串的某一部分 |
| flush() | 刷新该流的缓存 |
| newLine() | 写入一个行分隔符 |
这里要注意,在使用BufferedWriter类的write()方法时,数据并没有立刻被写入到输出流时,而是首先进入缓存区中,如果想立刻将缓冲区中的数据写入输出流中,一定要调用flush()方法。
四、数据输入/输出流
数据输入/输出流为DataInputStream类与DateOutputStream类,允许应用程序以与机器无关的方式从底层输入流中读取基本Java数据类型。
构造方法如下:
DataInputStream(InputStream in)
DataOutputStream(OutputStream out)
DataOutputStream类提供了以下三种写入字符串的方法:
writeBytes(String s)
writeChars(String s)
writeUTF(String s)
五、ZIP压缩输入/输出流
利用ZipOutputStream类对象,可将文件压缩为.zip文件。
构造函数如下:
ZipOutputStream(OutputStream out);
ZipInputStream类可读取ZIP压缩格式的文件,包括对已压缩和未压缩条目的支持。
构造函数如下:
ZipInputStream(InputStream out);
Java进阶篇(五)——Java的I/O技术的更多相关文章
- Java进阶(十五)Java中设置session的详细解释
Java中设置session的详细解释 简单通俗的讲session就是象一个临时的容器,用来存放临时的东西.从你登陆开始就保存在session里,当然你可以自己设置它的有效时间和页面,举个简单的例子: ...
- Java进阶(五)Java I/O模型从BIO到NIO和Reactor模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/java/nio_reactor/ Java I/O模型 同步 vs. 异步 同步I/O 每个请求必须逐个地被处理,一个请 ...
- Java总结篇:Java多线程
Java总结篇系列:Java多线程 多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: ...
- java提高篇-----理解java的三大特性之封装
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- Java进阶(三)多线程开发关键技术
原创文章,同步发自作者个人博客,转载请务必以超链接形式在文章开头处注明出处http://www.jasongj.com/java/multi_thread/. sleep和wait到底什么区别 其实这 ...
- Java进阶(四十)Java类、变量、方法修饰符讲解
Java进阶(四十)Java类.变量.方法修饰符讲解 Java类修饰符 abstract: 将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. final: 将一个类生命为最终(即非继承类) ...
- Java进阶(三十七)java 自动装箱与拆箱
Java进阶(三十七)java 自动装箱与拆箱 前言 这个是jdk1.5以后才引入的新的内容.java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装称为装箱,解包装称为 ...
- Java进阶篇(六)——Swing程序设计(下)
三.布局管理器 Swing中,每个组件在容器中都有一个具体的位置和大小,在容器中摆放各自组件时很难判断其具体位置和大小,这里我们就要引入布局管理器了,它提供了基本的布局功能,可以有效的处理整个窗体的布 ...
- Java进阶篇(六)——Swing程序设计(上)
Swing是GUI(图形用户界面)开发工具包,内容有很多,这里会分块编写,但在进阶篇中只编写Swing中的基本要素,包括容器.组件和布局等,更深入的内容会在高级篇中出现.想深入学习的朋友们可查阅有关资 ...
随机推荐
- micropython TPYBoard v202 超声波测距
实验目的 了解超声波模块的工作原理 学习使用超声波模块测量距离 实验器材 TPYBoard v202 1块 超声波模块(HC-SR04)1个 micro USB数据线 1条 杜邦线 若干 超声波模块的 ...
- python 命令
pip list 可以查看已经安装的插件 pip show name 可以查看插件的信息(如:pip show selenium) pip install selenium==[version num ...
- duilib基本框架
最近我一个同学在项目中使用到了duilib框架,但是之前并没有接触过,他与我讨论这方面的内容,看着官方给出的精美的例子,我对这个库有了很大的兴趣,我自己也是初学这个东东,我在网上花了不少时间来找相关的 ...
- Codeforces #451 Div2 F
#451 Div2 F 题意 给出一个由数字组成的字符串,要求添加一个加号和等号,满足数字无前导 0 且等式成立. 分析 对于这种只有数字的字符串,可以快速计算某一区间的字符串变成数字后并取模的值,首 ...
- ICP在pose-graph中的作用
从1维的角度进行解释: 1m P0 o-----------------------o P1 假如LOAM计算的两个车辆初始位姿P0.P1如上图所示,作为pose-graph的两个顶点.那么二 ...
- java.io.FileNotFoundException class path resource [xxx.xml] cannot be opened
没有找到xxx.xml,首先确定你项目里有这个文件吗,如果没有请添加,或者你已经存在配置文件,只是名字不是xxx.xml,请改正名字.此外还要注意最好把xxx.xml加入到classpath里,就是放 ...
- 51 Nod 1007 正整数分组【类01背包】
1007 正整数分组 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 将一堆正整数分为2组,要求2组的和相差最小. 例如:1 2 3 4 5,将1 2 4分为1组, ...
- c++(排序二叉树插入)
二叉树的节点插入比较简单.一般来说,二叉树的插入主要分为以下两个步骤: 1) 对当前的参数进行判断,因为需要考虑到头结点,所以我们使用了指针的指针作为函数的输入参数 2) 分情况讨论: 如果原来二叉树 ...
- 了解 Python 语言中的时间处理
python 语言对于时间的处理继承了 C语言的传统,时间值是以秒为单位的浮点数,记录的是从1970年1月1日零点到现在的秒数,这个秒数可以转换成我们日常可阅读形式的日期和时间:我们下面首先来看一下p ...
- 向ajaxform和ajaxgrid中添加数据
--ajaxform function add(){ $.request({ action:"add", success:onaddcomplete }); } function ...