Java学习--day9-partone

来源:互联网 发布:2016网络写手收入排行 编辑:程序博客网 时间:2024/05/02 04:49
Java IO
1、操作文件的类File
整个IO包中,唯一与文件本身有关的类就是file类。文件操作会存在延迟,因为操作都需要通过JVM完成。
最好使用以下格式,可以在任意操作系统中使用
File.pathSeparator(); //返回路径分隔符 windows返回\
String path ="d:"+File.pathSeparator()+"text.txt";File f = new File(path);
f.createNewFile(); //创建新文件 需要使用try...catch
f.exists(); //判断是否存在
f.delete(); //文件删除前最好先判断文件是否存在
f.mkdir();创建文件夹
f.list();列出指定目录下的文件,返回的是一个数组
f.listFiles();列出指定目录下每个文件的完整路径,返回的是一个数组
f.isDirectory();判断是否为目录

2、RandomAccessFile类
该类是对文件内容操作,属于随机读取类,可以随机读取一个文件中指定文件的数据。
String path ="d:"+File.pathSeparator()+"text.txt";File f = new File(path);
写入数据
RandomAccessFile rdf = new RandomAccessFile(f,"rw"); \\以读写方式打开
rdf.writeBytes("....")
rdf.writeInt(....)
rdf.close();
读取数据
rdf.skipBytes();跳过多少字节
rdf.readInt();
rdf.readBytes();
但是操作较于复杂,一般使用字节流或者字符流。

3、字节流和字符流
在程序中所有的数据都是以流的方式进行传输或保存的。
字节流输出使用OutputStream类完成,输入使用InputStream类。如果操作的是一个文件,可以使用FileOutputStream类,通过上转型为OutputStream实例化。
例:用字节流向文件中写入内容
File f = new File("d:"+File.pathSeparator()+"text.txt");
OutputStream out = FileOutputStream(f); \\FileOutputStream(f,true)此方法若是加上true,则表示追加内容
String str = "hello world";
byte b[] = str.getBytes(); //只能操作字节
out.write(b);
out.close();
例:用字节流从文件中读取内容,三种方法
File f = new File("d:"+File.pathSeparator()+"text.txt");
InputStream Input= FileInputStream(f);
1)byte b[] = new byte[(int)f.length]; //取得文件大小,不会开辟多余的数组长度
input.read(b); //读取到b数组中,返回长度
2)for(int i =0;i<b.length;i++){
b[i]=(byte)input.read();
}
3)int len =0;
byte b[] = new byte[1024];
int temp =0;
while((temp=input.read())!=-1){ //如果返回-1,则表示已经读到底了
b[len]=(byte)temp;
len++;
}
out.close();
字符流输出使用Writer类,输入使用Reader类完成。
例:用字符流向文件中写入内容
File f = new File("d:"+File.pathSeparator()+"text.txt");
Writer out = new FileWriter(f); //追加内容类似字节流,再后面加上true
String str = "hello world";
out.write(str); //唯一好处就是可以直接用String,而不用再转成Byte数组
out.close();
例:用字符流从文件中读取内容
File f = new File("d:"+File.pathSeparator()+"text.txt");
Reader in =FileReader(f);
char c[] = new char[1024];
int len=in.read(c);
sysout(new String(c,0,len));

字节流和字符流的区别:字节流再操作时不会用到缓冲区(内存),是文件本身的操作。字符流会先把数据放到缓冲区,通过缓冲区再操作文件。字节流的使用中,如果未关闭,内容还是会显示。但在操作字符流时,关闭字符流的时会强制性地把缓冲区的内容输出,所以如果没有关闭则看不到内容。如果想在不关闭字符流的情况下看到内容,则需要主动的使用flush()方法。
在开发中,字节流更多。因为所有文件在传输过程中都是以字节的形式传输的。

