java datainputstream(Java中的 readInt() 方法)
大家好,今天来为大家分享java datainputstream的一些知识点,和Java中的 readInt() 方法的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
Java中的DataInputStream和DataOutputStream的作用
Java中输出流分为DataInputStream(数据输入流)和DataOutputStream(数据输出流):
DataOutputStream:数据输出流允许应用程序以适当方式将基本 Java数据类型写入输出流中。然后应用程序可以使用数据输入流将数据读入。
DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。对于多线程访问不一定是安全的。线程安全是可选的,它由此类方法的使用者负责。
数据操作流DataOutputStream和DataInputStream的使用
在io包中,提供了两个与平台无关的数据操作流:
数据输出流(DataOutputStream)
数据输入流(DataInputStream)
通常数据输出流会按照一定的格式将数据输出,再通过数据输入流按照一定的格式将数据读入。
例如:有如下的订单数据
如果要想使用数据操作流,则肯定要由用户自己制定数据的保存格式,必须按指定好的格式保存数据,才可以使用数据输入流将数据读取进来。
DataOutputStream:DataOutputStream是OutputStream的子类,此类的定义如下:
public class DataOutputStream extends FilterOutputStream implements DataOutput
此类继承自FilterOutputStream类(FilterOutputStream是OutputStream的子类)同时实现了DataOutput接口,在DataOutput接口中定义了一系列的写入各种数据的方法。writeXxx()
要想使用DataOutputStream写入数据的话,则必须指定好数据的输出格式。
数据的写入格式:
以上每条数据之间使用"
"分隔,每条数据中的每个内容之间使用"\t"分隔。如下图所示:
[java] view plain copy
<embed id="ZeroClipboardMovie_1" src="" loop="false" menu="false" quality="best" bgcolor="#ffffff" name="ZeroClipboardMovie_1" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="" flashvars="id=1&width=16&height=16" wmode="transparent" width="16" height="16" align="middle">
使用DataOutputStream写入的数据要使用DataInputStream读取进来。
[java] view plain copy
<embed id="ZeroClipboardMovie_2" src="" loop="false" menu="false" quality="best" bgcolor="#ffffff" name="ZeroClipboardMovie_2" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="" flashvars="id=2&width=16&height=16" wmode="transparent" width="16" height="16" align="middle">
5.2f表示的是总共的数字长度为5位,其中2位表示小数,3位表示整数。
有关java上传和File以及FileInputStream的区别
1:PostUploadInfo的js是页面<ai:fileupload标签自动加载的AIFileUpload.js里的方法
这里的ActionDocumentInfo.java注意与FtpUtilPro.java(它的一个upload方法有bug)的对比能
看出后者的bug.
从这个bug要看出File与FileInputStream的区别,File不属于流,它只是用来屏闭不同文件系统,用来统一
描述文件的实体BEAN,new File时给它传入文件名称或是路径,它就会去根据参数查找对应的文件属性然后封装
成实体。用来处理判断该路径是一个文件还是路径,文件或路径的权限,修改时间等等,路径的子路径list等等目录操作。
File不属于文件流,只能代表一个文件或是目录的路径名而已.
而FileInputStream关注的是文件的内容,是用来进行文件读写等操作的二进制流类。大多数情况下,构造FileInputStream
时传递一个File对象做参数,也可以直接传递String的文件路径。
这个容易混淆的问题在FTP时候很容易出现,因为客户端点击浏览本地文件后在上传时在服务器端如果直接把客户端的
文件名称拿到,然后用new File(“文件名称路径”),再用new InputStream(File)来上传到FTP的话,其实就是相当于服务器
端在服务器本地找File(“文件名称路径”),然后往FTP上传,这是错误的。我们希望的是上传客户端的文件,而不是
服务器端的文件,所以这里应该是直接用apache的FileItem.getInputStream的结果直接upload,如下:
InputStream fileIn= item.getInputStream();////如果直接写成这样new FileInputStream(filePath);就会出现在服务器本机找file上传的问题
//可以查看item.getInputStream()最后其实是从memoryOutputStream(内存里记忆的客户端文件流)来取流的句柄的。
以下是正确的实现
[code]
/**上传附件的时候调用
*@param request
*@param response
*@throws Exception
*/
public void doUpload(HttpServletRequest request, HttpServletResponse response) throws Exception{
CustomProperty cp= CustomProperty.getInstance();
try{
//调用apache控件上传文件,返回数组,第一个存放文件对象,第二个存放参数对象
Object obj[]= ApacheUploadTool.getUploadFileInfo(request);
List fileList=(List)obj[0];
Map paras=(Map)obj[1];
if(fileList== null|| fileList.size()==0){
cp.set("MESSAGE","找不到上传的文件");
return;
}
String aVirtualFileName="";
String newId="";
String newFileName="";
String aFileType="";
String docSize="";
String editMode= HttpUtil.getParameter(request,"edit_mode");
String objectId= HttpUtil.getParameter(request,"OBJECT_ID");
String busiType= HttpUtil.getParameter(request,"BUSI_TYPE");
//陈超调试修改添加的输出
// System.out.println("================"+editMode);
//保存附件信息
for(int i=0;i<fileList.size();i++){
FileItem item=(FileItem)fileList.get(i);
//获取文件流、文件名称
String fileName= fixFileName(item.getName());
IDocumentInfoSV idao= CommonService.getIDocumentInfoSV();
docSize= String.valueOf(item.getSize());
String codetype= String.valueOf(StaticValue.CFG_FTP_PATH_CODE);
String ftpPathName= BaseDataCodeAction.getCodeName(codetype, busiType);
if(null==ftpPathName||"".equals(ftpPathName)){
throw new Exception("没有该业务对应的FTP路径配置!");
}
//陈超调试的注释
// System.out.println("ftpPathName="+ftpPathName);
FtpUtil ftpUtil= new FtpUtil(ftpPathName);
// FtpUtilPro ftpUtil= new FtpUtilPro(ftpPathName);
//陈超添加的调试输出
// System.out.println("item=="+item);
// System.out.println("item.getInputStream()=="+item.getInputStream());
InputStream fileIn= item.getInputStream();//new FileInputStream(filePath);//如果直接写成这样就会出现在服务器本机找file上传的问题
//可以查看item.getInputStream()最后其实是从memoryOutputStream(内存里记忆的客户端文件流)来取流的句柄的。
//获取新的文件名,判断是否存在
IBODocumentInfoValue[] retValues= CommonService.getIDocumentInfoSV().queryDocumentInfoList(Long.parseLong(busiType), Long.parseLong(objectId));
for(int j=0;j<retValues.length;j++){
String docName= retValues[j].getDocumentName();
if(fileName.equals(docName)){
ExceptionUtil.throwBossException(83000015,new String[]{fileName});
}
}
newFileName= fileName;
if(editMode.equals("addNew")){
//陈超添加的调试输出
// ftpUtil.upload(fileName, fileIn,FtpUtil.BIN);
ftpUtil.upload(fileName, fileIn,FtpUtil.BIN);
}
else if(editMode.equals("modify")){
// System.out.println("================"+HttpUtil.getParameter(request,"DOCUMENT_ID"));
String oldId= HttpUtil.getParameter(request,"DOCUMENT_ID");
IBODocumentInfoValue acond= new BODocumentInfoBean();
acond.setDocumentId(Long.parseLong(oldId));
//陈超更改查询STATE为1
acond.setState(1);
IBODocumentInfoValue[] beanValues= idao.getDocumentInfo(acond,"",null);
if(null== beanValues|| beanValues.length==0){
throw new Exception("没有文档信息");
}
IBODocumentInfoValue beanValue= beanValues[0];
String oldFileName= beanValue.getDocumentName();
ftpUtil.upload(oldFileName, fileIn,FtpUtil.BIN);
}
if(i==0){
aVirtualFileName= newFileName;
}else{
aVirtualFileName= aVirtualFileName+","+ newFileName;
}
}
cp.set("IsOk","TRUE");
cp.set("MESSAGE","附件"+aVirtualFileName+"上传成功!");
cp.set("VIRTUAL_FILE_NAME_LIST", aVirtualFileName);
cp.set("DOCUMENT_ID", newId);
cp.set("DOCUMENT_SIZE", docSize);
} catch(Exception ex){
cp.set("IsOk","FALSE");
cp.set("MESSAGE",StaticValue.SYS_ERROR_INFO);
log.error(ex);
if(!ex.equals("")){
cp.set("MESSAGE",ExceptionUtil.getBossExceptionHint(ex));
}
}finally{
ApacheUploadTool.showFileUploadMsg(response,cp);
}
}
[/code]
附件是自己的ftp实现示例,和一些网上最简单的jsp上传的代码,也最能说明原理
关于本次java datainputstream和Java中的 readInt() 方法的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。