java自学笔记之IO流

IO流:

IO流用来处理设备之间的数据传输
Java对数据的操作是通过流的方式
Java用于操作流的对象都在IO包中
流按操作数据分为两种:字节流与字符流 。
流按流向分为:输入流,输出流。

字节抽象基类:InputStream ,OutputStream;

字符抽象基类:Reader,Writer;


字符缓冲区: BufferedReader  和 BufferedWriter:方法有readLine();    直接读一行数据 判断是否等于null,返回String;

字节缓冲区:BufferedInputStream 和 BufferedOutputStream

转换流: InputStreamReader,OutputStreamWriter  将字节流转换为字符流


清空缓冲区就是删除完里面的内容sb.delete(0,sb,length());


专门用于操作文件的Writer子类对象:FileWriter;

FileWriter fw = new FileWriter("demo.java");  //创建对象时必须初始化。如果有同名的,会覆盖。

//FileWriter fw = new FileWriter("demo.java",true) // true 代表不覆盖已有文件 ,有就写在末尾

fw.writer("you \r\n xiang")                   //注意换行为\r\n

fw.flush();

fw.close();


FileReader fr = new FileReader("demo.java");   //创建一个文件读取对象,要保证该文件时已经存在的,否则会抛出异常

byte[]  buf = new byte[1024];

int num =0;  

while((num=fr.read(buf))!=-1)     //read(byte[])返回的事读到的字符个数

new String(buf,0,num);


/BufferedFileWriter bufw = new BufferedFileWriter(new FileWriter(""));   套上缓冲区

        BufferedFileReader bufr = new BufferedFileReader(new FileReader(""));   套上缓冲区

String line ="";

while((line = bufr.readLine ())!=null)

{

bufw.wite(line);

bufw.newLine();

bufw.flush();

}


装饰设计模式:

已有的对象进行功能增强 readLine()对read()的装饰

可以定义类,将已有对象传入,基于已有的功能,并提供加强功能

LineNumberReader   getLineNumber()和setLineNumber()  set就是从多少行开始读


BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));键盘录入,数据源
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));控制台,数据目的

处理数据时,一定要先明确数据源,与数据目的地。
数据源可以是文件,可以是键盘。
数据目的地可以是文件、显示器或者其他设备。
而流只是在帮助数据进行传输,并对传输的数据进行处理,比如过滤处理.转换处理等。


File对象功能:

1、创建

boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false。和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会覆盖。
boolean mkdir():创建文件夹。
boolean mkdirs():创建多级文件夹

2、删除。
boolean delete():删除失败返回false。如果文件正在被使用,则删除不了返回false。
void deleteOnExit();在程序退出时删除指定文件。

3,判断。
boolean exists() :文件是否存在.记住在判断文件对象是否是文件或者目录时,必须要先判断该文件对象封装的内容是否存在。

isFile():
isDirectory();
isHidden();
isAbsolute();

4,获取信息。
getName():
getPath():
getParent():该方法返回的是绝对路径中的父目录。如果获取的是相对路径,返回null。如果相对路径中有上一层目录那么该目录就是返回结果。
getAbsolutePath()
long lastModified()
long length()

调用list方法的file对象必须是封装了一个目录。该目录还必须存在。 列出指定目录下文件或者文件夹,包含子目录中的内容。也就是列出指定目录下所有内容。

list()方法里面可以建立内部类传入过滤器重写accept方法列出指定的文件名称。

File [] files = file.listFiles(new FileNameFilter(){
			public boolean accept(File dir,String name)
			{
				return name.endsWith(".avi");
			}
		});

listFiles()方法同上可以返回文件的对象。所以用listFile比较好。

自己写了个从文件夹下遍历复制文件到指定目录

import java.io.*;

class CopyVideo
{
	public static void main(String[] args) throws Exception{

		File dir = new File("H:/张孝祥 java/");
		showDir(dir);
	}

	public static void showDir(File file)throws Exception{
		File [] files = file.listFiles();
		for (int x=0;x<files.length;x++) {
			if (files[x].isDirectory()) {
				showDir(files[x]);
				
			}else{

				writeVideo(files[x]);	
			}
		}
	}

	public static void writeVideo(File file) throws Exception{
		FileInputStream fis = new FileInputStream(file);
		FileOutputStream fos = new FileOutputStream("H:/张孝祥 java/"+file.getName());
		byte[] buf = new byte[1024];
		int len = 0;
		while ((len = fis.read(buf))!=-1) {
			fos.write(buf,0,len);
			fos.flush();
		}
	}

}

