java中的流可以从不同的角度进行分类

按流的方向:输入流、输出流(注意这里的输入(read)、输出是相对于程序而言的(writer),个人认为从读、写角度理解更为直观)

按处理数据单位:字节流、字符流(字节流为继承自InputStream和OutputStream的流,以字节(8位)为单位读写;字符流为继承自Reader和Writer的流,以字符(16位)为单位读写)

按实现功能:节点流、处理流(节点流直接与数据源相连读写;处理流在节点流的基础上,再套接一层以完成特定的读写功能)

  

Java IO流详尽解析

java IO流学习总结

一、File

1、File

public class FileTest {

    public static void main(String[] args) {

        String ps1 = File.pathSeparator;//与系统有关的路径分隔符(':'),为了方便,它被表示为一个字符串
char ps2 = File.pathSeparatorChar;//与系统有关的路径分隔符(':' 58)
String ps3 = File.separator ;//与系统有关的默认名称分隔符('/'),为了方便,它被表示为一个字符串
char ps4 = File.separatorChar ;//与系统有关的默认名称分隔符('/' 47) File file = new File("/home/sunjf/a.txt");//通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例
File f = new File("/home/sunjf");
File f1 = new File(f, "a.txt");//根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例
File f2 = new File("/home/sunjf", "c.txt");//根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例 System.out.println("测试此抽象路径名表示的文件或目录是否存在 : " + file.exists());
System.out.println("测试应用程序是否可以读取此抽象路径名表示的文件 : " + file.canRead());
System.out.println("测试应用程序是否可以修改此抽象路径名表示的文件 : " + file.canWrite()); System.out.println("返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null : " + file.getParent());
System.out.println("返回由此抽象路径名表示的文件或目录的名称 : " + file.getName());
System.out.println("将此抽象路径名转换为一个路径名字符串 : " + file.getPath()); System.out.println("测试此抽象路径名表示的文件是否是一个目录 : " + file.isDirectory());
System.out.println("测试此抽象路径名表示的文件是否是一个标准文件 : " + file.isFile());
System.out.println("测试此抽象路径名指定的文件是否是一个隐藏文件 : " + file.isHidden());
System.out.println("测试此抽象路径名是否为绝对路径名 : " + file.isAbsolute()); System.out.println("返回此抽象路径名表示的文件最后一次被修改的时间 : " + file.lastModified());
System.out.println("返回由此抽象路径名表示的文件的长度 : " + file.length()); String[] pathStr = f.list();//返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录
for(String s : pathStr) System.out.println("返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录 " + s);
File[] fileArr = f.listFiles();
for(File index : fileArr) System.out.println("返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录 " + index); file.delete();//删除此抽象路径名表示的文件或目录 file.mkdir();//创建此抽象路径名指定的目录
//file.mkdirs();//创建此抽象路径名指定的目录,包括所有必需但不存在的父目录 //if (file.exists()) file.delete();
/*try {
file.createNewFile();//当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件
} catch (IOException e) {
e.printStackTrace();
}*/
} }

JAVA的I/O介绍

二、字节流:OutputStream和InputStream

1、字节文件流:FileOutStream和FileInputStream

