Java IO 简记
1.File 类:
l java.io.File类:文件和目录路径名的抽象表示形式,与平台无关
l File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。
l File对象可以作为参数传递给流的构造函数
l File类的常见构造方法:
- public File(String pathname)
以pathname为路径创建File对象,可以是绝对路径或者相对路径,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。
- public File(String parent,String child)
以parent为父路径,child为子路径创建File对象。
File的静态属性String separator存储了当前系统的路径分隔符。在UNIX中,此字段为‘/’,在Windows中,为‘\\’
2.流的分类:
l 按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)
l 按数据流的流向不同分为:输入流,输出流
l 按流的角色的不同分为:节点流,处理流
Java的IO流共涉及40多个类,实际上非常规则,都是从如下4个抽象基类派生的
>节点流可以从一个特定的数据源读写数据(P2P)
(输入) FileInputStream、FileReader
(输出) FileOutputStream、FileWriter
----------
>处理流是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能(缓冲流)
(输入流):BufferedInputStream、BufferedReader
(输出流):BufferedOutputStream、BufferedWriter
l 为了提高数据读写的速度,Java API提供了带缓冲功能的流类,在使用这些流类时,会创建一个内部缓冲区数组
l 根据数据操作单位可以把缓冲流分为:
- BufferedInputStream 和 BufferedOutputStream
- BufferedReader 和 BufferedWriter
l 缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,同时增加了一些新的方法
l 对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush()将会使内存中的数据立刻写出
-----------
>对象流
l ObjectInputStream和OjbectOutputSteam
- 用于存储和读取对象的处理流。它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。
l 序列化(Serialize):用ObjectOutputStream类将一个Java对象写入IO流中
l 反序列化(Deserialize):用ObjectInputStream类从IO流中恢复该Java对象
- ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量
对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。
当其它程序获取了这种二进制流,就可以恢复成原来的Java对象序列化的好处在于可将任何实现了Serializable接口的对象转化为字节数据,使其在保存和传输时可被还原。
注意:如果某个类的字段不是基本数据类型或 String 类型,而是另一个引用类型,那么这个引用类型必须是可序列化的,否则拥有该类型的 Field 的类也不能序列化
-------------------
程序中打开的文件 IO 资源不属于内存里的资源,垃圾回收机制无法回收该资源,所以应该显式关闭文件 IO 资源
- public class TestIO {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- File newFile = new File("D:/io.txt");
- InputStream inStream = null;
- OutputStream outStream = null;
- try {
- if (newFile.createNewFile()) {
- System.out.println("文件创建成功");
- } else {
- System.out.println("文件创建已存在");
- }
- inStream = new FileInputStream(newFile);
- int read = -1;
- while ((read = inStream.read()) != -1) {
- System.out.print((char) read);
- }
- outStream = new FileOutputStream(newFile, true);
- outStream.write("Tttttt".getBytes());
- outStream.flush();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } finally {
- try {
- inStream.close();
- outStream.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- @Test
- public void testCharStream() {
- File newFile = new File("D:/io.txt");
- FileReader readerStream = null;
- FileWriter writerStream = null;
- try {
- if (newFile.createNewFile()) {
- System.out.println("文件创建成功");
- } else {
- System.out.println("文件创建已存在");
- }
- readerStream = new FileReader(newFile);
- int read = -1;
- while ((read = readerStream.read()) != -1) {
- System.out.print((char) read);
- }
- writerStream = new FileWriter(newFile, true);
- writerStream.write("Tttttt");
- writerStream.flush();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } finally {
- try {
- readerStream.close();
- writerStream.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- @Test
- public void testBufferStream() {
- File newFile = new File("D:/io.txt");
- FileReader readerStream = null;
- FileWriter writerStream = null;
- try {
- if (newFile.createNewFile()) {
- System.out.println("文件创建成功");
- } else {
- System.out.println("文件创建已存在");
- }
- readerStream = new FileReader(newFile);
- int read = -1;
- while ((read = readerStream.read()) != -1) {
- System.out.print((char) read);
- }
- writerStream = new FileWriter(newFile, true);
- writerStream.write("Tttttt");
- writerStream.flush();
- System.out.println("写入完成,重新读取。。。");
- BufferedReader bReader = new BufferedReader(readerStream);
- System.out.println(bReader.readLine() + "--");
- bReader.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } finally {
- try {
- readerStream.close();
- writerStream.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- @Test
- public void testObjectStream() throws FileNotFoundException, IOException, ClassNotFoundException {
- File file = new File("person.txt");
- // 序列化持久化对象
- ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file));
- Person person = new Person("Peter", 27);
- out.writeObject(person);
- out.close();
- // 反序列化,并得到对象
- ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
- Object newPerson = in.readObject(); // 没有强制转换到Person类型
- in.close();
- System.out.println(newPerson);
- }
- static class Person implements Serializable {
- private String name = null;
- private Integer age = null;
- public Person() {
- System.out.println("无参构造");
- }
- public Person(String name, Integer age) {
- this.name = name;
- this.age = age;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Integer getAge() {
- return age;
- }
- public void setAge(Integer age) {
- this.age = age;
- }
- // getter setter方法省略...
- @Override
- public String toString() {
- return "[" + name + ", " + age + "]";
- }
- }
- }
3.RandomAccessFile 类
RandomAccessFile 类支持 “随机访问” 的方式,程序可以直接跳到文件的任意地方来读、写文件
RandomAccessFile 对象包含一个记录指针,用以标示当前读写处的位置。RandomAccessFile 类对象可以自由移动记录指针:
- long getFilePointer():获取文件记录指针的当前位置
- void seek(long pos):将文件记录指针定位到 pos 位置
构造器
创建 RandomAccessFile 类实例需要指定一个 mode 参数,该参数指定 RandomAccessFile 的访问模式:
- r: 以只读方式打开
- rw:打开以便读取和写入
- rwd:打开以便读取和写入;同步文件内容的更新
- rws:打开以便读取和写入;同步文件内容和元数据的更新
- RandomAccessFile raf = new RandomAccessFile("test.txt", "rw");
- raf.seek(5);
- //先读出来
- String temp = raf.readLine();
- raf.seek(5);
- raf.write("xyz".getBytes());
- raf.write(temp.getBytes());
- raf.close();
Java IO 简记的更多相关文章
- java.IO输入输出流:过滤流:buffer流和data流
java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...
- Java:IO流与文件基础
Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...
- Java IO之字符流和文件
前面的博文介绍了字节流,那字符流又是什么流?从字面意思上看,字节流是面向字节的流,字符流是针对unicode编码的字符流,字符的单位一般比字节大,字节可以处理任何数据类型,通常在处理文本文件内容时,字 ...
- java Io流向指定文件输入内容
package com.hp.io; import java.io.*; public class BufferedWriterTest{ public static void main(String ...
- java Io文件输入输出流 复制文件
package com.hp.io; import java.io.FileInputStream; import java.io.FileNotFoundException; import java ...
- java Io流更新文件内容
package com.hp.io; import java.io.FileOutputStream; import java.io.IOException; public class FileOut ...
- java IO流详解
流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- java.io.NotSerializableException: test.io.file.Student
java.io.NotSerializableException: test.io.file.Student at java.io.ObjectOutputStream.writeObject0 ...
- java.io.IOException: mark/reset not supported
java.io.IOException: mark/reset not supported at java.io.InputStream.reset(InputStream.java:348) at ...
随机推荐
- EasyUI入门视频教程
EasyUI入门视频教程02 http://www.tudou.com/programs/view/TBlaIcNU5ck/
- 在ListView的GroupItem头中显示每列的Summary
问题描述 WPF自带的ListView和DataGrid控,都提供了数据分组的支持,并可以对分组的Header进行自定义.但是,如果想在每个分组的Header中,显示出本分组的"小计&quo ...
- VirtualBox + CentOS 虚拟机网卡配置
摘要: 要学好Linux,还是得自己搭建虚拟机. VirtualBox比较小巧简单,容易上手.在配合CentOS 6.4使用时,首要的问题就是网卡配置,尤其是使用SSH终端仿真程序(例如SecureC ...
- 基于镜像安装mysql
准备目录 cd /opt mkdir -p mysql/data mysql/logs mysql/conf 查找MySql镜像版本 docker search mysql 安装指定版本的mysql镜 ...
- PLSQL使用技巧----加快你的编程效率
使用PLSQL 编程效率明显有所提高了 1.登录后默认自动选中My Objects 默认情况下,PLSQL Developer登录后,Brower里会选择All objects,如果你登录的 ...
- java ScriptEngine 使用
Java SE 6最引人注目的新功能之一就是内嵌了脚本支持.在默认情况下,Java SE 6只支持JavaScript,但这并不以为着Java SE 6只能支持JavaScript.在Java SE ...
- iOS 添加震动效果
开发过程中,有时候会碰到点击按钮或者某个动画会配合震动效果:下面介绍iOS开发过程中的震动添加: 导入:#import <AudioToolbox/AudioToolbox.h> 在需要出 ...
- 【译】常见 Java 异常解释(恶搞版)
常见 Java 异常解释:(译者注:非技术角度分析.阅读有风险,理解需谨慎o(╯□╰)o) java.lang ArithmeticException 你正在试图使用电脑解决一个自己解决不了的数学问题 ...
- js面对对象编程
说到js,非常大一部分人会说我非常熟悉,在日常的web开发中经经常使用,那么你的js代码是符合面对对象思路的吗?那你会问我面向过程的js代码有什么不好吗?我的感受是面对对象的js编码更加简洁,降低了混 ...
- crontab定时任务写法记录
基本格式 : * * * * * command 分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示 第2列表示小时1-23(0表示0点) 第3列表示日期1-31 第4列表示 ...