1. 流的分类

  java.io

1.1 输入和输出流

  File类不能访问文件内容本身,需要使用输入/输出流

  输入输出流的方向是相对与内存读写的方向。

1.2 字节流和字符流

  1. 字节流
    1. InputSteam
    2. OutputStream
  2. 字符流
    1. Reader
    2. Writer
    3. BufferedReader

1.3 节点流和处理流

  处理流:

  1. PrintStream
  2. FileInputStream
  3. FileOutputStream
FileOutputStream fos = new FileOutputStream("text.txt");
PrintStream ps = new PrintStream(fos);
ps.println("sdfsdf");

2. 转换流

  只有字节流转为字符流。(InputStreamReader, OutputStreamWriter)

InputStreamReader reader = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(reader);//再次包装
String line = br.readLine();

3. 推回输入流

4. 重定向标准输入/输出

System.setErr(PrintStream err);
System.setIn(InputStream in);
System.setOut(PrintStream out);

5. java虚拟机读写其他进程的数据

InputStream p.getErrorStream();
InputStream p.getInputStream();
Outputstream p.getOutputStream();
Process p = Runtime.getRuntime().exec("javac");
BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String buff = null;
while((buff = br.readLine()) != null){
  System.out.println(buff);
}
Scanner sc = new Scanner(System.in);//用于获取标准输入

6. RandomAccessFile:

  只能读写文件,不能读写其他IO节点。可以任意改变指针的位置。当向文件的中间部分插入内容时,会覆盖从指针开始的内容,所以需要先保存从指针到末尾的内。

操作文件记录指针的方法:

  1. long getFilePointer();
  2. void seek(long pos);

读写方法

  1. read()
  2. write()
RandomAccessFile raf = new RandomAccessFile("AA.java", "r");
raf.seek(300);//指针移到300字节处

7. 对象序列化

  类必须实现Serializable和Externalizable接口之一。通常每个javabean都实现Serializable接口。

7.1 使用对象流序列化

  ObjectOutputStream、ObjectInputStream

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.txt"));
Person per = new Person("name",age);
oos.writeObject(per); ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.txt"));
Person p = (Person)ois.readObject();

反序列化读取的是java对象的数据,而不是java类,因此反序列化恢复java对象时,必须提供java对象所属的class文件。
反序列化机制无须通过构造器来初始化对象。

一个对象重复序列化时,只有第一次将对象转为字节序列并输出,后续的序列化,都是获得序列化编号。并且,在第一次序列化之后,对象的属性的更改,不会被序列化。

7.2 自定义序列化:

private transient int age;

在序列化之前,先调用writeReplace()再调用writeObject()方法。
反序列化,系统先调用readObject(),再调用readResolve()。后者的返回值,会取代前者的返回结果。后者常常用于序列化单例类和枚举。

对象的类名、实例变量(包括基本类型、数组、对其他对象的引用)都会被序列化;方法、类变量、transient实例变量都不会被序列化。

7.3 Externalizable实现序列化

8. NIO

8.1 Buffer

  1. CharBuffer
  2. ByteBuffer
  3. ShortBuffer
  4. IntBuffer
  5. LongBuffer
  6. FloatBuffer
  7. DoubleBuffer

Charbuffer和ByteBuffer最常用。

0≤mark≤position≤limit≤capacity

allocate(int count)

flip()

clear()

CharBuffer buff = CharBuffer.allocate(8);
System.out.println("capacity:" + buff.capacity());
System.out.println("limit:" + buff.limit());
System.out.println("position:" + buff.position()); System.out.println("\nput begin:");
buff.put('a');
System.out.println("position = " + buff.position());
buff.put('b');
System.out.println("position = " + buff.position());
buff.put('c');
System.out.println("position = " + buff.position()); System.out.println("\nflip begin:");
buff.flip();
System.out.println("limit=" + buff.limit());
System.out.println("position=" + buff.position()); System.out.println("\nread begin:");
System.out.println(buff.get());
System.out.println("position = " + buff.position());
System.out.println(buff.get());
System.out.println("position = " + buff.position());
System.out.println(buff.get());
System.out.println("position = " + buff.position()); System.out.println("\nclear begin:");
buff.clear();
System.out.println("limit=" + buff.limit());
System.out.println("position=" + buff.position());

8.2 Chanel

程序不能直接访问Channel中的数据,包括读取、写入都不行。只能与buffer交互。

  1. FileChannel
  2. DatagramChannel
  3. Pipe.SinkChannel
  4. Pipe.SourceChannel

所有的channel都通过节点流的getChannel()方法来返回对象。

channel的方法:

  1. map()
  2. read()
  3. write()

8.3 Charset