4、转换流——OutputStreamWriter类和InputStreamReader类
OutputStreamWriter类:是Writer的子类,将输出的字符流变为字节流。
InputStreamReader类:是Reader的子类,将输入的字节流变为字符流。
例:将字节输出流变为字符输出流
File f = new File("d:"+File.pathSeparator()+"text.txt");
Writer out = null;
out = new OutputStreamWriter(new FileOutputStream(f));
String str = "hello world";
out.write(str);
out.close();

FileOutputStream是OutputStream的直接子类,FileInputStream也是InputStream的直接子类。但FileReader并不是Reader的子类,而是InputStreamReader的子类,FileWriter也是。因此,不管是使用字符流还是字节流,实际上最终还是以字节的形式操作输入输出流。

5、内存操作流
之前的都是对文件的输入输出,ByteArrayInputStream(将数据写入内存)和ByteArrayOutputStream(将内存的数据输出)可以将输出输入设置在内存上。
类似之前的操作,具体操作就补详细写了。
内存操作流一般操作一些临时信息,保存在文件中的话执行完代码还得删除文件十分麻烦。

6、管道流
管道流的主要作用是可以进行两个线程的通信。PipedOutputStream和PipedInputStream.
在程序中定义两个线程对象,在发送的线程类中定义管道输出流,在接收的线程类中定义管道的输入流。在主类中使用PipedOutputStream类提供的connect方法将两个线程中的管道对象连接在一起,线程启动会自动进行输入输出。
例:
class Send implement Runnable{
private PipedOutputStream pos = null;
public Send(){
this.pos= new PipedOutputStream();
}
public void run(){
异常操作...
this.pos,write(str.getBytes());
异常操作...
this.pos.close();
}
public PipedOutputStream getPos(){
return pos;
}
}
class Receive implement Runnable{
private PipedInputStream pis = null;
public Receive (){
this.pis= new PipedInputStream();
}
public void run(){
异常操作...
len=this.pis.read(b);
异常操作...
this.pos.close();
sysouut(new String(b,0,len));
}
public PipedInputStream getPis(){
return pis;
}
}
public class demo(){
实例化s;
实例化r;
异常操作...
s.getPos().connect((r.getPis));
new Thread(s).start();
new Thread(r).start();
}

7、打印流
主要包含字节打印流PrintStream和字符打印流PrintWriter;
PrintStream是OutputStream的子类。PrintStream有一个构造方法可以接收OutputStream的实例,因为PrintStream类可以更加方便地输出数据。
PrintStream ps = new PrintStream(new FileOutputStream(new File("d:"+File.separator + "test.txt")));
ps.print("hello");
ps.println("world");
格式化输出
String name = "zhao";int age =30;float score = 990.356f; char sex = 'M';
ps.printf("姓名: %s;年龄: %d;成绩: %f;性别: %c",name,age,score,sex);

8、System类对IO的支持
①System.out 对应系统标准输出,一般指显示器。
System.out是PrintStream的对象,System.out.print()println()实际上调用的是PrintStream类的方法。
OutputStream out = System.out; //向屏幕上输出
异常...
out.write("hello world".getBytes());
out.close();
如果使用FileOutputStream为OutputStream实例化,则向文件输出。完全体现了Java的多态性,根据子类的不同完成的功能也不同。
②System.err 错误信息输出
try{
...
}catch(Exception e){
System.err.println(e);
}
③System.in 键盘的输入流
其本身是Inputstream类型的对象。
InputStream in = System.in; //从键盘接收
byte[] b = new byte[1024];
System.out.print("请输入数据:");
int len = in.read(b);
System.out.println("输入信息为:"+new String(b,0,len));
in.close();
④输入输出重定向
System.setOut(new PrintStream(new FileOutputStream(new File("d:"+File.separator + "test.txt"))));
System.out.println("hello"); //不再向屏幕输出,而是向文件内输出

System.setErr(new PrintStream(new ByteArrayOutputStream())); //一般不用,因为错误信息是不希望用户看到的

System.setIn(....); //System.in主要针对键盘键盘的的输入,一般不见用户重定向System.in。
0 0
原创粉丝点击