public class Test {
public static void main(String[] args) {
File file = new File("D:/a.txt");
try { } catch (IOException e) {
e.printStackTrace();
} try {
FileOutputStream fos = new FileOutputStream(file);// 创建一个向指定 File 对象表示的文件中写入数据的文件输出流,会覆盖之前的数据
//FileOutputStream fos = new FileOutputStream("D:/a.txt");
//FileOutputStream fos = new FileOutputStream(file, true);//不会覆盖之前数据
//FileOutputStream fos1 = new FileOutputStream("D:/a.txt", true);
//FileOutputStream fos = new FileOutputStream(fos1.getFD());//创建一个向指定文件描述符处写入数据的输出文件流,该文件描述符表示一个到文件系统中的某个实际文件的现有连接
System.out.println("返回与此流有关的文件描述符 : " + fos.getFD().getClass());
System.out.println("返回与此文件输出流有关的唯一 FileChannel 对象 : " + fos.getChannel().getClass());
char[] c = {'H', 'e', 'l', 'l', 'o', ' ', 'I', '/', 'O', '!', '\n'};
for (char ch : c) fos.write(ch);//将指定字节写入此文件输出流
byte[] b = {'H', 'e', 'l', 'l', 'o', ' ', 'I', '/', 'O', '!', '\n'};
fos.write(b);//将 b.length 个字节从指定 byte 数组写入此文件输出流中
fos.write(b, 6, 5);//将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流 FileInputStream fis = new FileInputStream(file);
int index = 0;
while ((index = fis.read()) != -1) {//数据读出
System.out.print((char) index);
}
fos.close();//关闭写入流
fis.close();//关闭读出流 } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

2、字节缓存流:BufferOutputStream和BufferInputStream

  继承自FilterOutputStream和FilterInputStream,实现了带缓冲的过滤流,它提供了缓冲机制,可以提高该I/O流的读取效率,在初始化时,除了要指定所连接的I/O流之外,还可以指定缓冲区的大小。在读写的同时对数据缓存,这样避免每次读写数据都要进行实际的物理读写操作,在用BufferdOutputStream输出时,数据先输入缓冲区,当缓冲区满的时再写入连接的输出流,可以调用flush()来清空缓冲区。

public class BufferStreamTest {

    public static void main(String[] args) {
File file = new File("D:/a.txt");
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
try {
OutputStream fos = new FileOutputStream(file, true);
BufferedOutputStream bos = new BufferedOutputStream(fos);//实例化需要通过OutputStream指定所连接的I/0流
byte[] b = {'H', 'e', 'l', 'l', 'o', ' ', 'I', '/', 'O', '!', '\n'};
bos.write(b);
bos.write(b);
bos.write(b);
bos.flush();//必须flush,write只是将数据写入缓存 InputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
int i = 0;
while ((i = bis.read()) != -1) System.out.print((char)i);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} }

3、字节数据流:DataOutputStream和DataInputStream

  数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。需要注意的是输出流的写方法与输入流的读方法必须对应。

public class DateStreamTest {

    public static void main(String[] args) {
File file = new File("/home/sunjf/a.txt");
try {
if (!file.exists()) {
file.createNewFile();
}
} catch (IOException e) {
e.printStackTrace();
} try {
OutputStream fos = new FileOutputStream(file);
DataOutputStream dos = new DataOutputStream(fos);
String str = "java流学习!";
//dos.writeUTF(str);//以与机器无关方式使用 UTF-8 修改版编码将一个字符串写入基础输出流
dos.writeLong(123l);//将一个 long 值以 8-byte 值形式写入基础输出流中,先写入高字节
dos.flush();
dos.close();
fos.close(); InputStream fis = new FileInputStream(file);
DataInputStream dis = new DataInputStream(fis);
//System.out.println(dis.readUTF());
System.out.println(dis.readLong());//读取八个输入字节并返回一个 long 值
dis.close();
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} }

4、字节对象流:ObjectOutputStream和ObjectInputStream

  被读写的对象必须实现Serializable接口,及必须序列化。

public class ObjectStreamTest {

    public static void main(String[] args) {
File file = new File("/home/sunjf/User.txt");
try {
if (!file.exists()) {
file.createNewFile();
}
} catch (IOException e) {
e.printStackTrace();
} try {
OutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
User u = new User();
u.setUserName("java");
u.setAge(20);
oos.writeObject(u);
oos.close(); InputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
System.out.println(ois.readObject().toString());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} } class User implements Serializable {
private String userName;
private int age; public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return userName + " | " + age;
}
}

三、字符流:Writer和Reader

1、文件字符流:FileWriter和FileReader

  使用字符流可以写入、读取汉字,如果用上面的字节流写入、读取得到的会是乱码。

public class WriterAndReaderTest {
public static void main(String[] args) {
File file = new File("/home/sunjf/a.txt");
try {
if (!file.exists()) {
file.createNewFile();
} char[] c = {'你', '好', ',', '流', '!'};
FileWriter fw = new FileWriter(file);
//fw.write(c);//写入单个字符
//fw.write(c, 0, c.length);//将字符写入数组的某一部分
String str = "你好,流!";
fw.write(str, 0, str.length());//写入一部分字符串
fw.flush();//刷新该流的缓冲 FileReader fr = new FileReader(file);
int index = 0;
System.out.println("判断此流是否已经准备好用于读取 : " + fr.ready());
while ((index = fr.read()) != -1) {
System.out.print((char) index);//读取单个字符
//fr.skip('!');//跳过某些字符
}
fw.close();//关闭此流,但要先刷新它
fr.close();//关闭该流并释放与之关联的所有资源
} catch (IOException e) {
e.printStackTrace();
}
}

2、缓存字符流:BufferWriter和BufferReader

  除了多了缓存功能外,还可以按行读写数据。

public class BufferLineTest {

    public static void main(String[] args) {
File file = new File("D:/a.txt");
try {
if (!file.exists()) {
file.createNewFile();
}
} catch (IOException e) {
e.printStackTrace();
} try {
Writer fw = new FileWriter(file, true);
BufferedWriter bw = new BufferedWriter(fw);//需要通过Writer指定连接的I/O流
String str = "你好,流!";
bw.write(str);
bw.newLine();//写入一个行分隔符
bw.write(str);
bw.newLine();
bw.write(str);
bw.newLine();
bw.flush(); Reader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String s = "";
while ((s = br.readLine()) != null) System.out.println(s);//读取一个文本行
} catch (IOException e) {
e.printStackTrace();
} } }

四、总结

java:IO流学习小结

1、读取纯文本用Reader和Writer

2、按行读写用BufferWriter和BufferReader

3、数据流的读写方法必须对应

4、对象流的读写对象必须实现Serializable接口

5、处理流必须通过OutputStream和InputStream指定所链接的I/O流

java从基础知识(九)I/O的更多相关文章

  1. Java 多线程——基础知识

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  2. java必备基础知识(一)

    学习的一点建议: 每一门语言的学习都要从基础知识开始,学习是一个过程,"万丈高楼平地起",没有一个好的地基,想必再豪华的高楼大厦终究有一天会倒塌.因此,我们学习知识也要打牢根基,厚 ...

  3. 什么才是java的基础知识?

    近日里,很多人邀请我回答各种j2ee开发的初级问题,我无一都强调java初学者要先扎实自己的基础知识,那什么才是java的基础知识?又怎么样才算掌握了java的基础知识呢?这个问题还真值得仔细思考. ...

  4. java部分基础知识整理----百度脑图版

    近期发现,通过百度脑图可以很好的归纳总结和整理知识点,本着学习和复习的目的,梳理了一下java部分的知识点,不定期更新,若有不恰之处,请指正,谢谢! 脑图链接如下:java部分基础知识整理----百度 ...

  5. Java 多线程基础(九)join() 方法

    Java 多线程基础(九)join 方法 一.join() 方法介绍 join() 定义 Thread 类中的,作用是:把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.如:线 ...

  6. JAVA相关基础知识

    JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分, ...

  7. JAVA多线程基础知识(一)

    一. 基础知识 要了解多线程首先要知道一些必要的概念,如进程,线程等等.开发多线程的程序有利于充分的利用系统资源(CPU资源),使你的程序执行的更快,响应更及时. 1. 进程,一般是指程序或者任务的执 ...

  8. Java SE 基础知识(一)

    一.基础知识 1. Java SE : Java Standard Edition Java ME : Java Micro Edition Java EE : Java Enterprise Edi ...

  9. JAVA学习基础知识总结(原创)

    (未经博主允许,禁止转载!) 一.基础知识:1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨平 ...

  10. java正则表达式基础知识(转)

    1基础 2.1 简单字符类 构造 描述 [abc] a,b或c [^abc] 除a,b或c外的字符 [a-zA-Z] a至z 或 A至Z [a-d[m-p]] a至d 或 m至p [a-z&& ...

随机推荐

  1. php 7.0 新特性

    php 7 主题是性能优化  SEO 之前版本:开发效率快,语言本身性能差 普通的php网站:IO密集型,瓶颈在mysql上,体现不出来php的性能劣势,在密集计算方面比C,C++,JAVA差几十倍甚 ...

  2. Cookie和Session的那些事儿

    Cookie和Session都是为了保持用户的访问状态,一方面为了方便业务实现,另一方面为了简化服务端的程序设计,提高访问性能.Cookie是客户端(也就是浏览器端)的技术,设置了Cookie之后,每 ...

  3. phpstudy配置伪静态的方法

    mod_rewrite是Apache的一个非常强大的功能,它可以实现伪静态页面.下面我详细说说它的使用方法1.检测Apache是否支持mod_rewrite通过php提供的phpinfo()函数查看环 ...

  4. jenkins 入门教程(下)

    接上回继续学习jenkins,这次主要来看一些疑难杂症: 一.yum install安装方式 除了直接java -jar jenkins.war方式,还可以用yum安装,这种方式下提供了更多的可配置选 ...

  5. [LeetCode] Shuffle an Array 数组洗牌

    Shuffle a set of numbers without duplicates. Example: // Init an array with set 1, 2, and 3. int[] n ...

  6. [LeetCode] Palindrome Linked List 回文链表

    Given a singly linked list, determine if it is a palindrome. Follow up: Could you do it in O(n) time ...

  7. [LeetCode] Consecutive Numbers 连续的数字

    Write a SQL query to find all numbers that appear at least three times consecutively. +----+-----+ | ...

  8. CentOS中Mysql常用操作

    安装mysqlyum -y install mysql-server 修改mysql配置vi /etc/my.cnf 这里会有很多需要注意的配置项,后面会有专门的笔记暂时修改一下编码(添加在密码下方) ...

  9. asp.net 正则获取url参数

    现在有一种场景:Url是数据库里面的,里面带有很多参数,如何获取具体参数的值呢? var uri = new Uri(pageUrl); var queryString = uri.Query; va ...

  10. ftp文件的部署

    之前在公司搭建了一个静态资源服务器,现在来记录一下 我们是通过搭建vsftp服务,然后结合apache.访问方式为http的方式 一:VSFTPD环境安装 首先我们就是要查看一下vsftpd是否有安装 ...