"黑马程序员”IO流的学习日志01

来源:互联网 发布:长歌正太捏脸数据 编辑:程序博客网 时间:2024/06/06 11:03

----------------- android培训java培训、期待与您交流! ----------------------


 一  IO分类的小结:

文件: FileInputStream, FileOutputStream, FileReader, FileWrite

byte[]:ByteArrayInputStream, ByteArrayOutputStream

Char[]: CharArrayReader, CharArrayWriter

String: StringBufferInputStream, StringReader, StringWriter

网络数据流:InputStream, OutputStream, Reader, Writer

格式化输出:PrintStream, PrintWriter
缓冲:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter

输入:Reader, InputStream类型的子类

输出:Writer, OutputStream类型的子类

从Stream到Reader,Writer的转换类:InputStreamReader, OutputStreamWriter(一般用于装饰者模式)

对象输入输出:ObjectInputStream, ObjectOutputStream

线程间通信:PipeInputStream, PipeOutputStream, PipeReader, PipeWriter(一般单线程不会使用)

合并输入:SequenceInputStream

更特殊的需要:PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader

Java中有三种基本类型的节点:文件(file)、内存(memory)、管道(pipe)。

二、关于流的区别

java.io.Reader 和 java.io.InputStream 组成了 Java 输入类。Reader 用于读入16位字符,也就是 Unicode 编码的字符;而 InputStream 用于读入 ASCII 字符和二进制数据。
在 Java 中,有不同类型的 Reader 输入流对应于不同的数据源:
FileReader 用于从文件输入;
CharArrayReader 用于从程序中的字符数组输入;
StringReader 用于从程序中的字符串输入;
PipedReader 用于读取从另一个线程中的 PipedWriter 写入管道的数据。
相 应的也有不同类型的 InputStream 输入流对应于不同的数据 源:FileInputStream,ByteArrayInputStream,StringBufferInputStream,PipedInputStream。 另外,还有两种没有对应 Reader 类型的 InputStream 输入流:


1.JAVA字节流

 字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节, 操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是 音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点. 
     所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列. 
      字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 2. 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。

InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream); 
//字节流转换成InputStreamReader 
BufferedReader bufferedReader = new BufferedReader(inputSteamReader); 
//InputStreamReader 转换成带缓存的bufferedReader 

写入文件 从字节流输出到字符流输出 
FileOutputStream fileOutputStream = new FileOutputStream("d:/text.txt"); //定义一个 指向D:/TEXT.TXT文件 
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream); 
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter); 
bufferedWriter.write(s); 

bufferedWriter.close(); 
outputStreamWriter.close(); 
fileOutputStream.close(); 

2.JAVA字符流

2.1、InputStreamReader 和 OutputStreamWriter
用于字节流与字符流之间的转换接口。
当你构造一个InputStreamReader或OutputStreamWriter时,转换规则定义了16位Unicode和其它平台的特定表示之间的转换。
InputStreamReader从一个数据源读取字节,并自动将其转换成Unicode字符。
如果你特别声明,InputStreamReade会将字节流转换成其它种类的字符流。
OutputStreamWriter将字符的Unicode编码写到输出流,如果你的使用的不是Unicode字符,OutputStreamWriter会将你的字符编码转换成Unicode编码。
2.2.、缓冲读者和作者
因为在各种格式之间进行转换和其它I/O操作很类似,所以在处理大块数据时效率最高。
在InputStreamReader和OutputStreamWriter的结尾链接一个BufferedReader和BufferedWriter是一个好主意。
记住对BufferedWriter使用flush()方法。
2.3、 使用其它字符转换
如果你需要从一个非本地(例如,从连接到一个不同类型的机器的网络连接读取)的字符编码读取输入,
你可以象下面这个程序那样,使用显式的字符编码构造ir=new InputStreamReader(System.in,  “8859_1″);
注:如果你通过网络连接读取字符,就应该使用这种形式。
否则,你的程序会总是试图将所读取的字符当作本地表示来进行转换,而这并不总是正确的。ISO 8859-1是映射到ASCII的


Latin-1编码模式。

mport java.io.*;
public class demo{
  public static void main(String[] args) {
    BufferedReader in =
      new BufferedReader(
        new InputStreamReader(System.in));
    String s;
    try {
      while((s = in.readLine()).length() != 0)
        System.out.println(s);
      // An empty line terminates the program
    } catch(IOException e) {
      e.printStackTrace();
    }
  }

}
 将字符串转化为字节流#region 将字符串转化为字节流
          public static byte[] String2Bytes(string strSource) 
        { 
            System.IO.MemoryStream   memoryStream=new   System.IO.MemoryStream();   
            System.IO.BinaryWriter   binaryWriter=new   System.IO.BinaryWriter(memoryStream);   
            binaryWriter.Write( strSource ); 
            byte[]   buffer=memoryStream.GetBuffer(); 
            return buffer;    
        } 
        将字节流转化为字符串#region 将字节流转化为字符串 
               public static string Bytes2String(byte[] bytData) 
        { 
            //字节流->字符串   
            System.IO.MemoryStream   memoryStream2 = new   System.IO.MemoryStream(bytData);   
            System.IO.BinaryReader   binaryReader = new   System.IO.BinaryReader(memoryStream2);   
            string   s2=binaryReader.ReadString();   
            return s2; 
        } 
 以下是我在做android时对IO的使用