Properties:

Properties 继承于 Hashtable;建流的时候用字节流

getProperty(String key) ;

setProperty(String key, String value) ;

stringPropertyNames(); 返回Set集合包含属性列表中的键集;

load(InputStream inStream) ;

list(PrintStream out) ;

store(OutputStream out, String comments); 将信息写入流中存在文件上


打印流:

该流提供了打印方法,可以将各种数据类型的数据都原样打印。


字节打印流:PrintStream

PrintStream(OutputStream out, boolean autoFlush);true就可以自动刷新

构造函数可以接收的参数类型:
1,file对象。File
2,字符串路径。String
3,字节输出流。OutputStream


字符打印流:PrintWriter

构造函数可以接收的参数类型:
1,file对象。File
2,字符串路径。String
3,字节输出流。OutputStream
4,字符输出流,Writer。


SequenceInputStream

将多个流合并成一个流输出

/*
将多个输入流合并成一个输入流 SequenceInputStream;


*/
import java.io.*;
import java.util.*;
class SequenceDemo
{
	public static void main(String [] args) throws IOException

	{
		Vector<FileInputStream> v = new Vector<FileInputStream>();

		v.add(new FileInputStream("1.txt"));
		v.add(new FileInputStream("2.txt"));
		v.add(new FileInputStream("3.txt"));

		Enumeration<FileInputStream> en = v.elements();

		SequenceInputStream sis = new SequenceInputStream(en);

		FileOutputStream fos = new FileOutputStream("4.txt");

		byte[] buf = new byte[1024];

		int len = 0;
		while((len = sis.read(buf))!=-1)
		{
			fos.write(buf,0,len);
		}

		fos.close();
		sis.close();


	}
} 

ObjectOutputStream  

对象序列化 实现Serializable接口;

其实就是建立一个类保存这个类对象的数据能存能取;将obj写出成文件,在读取加载。必须成对使用



PipedInputStream 和PipedOutputStream 管道流;

涉及到多线程,单线程容易死锁。

import java.io.*;

class Read implements Runnable
{
	private PipedInputStream in;
	Read(PipedInputStream in)
	{
		this.in=in;
	}
	public void run()
	{
		try
		{
			byte[] buf = new byte[1024];
			int len = in.read(buf);
			String s = new String (buf,0,len);
			System.out.println(s);
			in.close();
		}
		catch(IOException e)
		{
			throw new RuntimeException("管道读取失败");
		}
	}
}

class Write implements Runnable
{
	private PipedOutputStream out;
	Write(PipedOutputStream out)
	{
		this.out = out;
	}
	public void run()
	{
		try
		{
			out.write("piped lai le".getBytes());
			out.close();
		}
		catch(Exception e)
		{
			throw new RuntimeException("管道输出流失败");
		}
	}
}

class PipesStreamDemo
{
	public static void main(String [] args) throws  IOException
	{
		PipedInputStream in = new PipedInputStream();
		PipedOutputStream out =new PipedOutputStream();
		in.connect(out);

		Read r = new Read(in);
		Write w = new Write(out);

		new Thread(r).start();
		new Thread(w).start();
	}
}

RandowAccessFile  

随机访问文件,该类不是算是IO体系中子类。而是直接继承自Object。但是它是IO包中成员。因为它具备读和写功能。内部封装了一个数组,而且通过指针对数组的元素进行操作。可以通过getFilePointer获取指针位置,同时可以通过seek改变指针的位置。其实完成读写的原理就是内部封装了字节输入流和输出流。通过构造函数可以看出,该类只能操作文件。而且操作文件还有模式:只读r,,读写rw等。

如果模式为只读 r。不会创建文件。会去读取一个已存在文件,如果该文件不存在,则会出现异常。
如果模式rw。操作的文件不存在,会自动创建。如果存则不会覆盖。


DataInputStream与DataOutputStream

可以用于操作基本数据类型的数据的流对象。直接读写各种数据类型的数据。


编码:

编码:字符串变成字节数组。s.getBytes(“编码”);
解码:字节数组变成字符串。new String(s.getBytes(),“编码”);

注意:
1、服务器中的GBK数据过去,如果iso8859-1不能正确解码,就返编码后用GBK解码。
2、GBK和UTF-8不能互相编译,编译错不能反编码,因为都支持中文。
3、GBK中的数据编码后有可能和UTF-8相同导致被UTF-8解码。比如“联通”。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值