java io

参考
Java IO学习笔记(一):File类
Java IO学习笔记(二):RandomAccessFile类
Java IO学习笔记(三):字节流与字符流
Java IO学习笔记(四):字节-字符转换流
Java IO学习笔记(五):内存操作流
Java IO学习笔记(六):管道流
Java IO学习笔记(七):打印流
Java IO学习笔记(八):System类对IO的支持
Java IO学习笔记(九):BufferedReader和Scanner

java io系列01之 "目录"

java io_第1张图片
Paste_Image.png
java io_第2张图片
Paste_Image.png
一、File类

1.public static final String pathSeparator 表示路径的分隔符(windows是“;”)
2.public static final String separator 表示路径的分隔符(windows是“\”)
3.public File(String pathname) 创建File类对象,传入完整路径
4.public boolean createNewFile()throws IOException 创建新文件
5.public boolean delete() 删除文件
6.public boolean exists() 判断文件是否存在
7.public boolean isDirectory() 判断给定的路径是否在一个目录
8.public long length() 返回文件的大小
9.public String[] list() 列出指定目录的全部内容,只是名称
10.public File[] listFiles() 列出指定目录的全部内容,会有路径
11.Public Boolean mkdir() 创建一个目录
12.Public Boolean renameTo(File dest) 为已有的文件重命名


import java.io.File;
import java.io.IOException;