package com.udroid.utils;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.os.Environment;
public class FileUtils 
{
private String sdCardPath=null;
private int FILESIZE=4*1024;
public String getPath()
{
return sdCardPath;
}
public FileUtils()
{
sdCardPath = Environment.getExternalStorageDirectory()+"\\";
}
//在sdcard卡上创建文件
public File createSdFile(String fileName) throws IOException
{
File file = new File(sdCardPath+fileName);
file.createNewFile();
return file;
}
//在sdcard上创建目录
public File createSdDir(String dirName) throws IOException
{
File file = new File(sdCardPath+dirName);
file.mkdir();
return file;
}
//判断文件是否存在
public boolean isFileExist(String fileName)
{
//通过路径和具体的文件名得到一个能够表示当前这个文件的File对象
File file = new File(sdCardPath+fileName);
//返回当前的文件是否存在
return file.exists();
}



//写入sdcard

public File writeSdCardFile(String Path,String Name,InputStream input) throws IOException
{
File file = null;
OutputStream output = null;
createSdDir(Path);
file=this.createSdFile(Path+Name);
//开始写数据
output = new FileOutputStream(file);
//操作字节流
byte[] buffer = new byte[2*1024];
while(input.read(buffer)!=-1)
{
output.write(buffer);
output.flush();
}
output.close();
return file;
}
}
package com.udroid.utils;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;


public class HttpDownLoader {
private URL url = null;
//http ftp
//1创建url对象
//2通过这个url对象,创建一个HttpURLConnection对象
//3得到一个input对象
//4从input对象中取数据
//throws IOException
public String downLoad(String strUrl) 
{
StringBuffer sb = new StringBuffer();

String line = null;
BufferedReader br = null;
//使用io 必须要有try catch
try
{
url = new URL(strUrl);
//创建http对象
//用http对象得到连接

//通过给定的URL对象,打开一个http协议的连接并获取这个对象
//www.udroid.cn

//读书数据

//装饰者设计模式
//二进制,字节流,字符流,Buffer缓冲区                          
//InputStream,OutputStream 输入输出的字节流
//InputStreamReader,OutputStreamReader 输入输出的字符流
//BufferedReader 字符串缓冲区,接受一个完整的 字符流对象,讲这个字符流对象里的内容,存放到字符串缓冲区
//hrc.getInputStream()返回字节流对象,只能疑问字节流的形式返回要下载的文本的内容
//InputStreamReader 字符流
//装饰者模式,,按照给定的数据类型从小到大 的装载数据
//分支1:装载到当前最大为止
//分支2:装载的所有最大为止
HttpURLConnection hrc = (HttpURLConnection)url.openConnection();
InputStream is=hrc.getInputStream();

InputStreamReader ir = new InputStreamReader(is,"UTF-8");

br = new BufferedReader(ir);

//br = new BufferedReader(new InputStreamReader(Get(url),"UTF-8"));
while((line=br.readLine())!=null)
{
sb.append(line+"\n");
//output+=line+"\n";
//System.out.println(line);
}
//BufferedReader使用完后关闭
//is.close();
//ir.close();
//br1.close();
br.close();
}
catch(IOException e)
{
e.printStackTrace();
}


return sb.toString();
}
//统一获取由http地址里文件内容的InputStream
public InputStream Get(URL url) throws IOException
{
HttpURLConnection hrc = (HttpURLConnection)url.openConnection();
return hrc.getInputStream();

}
//参数1:完整的url地址
//参数2:在sd卡上创建的文件路径
//参数2:下载好的文件的命名


///得到一个url对象,并打开连接
//得到一个inputstream
//1:得到sdcard在手机中的盘符
//2:得到你想要存储的路径
//3:判断在该路径下 。没有重复的文件
//4:在手机潘福中,创建一个目录
//5:在该目录下 ,创建文件
//6:往该文件中写入数据
public int fileDownLoad(String str_url,String Path,String Name) throws Exception
{
url = new URL(str_url);

int count = -1;
FileUtils fu = new FileUtils();

if(fu.isFileExist(Path+Name))
{
count = 1;
System.out.println("文件存在");
}
else
{
HttpURLConnection hrc = (HttpURLConnection)url.openConnection();
InputStream input =hrc.getInputStream();

File f = new File("");
File file =  fu.writeSdCardFile(Path, Name, input);
if(file==null)
{
count=-1;
}
}
count = 0;
return count;
       }
}
  

    ---------------------- android培训java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima