Java-输入输出
1. 流的分类
java.io
1.1 输入和输出流
File类不能访问文件内容本身,需要使用输入/输出流
输入输出流的方向是相对与内存读写的方向。

1.2 字节流和字符流
- 字节流
- InputSteam
- OutputStream
- 字符流
- Reader
- Writer
- BufferedReader
1.3 节点流和处理流
处理流:
- PrintStream
- FileInputStream
- 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节点。可以任意改变指针的位置。当向文件的中间部分插入内容时,会覆盖从指针开始的内容,所以需要先保存从指针到末尾的内。
操作文件记录指针的方法:
- long getFilePointer();
- void seek(long pos);
读写方法
- read()
- 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
- CharBuffer
- ByteBuffer
- ShortBuffer
- IntBuffer
- LongBuffer
- FloatBuffer
- 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交互。
- FileChannel
- DatagramChannel
- Pipe.SinkChannel
- Pipe.SourceChannel
所有的channel都通过节点流的getChannel()方法来返回对象。
channel的方法:
- map()
- read()
- 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 文件锁
- lock()
- tryLock()
Java-输入输出的更多相关文章
- java 输入输出 io
学习JAVA 输入输出篇 java不像C中拥有scanf这样功能强大的函数,大多是通过定义输入输出流对象.常用的类有BufferedReader,Scanner.实例程序:一,利用 Scanner ...
- Java输入输出小结
无论使用哪一种编程语言,输入输出都是我们首当其冲的,因此简单整理了 一下关于Java输入输出知识点,还有些内容摘自其它博客,忘见谅. 第一部分,让我们看一下Java的输出 public class M ...
- ACM之Java输入输出
本文转自:ACM之Java输入输出 一.Java之ACM注意点 1. 类名称必须采用public class Main方式命名 2. 在有些OJ系统上,即便是输出的末尾多了一个“ ”,程序可能会输出错 ...
- Java—输入输出技术
在Java中,通过java.io包提供的类来表示流,基本的输入输出流为InputStream和OutputStream.从这两个基本的输入输出流派生出面向特定处理的流,如缓冲区读写流.文件读写流等. ...
- java 输入输出 函数对象构造
/*********************输入输出*******************/ //输入字符串 不包括最后的换行符'\n' import java.io.BufferedRe ...
- java输入输出
1. import java.io.*;//写进文档,然后又在显示器显示出来.public class fileinputstream{public static void main(String[] ...
- java输入输出高速
头文件: import java.io.*; 定义: BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); ...
- 蓝桥杯Java输入输出相关
转载自:http://blog.csdn.net/Chen_Tongsheng/article/details/53354169 一.注意点 1. 类名称必须采用public class Main方式 ...
- Java基础教程——使用Eclipse快速编写Java输入输出代码
Eclipse安装 IDE:Integrated Development Environment,集成开发环境.好比是全自动洗衣机. 此处使用[eclipse-jee-4.6-neon-3-win32 ...
- java 输入输出 对象序列化implements Serializable与反序列化:ObjectOutputStream.writeObject() ;objectInputStream.readObject() ;serialVersionUID字段注意
对象序列化 对象序列化的目标是将对象保存到磁盘中,或允许在网络中直接传输对象.对象序列化机制允许把内存中的 Java 对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,通过网络将 ...
随机推荐
- DEDECMS调用特定ID文章内容的实现方法
DEDECMS调用特定ID文章内容的实现方法 {dede:loop table='dede_addonarticle' sort='aid' row='8' if='aid=524'} [field: ...
- DB2 函数大全
DB2函数大全 函数名 函数解释 函数举例 AVG() 返回一组数值的平均值. SELECTAVG(SALARY)FROMBSEMPMS; CORR(),CORRELATION() 返回一对数值的关系 ...
- 199. Binary Tree Right Side View
Given a binary tree, imagine yourself standing on the right side of it, return the values of the nod ...
- HDU 5692 线段树+dfs序
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- leetcode 109 Convert Sorted List to Binary Search Tree ----- java
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
- 越狱Season 1-Episode 14: The Rat
Season 1, Episode 14: The Rat -Michael: 24 hours from now, 24小时后 my brother is scheduled to die, sch ...
- 【BZOJ1010】【HNOI2008】玩具装箱
继续看黄学长代码 原题: P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1.. ...
- 让PHP代码更危险----使用别的系统命令--如sql语句--exec(),system()方法甚至html的js语句
如题,所以涉及到别的语言时,程序就可能更加不安全.
- 20 款超棒免费的 Bootstrap 管理和前端模板
http://www.oschina.net/news/62506/20-best-free-bootstrap-admin-and-frontend-templates-2015
- c++中的dictionary对象:map的使用备忘
#include <map> #include <iostream> using namespace std; void main(){ map <string, int ...