public class Test3 {
public static void main(String[] args) {
File f=new File("d:"+File.separator+"test.txt");
if(f.exists()){
f.delete();
}else{
try {
f.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

二、字节流与字符流

在java.io包中操作文件内容的主要有两大类:字节流、字符流,两类都分为输入和输出操作。在字节流中输出数据主要是使用OutputStream完成,输入使的是InputStream,在字符流中输出主要是使用Writer类完成,输入流主要使用Reader类完成。(这四个都是抽象类)

字节流主要是操作byte类型数据,以byte数组为准,主要操作类就是OutputStream、InputStream


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class Test11 {
public static void main(String[] args) throws IOException {
File f = new File("d:" + File.separator+"test.txt");
OutputStream out=new FileOutputStream(f);//如果文件不存在会自动创建
String str="Hello World";
byte[] b=str.getBytes();
out.write(b);//因为是字节流,所以要转化成字节数组进行输出
out.close();
}
}


以上输出只会进行覆盖,如果要追加的话,请看FileOutputStream类的另一个构造方法:
public FileOutputStream(File file,boolean append)throws FileNotFoundException
在构造方法中,如果将append的值设置为true,则表示在文件的末尾追加内容。

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class Test13 {
public static void main(String[] args) throws IOException {
File f = new File("d:" + File.separator+"test.txt");
InputStream in=new FileInputStream(f);
byte[] b=new byte[(int) f.length()];
in.read(b);
in.close();
System.out.println(new String(b));
}
}

在程序中一个字符等于两个字节,那么java提供了Reader、Writer两个专门操作字符流的类。
字符流的操作比字节流操作好在一点,就是可以直接输出字符串了,不用再像之前那样进行转换操作了。


import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class Test16 {
public static void main(String[] args) throws IOException {
File f = new File("d:" + File.separator+"test.txt");
Writer out=new FileWriter(f);
String str="Hello World";
out.write(str);
out.close();
}
}


import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class Test19 {
public static void main(String[] args) throws IOException {
File f = new File("d:" + File.separator+"test.txt");
Reader input=new FileReader(f);
char[] c=new char[1024];
int temp=0;
int len=0;
while((temp=input.read())!=-1){
c[len]=(char) temp;
len++;
}
input.close();
System.out.println(new String(c,0,len));
}
}

就字节流与字符流抽象类中的方法来看其实方法名,返回值类型等都很相似,只是在传入参数部分,字节流的write()方法需要传入的是字节数组,字符流的write()方法需要传入的是字符数组(String也算字符数组?)但是我们都知道字符数组和字节数组是很容易通过getBytes()和new String()来互换的。字节流和字符流的根本区别显然不在此处,那么到底字节流和字符流的主要区别是什么呢?
1.字节流在操作时不会用到缓冲区(内存),是直接对文件本身进行操作的。而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。
2.在硬盘上的所有文件都是以字节形式存在的(图片,声音,视频),而字符值在内存中才会形成。

字节流在操作的时候本身是不会用到缓冲区(内存)的,是对文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的。字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容

什么叫缓冲区?
在很多地方都碰到缓冲区这个名词,那么到底什么是缓冲区?又有什么作用呢?
回答:缓冲区可以简单地理解为一段内存区域。可以简单地把缓冲区理解为一段特殊的内存。某些情况下,如果一个程序频繁地操作一个资源(如文件或数据库),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,以后直接从此区域中读取数据即可,因为读取内存速度会比较快,这样可以提升程序的性能。在字符流的操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区暂存数据。如果想在不关闭时也可以将字符流的内容全部输出,则可以使用Writer类中的flush()方法完成。

从JDK文档中可以知道FileOutputStream是OutputStream的直接子类。FileInputStream也是InputStream的直接子类,但是在字符流文件的两个操作类却有一些特殊,FileWriter并不直接是Writer的子类,而是OutputStreamWriter的子类,而FileReader也不直接是Reader的子类,而是InputStreamReader的子类,那么从这两个类的继承关系就可以清楚的发现,不管是使用字节流还是字符流实际上最终都是以字节的形式操作输入输出流的。也就是说,传输或者从文件中读取数据的时候,文件里真正保存的数据永远是字节。

那开发中究竟用字节流好还是用字符流好呢?
在所有的硬盘上保存文件或进行传输的时候都是以字节的方法进行的,包括图片也是按字节完成,而字符是只有在内存中才会形成的,所以使用字节的操作是最多的。
字符流只能对文本文件进行读取, 他比字节流对文本文件的操作效率高。字节流主要是对非文本文件(如一些媒体文件 :图片,电影,音乐等)进行操作的。注意:字节流可以对所有类型的文件进行操作。如果用字节流操作文本文件,没有字符流操作文本文件 效率高。例如txt、exel文件可以用字符流,针对视频文件、图片文件等实用字节流。如果要java程序实现一个拷贝功能,应该选用字节流进行操作(可能拷贝的是图片),并且采用边读边写的方式(节省内存)。

三、ByteArrayInputStream、ByteArrayOutputStream

之前所讲解的程序中,输出和输入都是从文件中来得,当然,也可以将输出的位置设置在内存之上,此时就要使用ByteArrayInputStream、ByteArrayOutputStream.以下是以内存操作流完成的一个大小写字母转换的程序:


import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class Test22 {
public static void main(String[] args) throws IOException {
String str="HELLO WORlD!!!";
InputStream input=new ByteArrayInputStream(str.getBytes());
OutputStream output=new ByteArrayOutputStream();
int temp=0;
while((temp=input.read())!=-1){
output.write(Character.toLowerCase(temp));
}
input.close();
output.close();
System.out.println(output.toString());
}
}

四、使用PipedInputStream,PipedOutputStream心得体会
五、BufferedReader

如果想要接收任意长度的数据,而且避免乱码产生,就可以使用BufferedReader
public class BufferedReader extends Reader

因为输入的数据有可能出现中文,所以,此处使用字符流完成。BufferedReader是从缓冲区之中读取内容,所有的输入的字节数据都将放在缓冲区之中。System.in本身表示的是InputStream(字节流),现在要求接收的是一个字符流,需要将字节流变成字符流才可以,所以要用InputStreamReader

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test33 {
    public static void main(String[] args) throws IOException {
        BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
        String str=reader.readLine();
        System.out.println(str);
    }
}

你可能感兴趣的:(java io)