一 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();
2.JAVA字符流
outputStreamWriter.close();
fileOutputStream.close();
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;
}}
"黑马程序员”IO流的学习日志01
最新推荐文章于 2024-06-19 11:00:59 发布