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 对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,通过网络将 ...
随机推荐
- win7 一些快捷系统工具命令
1.cleanmgr: 打开磁盘清理工具 2.compmgmt.msc: 计算机管理 3.conf: 启动系统配置实用程序 4.charmap: 启动字符映射表 5.calc: 启动计算器 6.chk ...
- linux.打包与压缩
//打包tar -zcvf etc.tar.gz /etc//解包tar -zxvf hdmzy.tar.gz
- Queue及Stack
Queue 她是一个接口,有多冢实现方式(LinkedList.ArrayDeque等) 类别 方法 入队 add.offer(优先级高) 出队 remove.poll 查询 element.peek ...
- Codeforces Round #375 (Div. 2) A B C 水 模拟 贪心
A. The New Year: Meeting Friends time limit per test 1 second memory limit per test 256 megabytes in ...
- Docker简介
Docker简介 1.容器虚拟化,比传统的虚拟化轻量 2.2013年出现,发展非常迅猛 3.Redhat在6.5版本开始支持docker 4.使用go语言开发,基于apache2.0协议 5.开源原件 ...
- Codeforces Round #123 (Div. 2)
A. Let's Watch Football 记时间为\(t\), 则\(bt+(b-a)c>=0\),可得\[t \ge \frac{c(a-b)}{b}\] B. After Traini ...
- 使用Metasploit进行端口扫描
Metasploit中不仅能够使用第三方扫描器Nmap等,在其辅助模块中也包含了几款内建的端口扫描器. 查看Metasploit框架提供的端口扫描工具: msf > search portsca ...
- C++@重载函数
关于重载详细分析参考: http://www.cnblogs.com/skynet/archive/2010/09/05/1818636.html 内部机制涉及重载函数如何解决命名冲突,调用匹配的问题 ...
- Bootloader的原理以及实现(转载)
BootLoader工作原理 BootLoader工作原理 BootLoader指系统启动后,在操作系统内核运行之前运行的一段小程序.通过BootLoader,我们可以初始化硬件设备.建立内存空间的映 ...
- 万能写入sql语句,并且防注入
通过perpare()方法和检查字段防sql注入. $pdo=new PDO('mysql:host=localhost;dbname=scms', 'root' ); $_POST=array('t ...