public class CharsetTest {
public static void main(String[] args) throws CharacterCodingException{
Charset cn = Charset.forName("GBK");
CharsetEncoder encoder = cn.newEncoder();
CharsetDecoder decoder = cn.newDecoder();
CharBuffer cbuff = CharBuffer.allocate(8);
cbuff.put("孙");
cbuff.put("悟");
cbuff.put("空");
cbuff.flip();
ByteBuffer bbuff = encoder.encode(cbuff);
for(int i=0;i<bbuff.capacity();i++){
System.out.println(bbuff.get(i)+"");
}
System.out.println("\n"+decoder.decode(bbuff));
}
}

8.4 文件锁

  1. lock()
  2. tryLock()

Java-输入输出的更多相关文章

  1. java 输入输出 io

    学习JAVA  输入输出篇 java不像C中拥有scanf这样功能强大的函数,大多是通过定义输入输出流对象.常用的类有BufferedReader,Scanner.实例程序:一,利用 Scanner ...

  2. Java输入输出小结

    无论使用哪一种编程语言,输入输出都是我们首当其冲的,因此简单整理了 一下关于Java输入输出知识点,还有些内容摘自其它博客,忘见谅. 第一部分,让我们看一下Java的输出 public class M ...

  3. ACM之Java输入输出

    本文转自:ACM之Java输入输出 一.Java之ACM注意点 1. 类名称必须采用public class Main方式命名 2. 在有些OJ系统上,即便是输出的末尾多了一个“ ”,程序可能会输出错 ...

  4. Java—输入输出技术

    在Java中,通过java.io包提供的类来表示流,基本的输入输出流为InputStream和OutputStream.从这两个基本的输入输出流派生出面向特定处理的流,如缓冲区读写流.文件读写流等. ...

  5. java 输入输出 函数对象构造

    /*********************输入输出*******************/   //输入字符串 不包括最后的换行符'\n'     import java.io.BufferedRe ...

  6. java输入输出

    1. import java.io.*;//写进文档,然后又在显示器显示出来.public class fileinputstream{public static void main(String[] ...

  7. java输入输出高速

    头文件: import java.io.*; 定义: BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); ...

  8. 蓝桥杯Java输入输出相关

    转载自:http://blog.csdn.net/Chen_Tongsheng/article/details/53354169 一.注意点 1. 类名称必须采用public class Main方式 ...

  9. Java基础教程——使用Eclipse快速编写Java输入输出代码

    Eclipse安装 IDE:Integrated Development Environment,集成开发环境.好比是全自动洗衣机. 此处使用[eclipse-jee-4.6-neon-3-win32 ...

  10. java 输入输出 对象序列化implements Serializable与反序列化:ObjectOutputStream.writeObject() ;objectInputStream.readObject() ;serialVersionUID字段注意

    对象序列化 对象序列化的目标是将对象保存到磁盘中,或允许在网络中直接传输对象.对象序列化机制允许把内存中的 Java 对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,通过网络将 ...

随机推荐

  1. sql server导入mdf 报操作系统错误 5:“5(拒绝访问。)”

    错误一:拒绝访问 在安装示例库时出现以下的错误 消息 5120,级别 16,状态 101,第 1 行无法打开物理文件"D:\Download\AdventureWorks2012_Data. ...

  2. Java 性能优化实战记录(1)---定位并分析耗cpu最多的线程

    1) jps    列出相关的java进程, 以及对应的pid    也可以使用如下命令来尝试    ps aux | grep java --color 2) top -Hp <pid> ...

  3. 232. Implement Queue using Stacks

    Implement the following operations of a queue using stacks. push(x) -- Push element x to the back of ...

  4. SQL参数化查询--最有效可预防SQL注入攻击的防御方式

    参数化查询(Parameterized Query 或 Parameterized Statement)是访问数据库时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值. 在使用参 ...

  5. leetcode 127. Word Ladder ----- java

    Given two words (beginWord and endWord), and a dictionary's word list, find the length of shortest t ...

  6. Oozie的安装过程

    依赖CDH5,JDK和关系数据库 集群规划 主机名   IP                      Ooize节点 CHD1    XX.XX.XX.XX  oozie server,oozie ...

  7. Amazon-countDuplicate

    Print the count of duplicate char in a given string in same order. Ex: Input- 'abbaccdbac', Output- ...

  8. MySQL : interactive_timeout v/s wait_timeout

    Most of the database intensive applications are worring about the default values of these variables ...

  9. EDIUS和会声会影的区别

    最近经常听到大家讨论会声会影和EDIUS哪个好,有人说会声会影就相当于傻瓜相机,EDIUS相当于手动的相机:也有人说拍着玩的,简单玩玩的用会声会影,做出来画面很绚丽:剪辑片子,特效合成专业的就用EDI ...

  10. ORA-12170: TNS: 连接超时

    ORA-12170: TNS: 连接超时 如果在本机可以正常使用,可是到局域网中的其他机器就出现“ORA-12170:TNS:连接超时 解决方法: 1.cmd-----ping ip地址 查看网络问题 ...