java bytearrayoutputstream(FastByteArrayOutputStream)
大家好,今天来为大家解答java bytearrayoutputstream这个问题的一些问题点,包括FastByteArrayOutputStream也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
java 输入输出流 (被采纳为答案者加100分)
其中BufferedInputStream是FileInputStream的子类,你可以理解成同样处理一个文件,BufferedInputStream效率更高,原因是BufferedInputStream采用了更高效的字节流处理方式,
BufferedInputStream才用缓冲流把内在的缓冲器连接到I/O流,允许java程序对多个字节同时操作,这样就提高了效率。
inputstreamreader的构造函数带两个参数,一是关联到的文件,二是字符解码方式.所以实际上通过inputstreamreader实例读出来的东西已经不是磁盘上原始的字节数据了,而是根据你指定的解码方式(如果你没有指定,则使用系统缺省的,win2000下是gbk/gb2312)把字节流转换成了字符流,注意字节流和字符流的区别,一个字节就是8比特位(32位机器上),而一个字符含多少字节则与不同的编码/解码方式有关了,如gbk是一字节,utf-8是1-3的变长字节,utf-16是2个定长字节.
于是值得你注意的就是当你用inputstreamreader读文件时,你应该知道该文件被存储时是用什么方式编码的,否则你指定错了解码方式,读出来的就是乱码.但是退一步来说,在全英文环境下,问题也没这严重.因为所有的字符集在前七位上都是与ascii兼容的(我猜的,也许有的不是),然而当你的程序涉及中文字符时,肯定是会出错了.
那么fileinputstream的特点呢?它的构造函数就一个,即关联到的文件,既然没有指定解码方式,那它所做的就是只以字节流的方式读出文件而不做任何处理,你应该用一个字节数组来接受它,对该数组你以后还可以做任何想做的操作。
给你个例子,自己去测试
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.*;
public class test{
/* public static void main(String[] args){
String str=new String("Face recognition in the thermal infrared domain has received relatively little attention in the literature in comparison with recognition in visible-spectrum imagery");
StringTokenizer token=new StringTokenizer(str);
Hashtable ht=new Hashtable();
while(token.hasMoreTokens()){
String temp=new String(token.nextToken());
ht.put(temp,temp);
}
Enumeration en=ht.keys();
while(en.hasMoreElements()){
Object obj=en.nextElement();
System.out.print("KEY_NO:"+obj);
System.out.println("="+ht.get(obj));
}
}
*/
public static void main(String[] args){
try{
String file1="d:\\1.doc";
String file2="d:\\2.doc";
copyFile(file1,file2);
readFile(file2);
//fileCheck("d:\\test1.txt");
// readFile("D:\\test1.txt");
// readFileByte("D:\\test1.txt");
// readFileByFile("D:\\test1.txt");
} catch(IOException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void testFile() throws IOException{
copyFile("D:\\test1.txt","D:\\test2.txt");
}
public static void copyFile(String inName,String outName) throws IOException
{
File tmp= new File(outName);
if(!tmp.canRead())tmp.createNewFile();
BufferedInputStream in= new BufferedInputStream(new FileInputStream(inName));
BufferedOutputStream out= new BufferedOutputStream(new FileOutputStream(outName));
copyFile(in,out,true);
}
public static void readFile(String inName) throws IOException
{
BufferedReader read= new BufferedReader(new InputStreamReader(new FileInputStream(inName)));
String b;
while((b=read.readLine())!=null)
print( b);
}
public static void readFileByte(String inName) throws IOException
{
BufferedInputStream read= new BufferedInputStream(new FileInputStream(inName));
int b= 0;
while((b=read.read())!=-1)
System.out.print((char)b);
}
public static void readFileByFile(String name) throws IOException
{
File tmp= new File(name);
FileReader fr= new FileReader(tmp);
BufferedReader br= new BufferedReader(fr);
String b;
while((b=br.readLine())!=null)
print(b);
}
public static void copyFile(InputStream in,OutputStream out, boolean close) throws IOException{
int b;
while((b=in.read())!=-1)
{
out.write(b);
}
in.close();
if(close)
out.close();
}
public static void print(Object o)
{
System.out.println(o);
}
public static void fileCheck(String name) throws IOException
{
print("---"+name+"---");
File f= new File(name);
if(!f.exists())
{
print("fle not exist!");
return;
}
print("Canonical name:"+f.getCanonicalPath());
String p= f.getParent();
if(p!=null)
print("Parent directory:"+p);
if(f.canRead())print("file can be read!");
if(f.canWrite())print("file can be writable!");
Date d= new Date();
d.setTime(f.lastModified());
print("last modified time:"+d);
if(f.isFile())
{
print("file size is:"+f.length()+" bytes");
}else if(f.isDirectory()){print("is a directry!");}
else{
print("neither a directory or a file!");
}
print("");
}
}
在java中,如何将utf8 十六进制编码转换成汉字
当在基于HTTP协议的JSP或Servlet的应用中获取数据或发送请求时,JVM会把输送的数据编码成UTF8格式。如果我们直接从HTTP流中提取中文数据,提取的结果为“????”(可能更多问号),为转换成我们能够理解的中文字符,我们需要把UTF8转换成GB2312,借助ISO-8859-1标准编码能够轻易的实现,下面的代码实现了这一功能:
byte [] b;
String utf8_value;
utf8_value= request.getParameter("NAME");//从HTTP流中取"NAME"的UTF8数据
b= utf8_value.getBytes("8859_1");//中间用ISO-8859-1过渡
String name= new String(b,"GB2312");//转换成GB2312字符
在知道流长度的情况下将输入流转换成字节数组 Java中的输入流抽象类InputStream有int read(byte[] b, int off, int len)方法,参数中byte[] b是用来存放从InputStream中读取的数据,int off指定数组b的偏移地址,也就是数组b的起始下标,int len指定需要读取的长度,方法返回实际读取的字节数。
下面的代码实现了这一功能:
ServletInputStream inStream= request.getInputStream();//取HTTP请求流
int size= request.getContentLength();//取HTTP请求流长度
byte[] buffer= new byte[size];//用于缓存每次读取的数据
byte[] in_b= new byte[size];//用于存放结果的数组
int count= 0;
int rbyte= 0;
while(count< size){
//循环读取
rbyte= inStream.read(buffer);//每次实际读取长度存于rbyte中
for(int i=0;i<rbyte;i++){
in_b[count+ i]= buffer[i];
}
count+= rbyte;
}
在不知道流长度的情况下将输入流转换成字节数组前面介绍了已知流长度的情况下的转换方法,那么当我们不知道流有多长时,也就是说不能确定转换后的字节数组有多大时,该怎么处理呢?笔者查看了JDK文档之后发现ByteArrayOutputStream有一个byte[] toByteArray()方法,该方法会自动创建一个字节数组,然后返回。于是就巧妙的用ByteArrayOutputStream来作中间过渡实现转换,其它处理跟上面所介绍已知长度的情况差不多。假设需要被转换的流已经放在inStream里了,我们可以用如下的代码实现这一功能:
ByteArrayOutputStream swapStream= new ByteArrayOutputStream();
byte[] buff= new byte[100];//buff用于存放循环读取的临时数据
int rc= 0;
while((rc= inStream.read(buff, 0, 100))> 0){
swapStream.write(buff, 0, rc);
}
byte[] in_b= swapStream.toByteArray();//in_b为转换之后的结果
你试着改写成自己需要的代码
java.io的Java流输入输出原理
Java把这些不同来源和目标的数据都统一抽象为数据流。Java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为你往往需要包装许多不同的对象。
在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流。按流向分:
输入流:程序可以从中读取数据的流。
输出流:程序能向其中写入数据的流。
按数据传输单位分:
字节流:以字节为单位传输数据的流
字符流:以字符为单位传输数据的流
按功能分:
节点流:用于直接操作目标设备的流
过滤流:是对一个已存在的流的链接和封装,通过对数据进行处理为程序提供功能强大、灵活的读写功能。 JDK所提供的所有流类位于java.io包中,都分别继承自以下四种抽象流类。
InputStream:继承自InputStream的流都是用于向程序中输入数据的,且数据单位都是字节(8位)。
OutputStream:继承自OutputStream的流都是程序用于向外输出数据的,且数据单位都是字节(8位)。
Reader:继承自Reader的流都是用于向程序中输入数据的,且数据单位都是字符(16位)。
Writer:继承自Writer的流都是程序用于向外输出数据的,且数据单位都是字符(16位)。 BufferedInputStream BufferedInputStream为另一个输入流添加一些功能,即缓冲输入以及支持 mark和 reset方法的能力。 BufferedOutputStream该类实现缓冲的输出流。 BufferedReader从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 BufferedWriter将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 ByteArrayInputStream ByteArrayInputStream包含一个内部缓冲区,该缓冲区包含从流中读取的字节。 ByteArrayOutputStream此类实现了一个输出流,其中的数据被写入一个 byte数组。 CharArrayReader此类实现一个可用作字符输入流的字符缓冲区。 CharArrayWriter此类实现一个可用作 Writer的字符缓冲区。 Console此类包含多个方法,可访问与当前 Java虚拟机关联的基于字符的控制台设备(如果有)。 DataInputStream数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java数据类型。 DataOutputStream数据输出流允许应用程序以适当方式将基本 Java数据类型写入输出流中。 File文件和目录路径名的抽象表示形式。 FileDescriptor文件描述符类的实例用作与基础机器有关的某种结构的不透明句柄,该结构表示开放文件、开放套接字或者字节的另一个源或接收者。 FileInputStream FileInputStream从文件系统中的某个文件中获得输入字节。 FileOutputStream文件输出流是用于将数据写入 File或 FileDescriptor的输出流。 FilePermission此类表示对文件和目录的访问。 FileReader用来读取字符文件的便捷类。 FileWriter用来写入字符文件的便捷类。 FilterInputStream FilterInputStream包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。 FilterOutputStream此类是过滤输出流的所有类的超类。 FilterReader用于读取已过滤的字符流的抽象类。 FilterWriter用于写入已过滤的字符流的抽象类。 InputStream此抽象类是表示字节输入流的所有类的超类。 InputStreamReader InputStreamReader是字节流通向字符流的桥梁:它使用指定的 charset读取字节并将其解码为字符。 LineNumberInputStream已过时。此类错误假定字节能充分表示字符。
END,本文到此结束,如果可以帮助到大家,还望关注本站哦!