java io学习小计
程序员文章站
2022-04-09 17:28:50
...
InputStream 是所有输入流类的父类
OutputStream 是所有输出流类的父类
FileInputStream 文件输入流
FileOutputStream 文件输出流
FileOutputStream out = new FileOutputStream("1.txt");
out.write("hello word!".getBytes());
out.close();
FileInputStream in = new FileInputStream("1.txt");
byte[] b = new byte[1024];
System.out.println(new String(b,0,in.read(b)));
in.close();
FileWriter 用来写入字符文件的便捷类
FileRader 用来读取字符文件的便捷类
FileWriter w = new FileWriter("1.txt");
w.write("www.sina.com");
w.close();
FileReader r = new FileReader("1.txt");
char[] c = new char[1024];
int len = r.read(c);
r.close();
System.out.println(new String(c,0,len));
注意:
FileReader,FileWriter
用于读取和写入字符流。要读写原始字节流,请考虑使用 FileInputStream和FileOutputStream
。
RandomAccessFile 此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组,意思就是可以操作文件指针。比如跳过多少个字节读取数据,指定读取数据开始的位置等等。(类似断点续传可以使用该类实现)
public class Employee {
String name = null;
int age = 0;
// 为了使数据是等长的记录,就是每条记录是相等大小的,规定name长度为8,(age是int 固定4个字节不用管)
public static final int LEN = 8;
Employee(String name,int age){
if(name.length() > LEN){
name = name.substring(0,LEN);//大于8截取
}else{
while(name.length() < LEN){//小于8补空
name += "\u0000";
}
}
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class RandomAccessFiles {
public static void main(String[] args) {
// TODO Auto-generated method stub
Employee e1 = new Employee("张三", 12);
Employee e2 = new Employee("李四", 13);
Employee e3 = new Employee("赵武", 14);
try {
RandomAccessFile f = new RandomAccessFile(new File("1.txt"), "rw");
try {
//写入数据
f.writeChars(e1.getName());
f.writeInt(e1.getAge());
f.writeChars(e2.getName());
f.writeInt(e2.getAge());
f.writeChars(e3.getName());
f.writeInt(e3.getAge());
f.close();
//读取数据
RandomAccessFile f2 = new RandomAccessFile(new File("1.txt"),"r");
f2.skipBytes(20);//跳过20个字节
String s = "";
for (int i = 0; i < 8; i++) {
s += f2.readChar();
}
System.out.println(s + ":" + f2.readInt());
s = "";
//文件指针设置为0(开始位置)
f2.seek(0);
for (int i = 0; i < 8; i++) {
s+=f2.readChar();
}
System.out.println(s + ":" + f2.readInt());
s= "";
f2.skipBytes(20);//跳过20个字节
for (int i = 0; i < 8; i++) {
s+=f2.readChar();
}
System.out.println(s + ":" + f2.readInt());
f2.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果:
李四:13
张三:12
赵武:14
PipedInputStream 和 PipedOutputStream 主要是实现管道流通信的类,多个线程之间传送流数据。
import java.io.IOException;
import java.io.PipedInputStream;
//管道接收
public class Receiver extends Thread {
PipedInputStream in = new PipedInputStream();
public PipedInputStream getIn() {
return in;
}
public void run(){
byte[] b = new byte[1024];
try {
//读取
int len = in.read(b);
System.out.println(new String(b,0,len));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
import java.io.*;
//管道输出
public class Sender extends Thread {
PipedOutputStream out = new PipedOutputStream();
public PipedOutputStream getOut() {
return out;
}
public void run(){
String s = "hello word!";
try {
//输出
out.write(s.getBytes());
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class Test {
/**
* @param args
* @throws IOException
* @throws InterruptedException
*/
public static void main(String[] args) throws IOException, InterruptedException {
// TODO Auto-generated method stub
Sender sender = new Sender();
Receiver receiver = new Receiver();
PipedOutputStream out = sender.getOut();
PipedInputStream in = receiver.getIn();
//连接管道
in.connect(out);
receiver.start();
Thread.sleep(1000);
sender.start();
}
}
ByteArrayInputStream 和 ByteArrayOutputStream 能通过操作流的方法来操作字节数组,一般用来做数据缓存之用
下面是将一个字符串转换成大写的例子,使用了字节缓存区实现。
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class Test {
/**
* @param args
* @throws IOException
* @throws InterruptedException
*/
public static void main(String[] args) throws IOException, InterruptedException {
// TODO Auto-generated method stub
/*
Sender sender = new Sender();
Receiver receiver = new Receiver();
PipedOutputStream out = sender.getOut();
PipedInputStream in = receiver.getIn();
in.connect(out);
receiver.start();
Thread.sleep(1000);
sender.start();*/
ByteArrayInputStream in = new ByteArrayInputStream("abcdefg".getBytes());
ByteArrayOutputStream out = new ByteArrayOutputStream();
tranform(in,out);
byte[] b = out.toByteArray();
System.out.println(new String(b));
}
//转换大写
public static void tranform(InputStream in , OutputStream out){
try {
int len = -1;
while((len = in.read())!=-1){
char c = Character.toUpperCase((char)len);
out.write(c);
}
out.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
StringWriter 和 StringReader 也是字符流的缓存区。和字节缓存区的区别是一个操作的是单个字符char的数组,一个是操作原始的字节数组
推荐阅读
-
从.Net到Java学习第六篇——SpringBoot+mongodb&Thymeleaf&模型验证
-
Java IO文件编码转换实现代码
-
Java文件读写IO/NIO及性能比较详细代码及总结
-
Java使用IO流实现音频的剪切和拼接
-
Filter、Servlet、Listener的学习_动力节点Java学院整理
-
java学习之利用TCP实现的简单聊天示例代码
-
Java基础学习总结(129)——Arrays.asList得到的List进行add和remove等操作出现异常解析
-
java网络编程学习java聊天程序代码分享
-
Socket+JDBC+IO实现Java文件上传下载器DEMO详解
-
java并发学习之BlockingQueue实现生产者消费者详解